if(correlate.getJoinType() != SemiJoinType.LEFT) { return; JoinRelType joinType = correlate.getJoinType().toJoinType(); LogicalCorrelate.create(leftInput, aggregate, correlate.getCorrelationId(), correlate.getRequiredColumns(), correlate.getJoinType()); if (cm.mapCorToCorRel.get(correlate.getCorrelationId()) == correlate) { cm.mapCorToCorRel.put(correlate.getCorrelationId(), newCorrelate);
@Override public RexNode visitInputRef(RexInputRef inputRef) { if (currentRel instanceof LogicalCorrelate) { // if this rel references corVar // and now it needs to be rewritten // it must have been pulled above the Correlator // replace the input ref to account for the LHS of the // Correlator final int leftInputFieldCount = ((LogicalCorrelate) currentRel).getLeft().getRowType() .getFieldCount(); RelDataType newType = inputRef.getType(); if (projectPulledAboveLeftCorrelator) { newType = typeFactory.createTypeWithNullability(newType, true); } int pos = inputRef.getIndex(); RexInputRef newInputRef = new RexInputRef(leftInputFieldCount + pos, newType); if ((isCount != null) && isCount.contains(pos)) { return createCaseExpression( newInputRef, rexBuilder.makeExactLiteral(BigDecimal.ZERO), newInputRef); } else { return newInputRef; } } return inputRef; }
final Project project = call.rel(3); RelNode right = call.rel(4); final RelOptCluster cluster = correlate.getCluster(); if(correlate.getJoinType() != SemiJoinType.LEFT) { return; final JoinRelType joinType = correlate.getJoinType().toJoinType();
@Override public RelNode visit(LogicalCorrelate correlate) { final RelNode left = correlate.getLeft().accept(this); final RelNode right = correlate.getRight().accept(this); return new LogicalCorrelate( cluster, copyOf(correlate.getTraitSet()), left, right, correlate.getCorrelationId(), correlate.getRequiredColumns(), correlate.getJoinType() ); }
final RelNode oldLeft = rel.getInput(0); final RelNode oldRight = rel.getInput(1); assert rel.getRequiredColumns().cardinality() <= rightFrame.corDefOutputs.keySet().size(); : new ArrayList<>(corDefOutputs.entrySet())) { final CorDef corDef = rightOutput.getKey(); if (!corDef.corr.equals(rel.getCorrelationId())) { continue; assert rel.getRowType().getFieldCount() == oldLeftFieldCount + oldRightFieldCount; RelNode newJoin = LogicalJoin.create(leftFrame.r, rightFrame.r, condition, ImmutableSet.<CorrelationId>of(), rel.getJoinType().toJoinType());
public void rewriteRel(LogicalCorrelate rel) { ImmutableBitSet.Builder newPos = ImmutableBitSet.builder(); for (int pos : rel.getRequiredColumns()) { RelDataType corrFieldType = rel.getLeft().getRowType().getFieldList().get(pos) .getType(); if (corrFieldType.isStruct()) { throw Util.needToImplement("correlation on structured type"); } newPos.set(getNewForOldInput(pos)); } LogicalCorrelate newRel = LogicalCorrelate.create(getNewForOldRel(rel.getLeft()), getNewForOldRel(rel.getRight()), rel.getCorrelationId(), newPos.build(), rel.getJoinType()); setNewForOldRel(rel, newRel); }
&& ((LogicalCorrelate) oldInput).getJoinType() == SemiJoinType.SEMI && !cm.mapRefRelToCorRef.containsKey(rel)) { && ((LogicalCorrelate) oldInput).getJoinType() == SemiJoinType.SEMI && !cm.mapRefRelToCorRef.containsKey(rel)) { final RelNode oldLeft = rel.getInput(0); final RelNode oldRight = rel.getInput(1); assert rel.getRequiredColumns().cardinality() <= rightFrame.corDefOutputs.keySet().size(); : new ArrayList<>(corDefOutputs.entrySet())) { final CorDef corDef = rightOutput.getKey(); if (!corDef.corr.equals(rel.getCorrelationId())) { continue; if(rel.getJoinType() == SemiJoinType.SEMI) { final List<Integer> leftKeys = new ArrayList<Integer>(); final List<Integer> rightKeys = new ArrayList<Integer>(); newJoin = HiveSemiJoin.getSemiJoin(rel.getCluster(), rel.getCluster().traitSetOf(HiveRelNode.CONVENTION), leftFrame.r, rightFrame.r, condition, ImmutableIntList.copyOf(leftKeys), ImmutableIntList.copyOf(rightKeys)); .join(rel.getJoinType().toJoinType(), condition).build();
@Override public RelNode visit(LogicalCorrelate correlate) { RelNode left = correlate.getLeft().accept(this); leftInputs.put(correlate.getCorrelationId(), left); RelNode right = correlate.getRight().accept(this); if (correlate.getRight() == right || left == leftInputs.get(correlate.getCorrelationId())) { if (correlate.getLeft() == left) { return correlate; return correlate.copy(correlate.getTraitSet(), Arrays.asList(left, right)); Correlate newCorrelate = correlate.copy(correlate.getTraitSet(), leftInputs.get(correlate.getCorrelationId()), right, updatedCorrelationIds.get(correlate.getCorrelationId()), ImmutableBitSet.of(left.getRowType().getFieldCount()), correlate.getJoinType()); RelBuilder builder = DrillRelFactories.LOGICAL_BUILDER.create(correlate.getCluster(), null); builder.push(newCorrelate); switch (correlate.getJoinType()) { case LEFT: case INNER: builder.project(topProjectExpressions, correlate.getRowType().getFieldNames());
/** * Remove correlated variables from the tree at root corRel. * * @param correlate Correlator */ private void removeCorVarFromTree(LogicalCorrelate correlate) { if (cm.mapCorToCorRel.get(correlate.getCorrelationId()) == correlate) { cm.mapCorToCorRel.remove(correlate.getCorrelationId()); } }
public RelNode createCorrelate(RelNode left, RelNode right, CorrelationId correlationId, ImmutableBitSet requiredColumns, SemiJoinType joinType) { return LogicalCorrelate.create(left, right, correlationId, requiredColumns, joinType); } }
@Override public LogicalCorrelate copy(RelTraitSet traitSet, RelNode left, RelNode right, CorrelationId correlationId, ImmutableBitSet requiredColumns, SemiJoinType joinType) { assert traitSet.containsIfApplicable(Convention.NONE); return new LogicalCorrelate(getCluster(), traitSet, left, right, correlationId, requiredColumns, joinType); }
/** Creates a LogicalCorrelate. */ public static LogicalCorrelate create(RelNode left, RelNode right, CorrelationId correlationId, ImmutableBitSet requiredColumns, SemiJoinType joinType) { final RelOptCluster cluster = left.getCluster(); final RelTraitSet traitSet = cluster.traitSetOf(Convention.NONE); return new LogicalCorrelate(cluster, traitSet, left, right, correlationId, requiredColumns, joinType); }
public RelNode convert(RelNode rel) { final LogicalCorrelate c = (LogicalCorrelate) rel; final RelTraitSet traitSet = c.getTraitSet().replace(EnumerableConvention.INSTANCE); return new EnumerableCorrelate( rel.getCluster(), traitSet, convert(c.getLeft(), c.getLeft().getTraitSet() .replace(EnumerableConvention.INSTANCE)), convert(c.getRight(), c.getRight().getTraitSet() .replace(EnumerableConvention.INSTANCE)), c.getCorrelationId(), c.getRequiredColumns(), c.getJoinType()); } }
final RelNode oldLeft = rel.getInput(0); final RelNode oldRight = rel.getInput(1); assert rel.getRequiredColumns().cardinality() <= rightFrame.corDefOutputs.keySet().size(); : new ArrayList<>(corDefOutputs.entrySet())) { final CorDef corDef = rightOutput.getKey(); if (!corDef.corr.equals(rel.getCorrelationId())) { continue; assert rel.getRowType().getFieldCount() == oldLeftFieldCount + oldRightFieldCount; RelNode newJoin = LogicalJoin.create(leftFrame.r, rightFrame.r, condition, ImmutableSet.of(), rel.getJoinType().toJoinType());
public void rewriteRel(LogicalCorrelate rel) { ImmutableBitSet.Builder newPos = ImmutableBitSet.builder(); for (int pos : rel.getRequiredColumns()) { RelDataType corrFieldType = rel.getLeft().getRowType().getFieldList().get(pos) .getType(); if (corrFieldType.isStruct()) { throw Util.needToImplement("correlation on structured type"); } newPos.set(getNewForOldInput(pos)); } LogicalCorrelate newRel = LogicalCorrelate.create(getNewForOldRel(rel.getLeft()), getNewForOldRel(rel.getRight()), rel.getCorrelationId(), newPos.build(), rel.getJoinType()); setNewForOldRel(rel, newRel); }
/** * Remove correlated variables from the tree at root corRel * * @param correlate Correlator */ private void removeCorVarFromTree(LogicalCorrelate correlate) { if (cm.mapCorToCorRel.get(correlate.getCorrelationId()) == correlate) { cm.mapCorToCorRel.remove(correlate.getCorrelationId()); } }
public RelNode createCorrelate(RelNode left, RelNode right, CorrelationId correlationId, ImmutableBitSet requiredColumns, SemiJoinType joinType) { return LogicalCorrelate.create(left, right, correlationId, requiredColumns, joinType); } }
@Override public LogicalCorrelate copy(RelTraitSet traitSet, RelNode left, RelNode right, CorrelationId correlationId, ImmutableBitSet requiredColumns, SemiJoinType joinType) { assert traitSet.containsIfApplicable(Convention.NONE); return new LogicalCorrelate(getCluster(), traitSet, left, right, correlationId, requiredColumns, joinType); }
/** Creates a LogicalCorrelate. */ public static LogicalCorrelate create(RelNode left, RelNode right, CorrelationId correlationId, ImmutableBitSet requiredColumns, SemiJoinType joinType) { final RelOptCluster cluster = left.getCluster(); final RelTraitSet traitSet = cluster.traitSetOf(Convention.NONE); return new LogicalCorrelate(cluster, traitSet, left, right, correlationId, requiredColumns, joinType); }