@Override public RelNode run( RelOptPlanner planner, RelNode rel, RelTraitSet requiredOutputTraits, List<RelOptMaterialization> materializations, List<RelOptLattice> lattices ) { final RelNode decorrelatedRel = RelDecorrelator.decorrelateQuery(rel); final RelBuilder relBuilder = RelFactories.LOGICAL_BUILDER.create(decorrelatedRel.getCluster(), null); return new RelFieldTrimmer(null, relBuilder).trim(decorrelatedRel); } }
Frame frame = getInvoke(oldInput, rel); if (frame == null) { frame = decorrelateInputWithValueGenerator(rel, frame); newPos, Pair.of( decorrelateExpr(currentRel, map, cm, oldProjects.get(newPos)), relOutput.get(newPos).getName())); mapOldToNewOutputs.put(newPos, newPos); .build(); return register(rel, newProject, mapOldToNewOutputs, corDefOutputs);
Frame frame = getInvoke(oldInput, rel); if (frame == null) { frame = maybeAddValueGenerator(rel, frame); .filter(decorrelateExpr(currentRel, map, cm2, rel.getCondition())); return register(rel, relBuilder.build(), frame.oldToNewOutputs, frame.corDefOutputs); final RelNode oldRight = rel.getInput(1); final Frame leftFrame = getInvoke(oldLeft, rel); final Frame rightFrame = getInvoke(oldRight, rel); ImmutableSet.of(), rel.getJoinType().toJoinType()); return register(rel, newJoin, mapOldToNewOutputs, corDefOutputs);
/** Decorrelates a query. * * <p>This is the main entry point to {@code RelDecorrelator}. * * @param rootRel Root node of the query * * @return Equivalent query with all * {@link org.apache.calcite.rel.logical.LogicalCorrelate} instances removed */ public static RelNode decorrelateQuery(RelNode rootRel) { final CorelMap corelMap = new CorelMapBuilder().build(rootRel); if (!corelMap.hasCorrelation()) { return rootRel; } final RelOptCluster cluster = rootRel.getCluster(); final RelDecorrelator decorrelator = new RelDecorrelator(cluster, corelMap, cluster.getPlanner().getContext()); RelNode newRootRel = decorrelator.removeCorrelationViaRule(rootRel); if (SQL2REL_LOGGER.isDebugEnabled()) { SQL2REL_LOGGER.debug( RelOptUtil.dumpPlan("Plan after removing Correlator", newRootRel, SqlExplainFormat.TEXT, SqlExplainLevel.EXPPLAN_ATTRIBUTES)); } if (!decorrelator.cm.mapCorToCorRel.isEmpty()) { newRootRel = decorrelator.decorrelate(newRootRel); } return newRootRel; }
findCorrelationEquivalent(correlation, ((Filter) rel).getCondition()); } catch (Util.FoundOne e) { if (e.getNode() instanceof RexInputRef) { r = oldInput; return register(rel.getInput(0), r, frame.oldToNewOutputs, map); createValueGenerator(corVarList, leftInputOutputCount, corDefOutputs); return register(rel.getInput(0), join, frame.oldToNewOutputs, corDefOutputs);
final RelNode oldRight = rel.getInput(1); final Frame leftFrame = getInvoke(oldLeft, rel); final Frame rightFrame = getInvoke(oldRight, rel); decorrelateExpr(currentRel, map, cm, rel.getCondition()), ImmutableSet.of(), rel.getJoinType()); entry.getValue() + newLeftFieldCount); return register(rel, newJoin, mapOldToNewOutputs, corDefOutputs);
private RelNode decorrelate(RelNode root) { final RelBuilderFactory f = relBuilderFactory(); HepProgram program = HepProgram.builder() .addRuleInstance(new AdjustProjectForCountAggregateRule(false, f)) .build(); HepPlanner planner = createPlanner(program); final Frame frame = getInvoke(root, null); if (frame != null) { .build(); final HepPlanner planner2 = createPlanner(program2); final RelNode newRoot = frame.r; planner2.setRoot(newRoot);
private RelNode decorrelate(RelNode root) { // first adjust count() expression if any HepProgram program = HepProgram.builder() .addRuleInstance(new AdjustProjectForCountAggregateRule(false)) .addRuleInstance(new AdjustProjectForCountAggregateRule(true)) .addRuleInstance(FilterJoinRule.FILTER_ON_JOIN) .addRuleInstance(FilterProjectTransposeRule.INSTANCE) .addRuleInstance(FilterCorrelateRule.INSTANCE) .build(); HepPlanner planner = createPlanner(program); planner.setRoot(root); root = planner.findBestExp(); // Perform decorrelation. map.clear(); final Frame frame = getInvoke(root, null); if (frame != null) { // has been rewritten; apply rules post-decorrelation final HepProgram program2 = HepProgram.builder() .addRuleInstance(FilterJoinRule.FILTER_ON_JOIN) .addRuleInstance(FilterJoinRule.JOIN) .build(); final HepPlanner planner2 = createPlanner(program2); final RelNode newRoot = frame.r; planner2.setRoot(newRoot); return planner2.findBestExp(); } return root; }
public RelNode removeCorrelationViaRule(RelNode root) { final RelBuilderFactory f = relBuilderFactory(); HepProgram program = HepProgram.builder() .addRuleInstance(new RemoveSingleAggregateRule(f)) .addRuleInstance(new RemoveCorrelationForScalarProjectRule(f)) .addRuleInstance(new RemoveCorrelationForScalarAggregateRule(f)) .build(); HepPlanner planner = createPlanner(program); planner.setRoot(root); return planner.findBestExp(); }
Frame(RelNode oldRel, RelNode r, SortedMap<CorDef, Integer> corDefOutputs, Map<Integer, Integer> oldToNewOutputs) { this.r = Objects.requireNonNull(r); this.corDefOutputs = ImmutableSortedMap.copyOf(corDefOutputs); this.oldToNewOutputs = ImmutableSortedMap.copyOf(oldToNewOutputs); assert allLessThan(this.corDefOutputs.values(), r.getRowType().getFieldCount(), Litmus.THROW); assert allLessThan(this.oldToNewOutputs.keySet(), oldRel.getRowType().getFieldCount(), Litmus.THROW); assert allLessThan(this.oldToNewOutputs.values(), r.getRowType().getFieldCount(), Litmus.THROW); } }
private HepPlanner createPlanner(HepProgram program) { // Create a planner with a hook to update the mapping tables when a // node is copied when it is registered. return new HepPlanner( program, context, true, createCopyHook(), RelOptCostImpl.FACTORY); }
public RelNode removeCorrelationViaRule(RelNode root) { HepProgram program = HepProgram.builder() .addRuleInstance(new RemoveSingleAggregateRule()) .addRuleInstance(new RemoveCorrelationForScalarProjectRule()) //.addRuleInstance(new RemoveCorrelationForScalarAggregateRule()) .build(); HepPlanner planner = createPlanner(program); planner.setRoot(root); return planner.findBestExp(); }
Frame frame = getInvoke(oldInput, rel); if (frame == null) { frame = decorrelateInputWithValueGenerator(rel, frame); newPos, Pair.of( decorrelateExpr(currentRel, map, cm, oldProjects.get(newPos)), relOutput.get(newPos).getName())); mapOldToNewOutputs.put(newPos, newPos); .build(); return register(rel, newProject, mapOldToNewOutputs, corDefOutputs);
Frame frame = getInvoke(oldInput, rel); if (frame == null) { frame = maybeAddValueGenerator(rel, frame); .filter(decorrelateExpr(currentRel, map, cm2, rel.getCondition())); return register(rel, relBuilder.build(), frame.oldToNewOutputs, frame.corDefOutputs); final RelNode oldRight = rel.getInput(1); final Frame leftFrame = getInvoke(oldLeft, rel); final Frame rightFrame = getInvoke(oldRight, rel); ImmutableSet.of(), rel.getJoinType().toJoinType()); return register(rel, newJoin, mapOldToNewOutputs, corDefOutputs);
new RelDecorrelator(corelMap, cluster.getPlanner().getContext(), relBuilder); RelNode newRootRel = decorrelator.removeCorrelationViaRule(rootRel); newRootRel = decorrelator.decorrelate(newRootRel);
findCorrelationEquivalent(correlation, ((Filter) rel).getCondition()); } catch (Util.FoundOne e) { if (e.getNode() instanceof RexInputRef) { r = oldInput; return register(rel.getInput(0), r, frame.oldToNewOutputs, map); createValueGenerator(corVarList, leftInputOutputCount, corDefOutputs); return register(rel.getInput(0), join, frame.oldToNewOutputs, corDefOutputs);
final RelNode oldRight = rel.getInput(1); final Frame leftFrame = getInvoke(oldLeft, rel); final Frame rightFrame = getInvoke(oldRight, rel); decorrelateExpr(currentRel, map, cm, rel.getCondition()), ImmutableSet.of(), rel.getJoinType()); entry.getValue() + newLeftFieldCount); return register(rel, newJoin, mapOldToNewOutputs, corDefOutputs);
private RelNode decorrelate(RelNode root) { final RelBuilderFactory f = relBuilderFactory(); HepProgram program = HepProgram.builder() .addRuleInstance(new AdjustProjectForCountAggregateRule(false, f)) .build(); HepPlanner planner = createPlanner(program); final Frame frame = getInvoke(root, null); if (frame != null) { .build(); final HepPlanner planner2 = createPlanner(program2); final RelNode newRoot = frame.r; planner2.setRoot(newRoot);
public RelNode removeCorrelationViaRule(RelNode root) { final RelBuilderFactory f = relBuilderFactory(); HepProgram program = HepProgram.builder() .addRuleInstance(new RemoveSingleAggregateRule(f)) .addRuleInstance(new RemoveCorrelationForScalarProjectRule(f)) .addRuleInstance(new RemoveCorrelationForScalarAggregateRule(f)) .build(); HepPlanner planner = createPlanner(program); planner.setRoot(root); return planner.findBestExp(); }
Frame(RelNode oldRel, RelNode r, SortedMap<CorDef, Integer> corDefOutputs, Map<Integer, Integer> oldToNewOutputs) { this.r = Objects.requireNonNull(r); this.corDefOutputs = ImmutableSortedMap.copyOf(corDefOutputs); this.oldToNewOutputs = ImmutableSortedMap.copyOf(oldToNewOutputs); assert allLessThan(this.corDefOutputs.values(), r.getRowType().getFieldCount(), Litmus.THROW); assert allLessThan(this.oldToNewOutputs.keySet(), oldRel.getRowType().getFieldCount(), Litmus.THROW); assert allLessThan(this.oldToNewOutputs.values(), r.getRowType().getFieldCount(), Litmus.THROW); } }