@Override public RelNode copy(RelTraitSet traitSet, List<RelNode> inputs) { assert traitSet.containsIfApplicable(Convention.NONE); return new MultiJoin( getCluster(), inputs, joinFilter, rowType, isFullOuterJoin, outerJoinConditions, joinTypes, projFields, joinFieldRefCountsMap, postJoinFilter); }
@Override public RelNode copy(RelTraitSet traitSet, List<RelNode> inputs) { assert traitSet.containsIfApplicable(Convention.NONE); return new MultiJoin( getCluster(), inputs, joinFilter, rowType, isFullOuterJoin, outerJoinConditions, joinTypes, projFields, joinFieldRefCountsMap, postJoinFilter); }
public RelNode accept(RexShuttle shuttle) { RexNode joinFilter = shuttle.apply(this.joinFilter); List<RexNode> outerJoinConditions = shuttle.apply(this.outerJoinConditions); RexNode postJoinFilter = shuttle.apply(this.postJoinFilter); if (joinFilter == this.joinFilter && outerJoinConditions == this.outerJoinConditions && postJoinFilter == this.postJoinFilter) { return this; } return new MultiJoin( getCluster(), inputs, joinFilter, rowType, isFullOuterJoin, outerJoinConditions, joinTypes, projFields, joinFieldRefCountsMap, postJoinFilter); }
public RelNode accept(RexShuttle shuttle) { RexNode joinFilter = shuttle.apply(this.joinFilter); List<RexNode> outerJoinConditions = shuttle.apply(this.outerJoinConditions); RexNode postJoinFilter = shuttle.apply(this.postJoinFilter); if (joinFilter == this.joinFilter && outerJoinConditions == this.outerJoinConditions && postJoinFilter == this.postJoinFilter) { return this; } return new MultiJoin( getCluster(), inputs, joinFilter, rowType, isFullOuterJoin, outerJoinConditions, joinTypes, projFields, joinFieldRefCountsMap, postJoinFilter); }
factory = multiJoin.getCluster().getTypeFactory();
factory = multiJoin.getCluster().getTypeFactory();
: src.right.accept( new RelOptUtil.RexInputConverter( multiJoin.getCluster().getRexBuilder(), srcFields, destFields, adjustments))));
: src.right.accept( new RelOptUtil.RexInputConverter( multiJoin.getCluster().getRexBuilder(), srcFields, destFields, adjustments))));
multiJoin.getCluster(), multiJoin.getInputs(), multiJoin.getJoinFilter(),
multiJoin.getCluster(), multiJoin.getInputs(), multiJoin.getJoinFilter(),
public Double getRowCount(MultiJoin rel, RelMetadataQuery mq) { if (rel.getJoinFilter().isAlwaysTrue() && RexUtil.composeConjunction(rel.getCluster().getRexBuilder(), rel.getOuterJoinConditions(), false).isAlwaysTrue()) { double rowCount = 1; for (RelNode input : rel.getInputs()) { rowCount *= mq.getRowCount(input); } return rowCount; } else { double max = 1; for (RelNode input : rel.getInputs()) { max = Math.max(max, mq.getRowCount(input)); } return max; } }
List<RexNode> newProjExprs = new ArrayList<>(); RexBuilder rexBuilder = multiJoin.getMultiJoinRel().getCluster().getRexBuilder();
public void onMatch(RelOptRuleCall call) { LogicalFilter filter = call.rel(0); MultiJoin multiJoin = call.rel(1); MultiJoin newMultiJoin = new MultiJoin( multiJoin.getCluster(), multiJoin.getInputs(), multiJoin.getJoinFilter(), multiJoin.getRowType(), multiJoin.isFullOuterJoin(), multiJoin.getOuterJoinConditions(), multiJoin.getJoinTypes(), multiJoin.getProjFields(), multiJoin.getJoinFieldRefCountsMap(), filter.getCondition()); call.transformTo(newMultiJoin); } }
public void onMatch(RelOptRuleCall call) { LogicalFilter filter = call.rel(0); MultiJoin multiJoin = call.rel(1); MultiJoin newMultiJoin = new MultiJoin( multiJoin.getCluster(), multiJoin.getInputs(), multiJoin.getJoinFilter(), multiJoin.getRowType(), multiJoin.isFullOuterJoin(), multiJoin.getOuterJoinConditions(), multiJoin.getJoinTypes(), multiJoin.getProjFields(), multiJoin.getJoinFieldRefCountsMap(), filter.getCondition()); call.transformTo(newMultiJoin); } }
public void onMatch(RelOptRuleCall call) { final MultiJoin multiJoinRel = call.rel(0); final LoptMultiJoin multiJoin = new LoptMultiJoin(multiJoinRel); final RelMetadataQuery mq = call.getMetadataQuery(); findRemovableOuterJoins(mq, multiJoin); final RexBuilder rexBuilder = multiJoinRel.getCluster().getRexBuilder(); final LoptSemiJoinOptimizer semiJoinOpt = new LoptSemiJoinOptimizer(call.getMetadataQuery(), multiJoin, rexBuilder); // determine all possible semijoins semiJoinOpt.makePossibleSemiJoins(multiJoin); // select the optimal join filters for semijoin filtering by // iteratively calling chooseBestSemiJoin; chooseBestSemiJoin will // apply semijoins in sort order, based on the cost of scanning each // factor; as it selects semijoins to apply and iterates through the // loop, the cost of scanning a factor will decrease in accordance // with the semijoins selected int iterations = 0; do { if (!semiJoinOpt.chooseBestSemiJoin(multiJoin)) { break; } if (iterations++ > 10) { break; } } while (true); multiJoin.setFactorWeights(); findRemovableSelfJoins(mq, multiJoin); findBestOrderings(mq, call.builder(), multiJoin, semiJoinOpt, call); }
public void onMatch(RelOptRuleCall call) { final MultiJoin multiJoinRel = call.rel(0); final LoptMultiJoin multiJoin = new LoptMultiJoin(multiJoinRel); final RelMetadataQuery mq = call.getMetadataQuery(); findRemovableOuterJoins(mq, multiJoin); final RexBuilder rexBuilder = multiJoinRel.getCluster().getRexBuilder(); final LoptSemiJoinOptimizer semiJoinOpt = new LoptSemiJoinOptimizer(call.getMetadataQuery(), multiJoin, rexBuilder); // determine all possible semijoins semiJoinOpt.makePossibleSemiJoins(multiJoin); // select the optimal join filters for semijoin filtering by // iteratively calling chooseBestSemiJoin; chooseBestSemiJoin will // apply semijoins in sort order, based on the cost of scanning each // factor; as it selects semijoins to apply and iterates through the // loop, the cost of scanning a factor will decrease in accordance // with the semijoins selected int iterations = 0; do { if (!semiJoinOpt.chooseBestSemiJoin(multiJoin)) { break; } if (iterations++ > 10) { break; } } while (true); multiJoin.setFactorWeights(); findRemovableSelfJoins(mq, multiJoin); findBestOrderings(mq, call.builder(), multiJoin, semiJoinOpt, call); }
if (needsAdjustment(multiJoin, adjustments, left, right, false)) { RexBuilder rexBuilder = multiJoin.getMultiJoinRel().getCluster().getRexBuilder(); filterCond = filterCond.accept(
if (needsAdjustment(multiJoin, adjustments, left, right, false)) { RexBuilder rexBuilder = multiJoin.getMultiJoinRel().getCluster().getRexBuilder(); filterCond = filterCond.accept(
List<RexNode> joinFilterList) { RexBuilder rexBuilder = multiJoin.getMultiJoinRel().getCluster().getRexBuilder(); RelNode leftRel = multiJoin.getJoinFactor(leftFactor); RelNode rightRel = multiJoin.getJoinFactor(rightFactor);
List<RexNode> joinFilterList) { RexBuilder rexBuilder = multiJoin.getMultiJoinRel().getCluster().getRexBuilder(); RelNode leftRel = multiJoin.getJoinFactor(leftFactor); RelNode rightRel = multiJoin.getJoinFactor(rightFactor);