public RelDecorrelator( RexBuilder rexBuilder, Map<RelNode, SortedSet<CorrelatorRel.Correlation>> mapRefRelToCorVar, SortedMap<CorrelatorRel.Correlation, CorrelatorRel> mapCorVarToCorRel, Map<RexFieldAccess, CorrelatorRel.Correlation> mapFieldAccessToCorVar) { this.rexBuilder = rexBuilder; this.mapRefRelToCorVar = mapRefRelToCorVar; this.mapCorVarToCorRel = mapCorVarToCorRel; this.mapFieldAccessToCorVar = mapFieldAccessToCorVar; decorrelateVisitor = new DecorrelateRelVisitor(); mapOldToNewRel = new HashMap<RelNode, RelNode>(); mapNewRelToMapCorVarToOutputPos = new HashMap<RelNode, SortedMap<CorrelatorRel.Correlation, Integer>>(); mapNewRelToMapOldToNewOutputPos = new HashMap<RelNode, Map<Integer, Integer>>(); }
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; } }
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; } }
private RelDecorrelator( RexBuilder rexBuilder, CorelMap cm, Context context) { this.cm = cm; this.rexBuilder = rexBuilder; this.context = context; decorrelateVisitor = new DecorrelateRelVisitor(); }