/** Creates a correlation variable for the current input, and writes it into * a Holder. */ public HiveSubQRemoveRelBuilder variable(Holder<RexCorrelVariable> v) { v.set((RexCorrelVariable) getRexBuilder().makeCorrel(peek().getRowType(), cluster.createCorrel())); return this; }
/** Creates a correlation variable for the current input, and writes it into * a Holder. */ public HiveSubQRemoveRelBuilder variable(Holder<RexCorrelVariable> v) { v.set((RexCorrelVariable) getRexBuilder().makeCorrel(peek().getRowType(), cluster.createCorrel())); return this; }
protected RexNode convert(ExprNodeColumnDesc col) throws SemanticException { //if this is co-rrelated we need to make RexCorrelVariable(with id and type) // id and type should be retrieved from outerRR InputCtx ic = getInputCtx(col); if(ic == null) { // we have correlated column, build data type from outer rr RelDataType rowType = TypeConverter.getType(cluster, this.outerRR, null); if (this.outerNameToPosMap.get(col.getColumn()) == null) { throw new SemanticException(ErrorMsg.INVALID_COLUMN_NAME.getMsg(col.getColumn())); } int pos = this.outerNameToPosMap.get(col.getColumn()); CorrelationId colCorr = new CorrelationId(this.correlatedId); RexNode corExpr = cluster.getRexBuilder().makeCorrel(rowType, colCorr); return cluster.getRexBuilder().makeFieldAccess(corExpr, pos); } int pos = ic.hiveNameToPosMap.get(col.getColumn()); return cluster.getRexBuilder().makeInputRef( ic.calciteInpDataType.getFieldList().get(pos).getType(), pos + ic.offsetInCalciteSchema); }
public RexNode visitInputRef(RexInputRef inputRef) { final RelDataType leftRowType = left.getRowType(); final RexBuilder rexBuilder = getRexBuilder(); final int leftCount = leftRowType.getFieldCount(); if (inputRef.getIndex() < leftCount) { final RexNode v = rexBuilder.makeCorrel(leftRowType, id); return rexBuilder.makeFieldAccess(v, inputRef.getIndex()); } else { return rexBuilder.makeInputRef(right, inputRef.getIndex() - leftCount); } } }
public RexNode visitInputRef(RexInputRef inputRef) { final RelDataType leftRowType = left.getRowType(); final RexBuilder rexBuilder = getRexBuilder(); final int leftCount = leftRowType.getFieldCount(); if (inputRef.getIndex() < leftCount) { final RexNode v = rexBuilder.makeCorrel(leftRowType, id); return rexBuilder.makeFieldAccess(v, inputRef.getIndex()); } else { return rexBuilder.makeInputRef(right, inputRef.getIndex() - leftCount); } } }
protected RexNode convert(ExprNodeColumnDesc col) throws SemanticException { //if this is co-rrelated we need to make RexCorrelVariable(with id and type) // id and type should be retrieved from outerRR InputCtx ic = getInputCtx(col); if(ic == null) { // we have correlated column, build data type from outer rr RelDataType rowType = TypeConverter.getType(cluster, this.outerRR, null); if (this.outerNameToPosMap.get(col.getColumn()) == null) { throw new SemanticException(ErrorMsg.INVALID_COLUMN_NAME.getMsg(col.getColumn())); } int pos = this.outerNameToPosMap.get(col.getColumn()); CorrelationId colCorr = new CorrelationId(this.correlatedId); RexNode corExpr = cluster.getRexBuilder().makeCorrel(rowType, colCorr); return cluster.getRexBuilder().makeFieldAccess(corExpr, pos); } int pos = ic.hiveNameToPosMap.get(col.getColumn()); return cluster.getRexBuilder().makeInputRef( ic.calciteInpDataType.getFieldList().get(pos).getType(), pos + ic.offsetInCalciteSchema); }
@Override public RexNode visitCorrelVariable(RexCorrelVariable variable) { if (!alternateIds.contains(variable.id)) { return variable; } return builder.makeCorrel(variable.getType(), canonicalId); }
@Override public RexNode visitCorrelVariable(RexCorrelVariable variable) { if (!alternateIds.contains(variable.id)) { return variable; } return builder.makeCorrel(variable.getType(), canonicalId); }
/** Creates a correlation variable for the current input, and writes it into * a Holder. */ public RelBuilder variable(Holder<RexCorrelVariable> v) { v.set((RexCorrelVariable) getRexBuilder().makeCorrel(peek().getRowType(), cluster.createCorrel())); return this; }
/** Creates a correlation variable for the current input, and writes it into * a Holder. */ public RelBuilder variable(Holder<RexCorrelVariable> v) { v.set((RexCorrelVariable) getRexBuilder().makeCorrel(peek().getRowType(), cluster.createCorrel())); return this; }
public RexNode visitInputRef(RexInputRef inputRef) { final RelDataType leftRowType = left.getRowType(); final RexBuilder rexBuilder = getRexBuilder(); final int leftCount = leftRowType.getFieldCount(); if (inputRef.getIndex() < leftCount) { final RexNode v = rexBuilder.makeCorrel(leftRowType, id); return rexBuilder.makeFieldAccess(v, inputRef.getIndex()); } else { return rexBuilder.makeInputRef(right, inputRef.getIndex() - leftCount); } } }
public RexNode visitInputRef(RexInputRef inputRef) { final RelDataType leftRowType = left.getRowType(); final RexBuilder rexBuilder = getRexBuilder(); final int leftCount = leftRowType.getFieldCount(); if (inputRef.getIndex() < leftCount) { final RexNode v = rexBuilder.makeCorrel(leftRowType, id); return rexBuilder.makeFieldAccess(v, inputRef.getIndex()); } else { return rexBuilder.makeInputRef(right, inputRef.getIndex() - leftCount); } } }
@Override public Prel visitLateral(LateralJoinPrel prel, Boolean isRightOfLateral) throws RuntimeException { List<RelNode> children = Lists.newArrayList(); children.add(((Prel) prel.getInput(0)).accept(this, isRightOfLateral)); children.add(((Prel) prel.getInput(1)).accept(this, true)); if (!isRightOfLateral) { return (Prel) prel.copy(prel.getTraitSet(), children); } else { //Adjust the column numbering due to an additional column "$drill_implicit_field$" is added to the inputs. Map<Integer, Integer> requiredColsMap = new HashMap<>(); for (Integer corrColIndex : prel.getRequiredColumns()) { requiredColsMap.put(corrColIndex, corrColIndex + 1); } ImmutableBitSet requiredColumns = prel.getRequiredColumns().shift(1); CorrelationId corrId = prel.getCluster().createCorrel(); RexCorrelVariable updatedCorrel = (RexCorrelVariable) prel.getCluster().getRexBuilder().makeCorrel( children.get(0).getRowType(), corrId); RelNode rightChild = children.get(1).accept( new CorrelateVarReplacer( new ProjectCorrelateTransposeRule.RexFieldAccessReplacer(prel.getCorrelationId(), updatedCorrel, prel.getCluster().getRexBuilder(), requiredColsMap))); return (Prel) prel.copy(prel.getTraitSet(), children.get(0), rightChild, corrId, requiredColumns, prel.getJoinType()); } }
@Override public Prel visitUnnest(UnnestPrel prel, Void value) throws RuntimeException { Preconditions.checkArgument(registeredPrel != null && registeredPrel instanceof LateralJoinPrel); Preconditions.checkArgument(prel.getRowType().getFieldCount() == 1); RexBuilder builder = prel.getCluster().getRexBuilder(); LateralJoinPrel lateralJoinPrel = (LateralJoinPrel) getRegisteredPrel(); int correlationIndex = lateralJoinPrel.getRequiredColumns().nextSetBit(0); String correlationColumnName = lateralJoinPrel.getLeft().getRowType().getFieldNames().get(correlationIndex); RexNode corrRef = builder.makeCorrel(lateralJoinPrel.getLeft().getRowType(), lateralJoinPrel.getCorrelationId()); RexNode fieldAccess = builder.makeFieldAccess(corrRef, correlationColumnName, false); List<String> fieldNames = new ArrayList<>(); List<RelDataType> fieldTypes = new ArrayList<>(); for (RelDataTypeField field : prel.getRowType().getFieldList()) { fieldNames.add(correlationColumnName); fieldTypes.add(field.getType()); } UnnestPrel unnestPrel = new UnnestPrel(prel.getCluster(), prel.getTraitSet(), prel.getCluster().getTypeFactory().createStructType(fieldTypes, fieldNames), fieldAccess); return unnestPrel; } }
protected RexNode handle(RexFieldAccess fieldAccess) { final RexCorrelVariable v = (RexCorrelVariable) fieldAccess.getReferenceExpr(); if (v.id.equals(correlation) && v.getType().getFieldCount() == mapping.getSourceCount()) { final int old = fieldAccess.getField().getIndex(); final int new_ = mapping.getTarget(old); final RelDataTypeFactory.Builder typeBuilder = relBuilder.getTypeFactory().builder(); for (int target : Util.range(mapping.getTargetCount())) { typeBuilder.add( v.getType().getFieldList().get(mapping.getSource(target))); } final RexNode newV = rexBuilder.makeCorrel(typeBuilder.build(), v.id); if (old != new_) { return rexBuilder.makeFieldAccess(newV, new_); } } return fieldAccess; } });
protected RexNode handle(RexFieldAccess fieldAccess) { final RexCorrelVariable v = (RexCorrelVariable) fieldAccess.getReferenceExpr(); if (v.id.equals(correlation) && v.getType().getFieldCount() == mapping.getSourceCount()) { final int old = fieldAccess.getField().getIndex(); final int new_ = mapping.getTarget(old); final RelDataTypeFactory.Builder typeBuilder = relBuilder.getTypeFactory().builder(); for (int target : Util.range(mapping.getTargetCount())) { typeBuilder.add( v.getType().getFieldList().get(mapping.getSource(target))); } final RexNode newV = rexBuilder.makeCorrel(typeBuilder.build(), v.id); if (old != new_) { return rexBuilder.makeFieldAccess(newV, new_); } } return fieldAccess; } });
@Test public void testProjectCorrelateTransposeRuleAntiCorrelate() { RelBuilder relBuilder = RelBuilder.create(RelBuilderTest.config().build()); RelNode left = relBuilder .values(new String[]{"f", "f2"}, "1", "2").build(); CorrelationId correlationId = new CorrelationId(0); RexNode rexCorrel = relBuilder.getRexBuilder().makeCorrel( left.getRowType(), correlationId); RelNode right = relBuilder .values(new String[]{"f3", "f4"}, "1", "2") .project(relBuilder.field(0), relBuilder.getRexBuilder().makeFieldAccess(rexCorrel, 0)).build(); LogicalCorrelate correlate = new LogicalCorrelate(left.getCluster(), left.getTraitSet(), left, right, correlationId, ImmutableBitSet.of(0), SemiJoinType.ANTI); relBuilder.push(correlate); RelNode relNode = relBuilder.project(relBuilder.field(0)) .build(); HepProgram program = new HepProgramBuilder() .addRuleInstance(ProjectCorrelateTransposeRule.INSTANCE) .build(); HepPlanner hepPlanner = new HepPlanner(program); hepPlanner.setRoot(relNode); RelNode output = hepPlanner.findBestExp(); final String planAfter = NL + RelOptUtil.toString(output); final DiffRepository diffRepos = getDiffRepos(); diffRepos.assertEquals("planAfter", "${planAfter}", planAfter); SqlToRelTestBase.assertValid(output); }
@Test public void testProjectCorrelateTransposeRuleAntiCorrelate() { RelBuilder relBuilder = RelBuilder.create(RelBuilderTest.config().build()); RelNode left = relBuilder .values(new String[]{"f", "f2"}, "1", "2").build(); CorrelationId correlationId = new CorrelationId(0); RexNode rexCorrel = relBuilder.getRexBuilder().makeCorrel( left.getRowType(), correlationId); RelNode right = relBuilder .values(new String[]{"f3", "f4"}, "1", "2") .project(relBuilder.field(0), relBuilder.getRexBuilder().makeFieldAccess(rexCorrel, 0)).build(); LogicalCorrelate correlate = new LogicalCorrelate(left.getCluster(), left.getTraitSet(), left, right, correlationId, ImmutableBitSet.of(0), SemiJoinType.ANTI); relBuilder.push(correlate); RelNode relNode = relBuilder.project(relBuilder.field(0)) .build(); HepProgram program = new HepProgramBuilder() .addRuleInstance(ProjectCorrelateTransposeRule.INSTANCE) .build(); HepPlanner hepPlanner = new HepPlanner(program); hepPlanner.setRoot(relNode); RelNode output = hepPlanner.findBestExp(); final String planAfter = NL + RelOptUtil.toString(output); final DiffRepository diffRepos = getDiffRepos(); diffRepos.assertEquals("planAfter", "${planAfter}", planAfter); SqlToRelTestBase.assertValid(output); }
relBuilder.getRexBuilder().makeCorrel( left.getRowType(), correlationId);
relBuilder.getRexBuilder().makeCorrel( left.getRowType(), correlationId);