public RelNode decorrelate(RelNode root) { // first adjust count() expression if any HepProgramBuilder programBuilder = new HepProgramBuilder(); programBuilder.addRuleInstance( new AdjustProjectForCountAggregateRule(false)); programBuilder.addRuleInstance( new AdjustProjectForCountAggregateRule(true)); HepPlanner planner = new HepPlanner( programBuilder.createProgram(), true); planner.setRoot(root); root = planner.findBestExp(); // Perform decorrelation. mapOldToNewRel.clear(); mapNewRelToMapCorVarToOutputPos.clear(); mapNewRelToMapOldToNewOutputPos.clear(); decorrelateVisitor.visit(root, 0, null); if (mapOldToNewRel.containsKey(root)) { // has been rewritten return mapOldToNewRel.get(root); } else { // not rewritten return root; } }
public void onMatch(RelOptRuleCall call) { CorrelatorRel corRel = call.rel(0); RelNode leftInputRel = call.rel(1); ProjectRel aggOutputProjRel; AggregateRel aggRel; if (flavor) { aggOutputProjRel = call.rel(2); aggRel = call.rel(3); } else { aggRel = call.rel(2); // Create identity projection List<Pair<RexNode, String>> projects = new ArrayList<Pair<RexNode, String>>(); final List<RelDataTypeField> fields = aggRel.getRowType().getFieldList(); for (int i = 0; i < fields.size(); i++) { projects.add(RexInputRef.of2(projects.size(), fields)); } aggOutputProjRel = (ProjectRel) CalcRel.createProject( aggRel, projects, false); } onMatch2(call, corRel, leftInputRel, aggOutputProjRel, aggRel); }
public void onMatch(RelOptRuleCall call) { CorrelatorRel corRel = call.rel(0); RelNode leftInputRel = call.rel(1); ProjectRel aggOutputProjRel; AggregateRel aggRel; if (flavor) { aggOutputProjRel = call.rel(2); aggRel = call.rel(3); } else { aggRel = call.rel(2); // Create identity projection List<Pair<RexNode, String>> projects = Lists.newArrayList(); final List<RelDataTypeField> fields = aggRel.getRowType().getFieldList(); for (int i = 0; i < fields.size(); i++) { projects.add(RexInputRef.of2(projects.size(), fields)); } aggOutputProjRel = (ProjectRel) CalcRel.createProject( aggRel, projects, false); } onMatch2(call, corRel, leftInputRel, aggOutputProjRel, aggRel); }
private RelNode decorrelate(RelNode root) { // first adjust count() expression if any HepProgram program = HepProgram.builder() .addRuleInstance(new AdjustProjectForCountAggregateRule(false)) .addRuleInstance(new AdjustProjectForCountAggregateRule(true)) .addRuleInstance(PushFilterPastJoinRule.FILTER_ON_JOIN) .build(); HepPlanner planner = createPlanner(program); planner.setRoot(root); root = planner.findBestExp(); // Perform decorrelation. mapOldToNewRel.clear(); mapNewRelToMapCorVarToOutputPos.clear(); mapNewRelToMapOldToNewOutputPos.clear(); decorrelateVisitor.visit(root, 0, null); if (mapOldToNewRel.containsKey(root)) { // has been rewritten return mapOldToNewRel.get(root); } else { // not rewritten return root; } }
public AdjustProjectForCountAggregateRule(boolean flavor) { super( flavor ? operand(CorrelatorRel.class, operand(RelNode.class, any()), operand(ProjectRel.class, operand(AggregateRel.class, any()))) : operand(CorrelatorRel.class, operand(RelNode.class, any()), operand(AggregateRel.class, any()))); this.flavor = flavor; }