|
16 | 16 | import lombok.extern.log4j.Log4j2; |
17 | 17 | import org.apache.calcite.jdbc.CalciteSchema; |
18 | 18 | import org.apache.calcite.plan.RelTraitDef; |
| 19 | +import org.apache.calcite.plan.hep.HepPlanner; |
| 20 | +import org.apache.calcite.plan.hep.HepProgram; |
| 21 | +import org.apache.calcite.plan.hep.HepProgramBuilder; |
19 | 22 | import org.apache.calcite.rel.RelCollation; |
20 | 23 | import org.apache.calcite.rel.RelCollations; |
21 | 24 | import org.apache.calcite.rel.RelNode; |
22 | 25 | import org.apache.calcite.rel.core.Sort; |
23 | 26 | import org.apache.calcite.rel.logical.LogicalSort; |
| 27 | +import org.apache.calcite.rel.rules.FilterMergeRule; |
24 | 28 | import org.apache.calcite.schema.SchemaPlus; |
25 | 29 | import org.apache.calcite.sql.parser.SqlParser; |
26 | 30 | import org.apache.calcite.tools.FrameworkConfig; |
@@ -100,6 +104,7 @@ public void executeWithCalcite( |
100 | 104 | CalcitePlanContext.create( |
101 | 105 | buildFrameworkConfig(), SysLimit.fromSettings(settings), queryType); |
102 | 106 | RelNode relNode = analyze(plan, context); |
| 107 | + relNode = mergeAdjacentFilters(relNode); |
103 | 108 | RelNode optimized = optimize(relNode, context); |
104 | 109 | RelNode calcitePlan = convertToCalcitePlan(optimized); |
105 | 110 | executionEngine.execute(calcitePlan, context, listener); |
@@ -145,6 +150,7 @@ public void explainWithCalcite( |
145 | 150 | context.run( |
146 | 151 | () -> { |
147 | 152 | RelNode relNode = analyze(plan, context); |
| 153 | + relNode = mergeAdjacentFilters(relNode); |
148 | 154 | RelNode optimized = optimize(relNode, context); |
149 | 155 | RelNode calcitePlan = convertToCalcitePlan(optimized); |
150 | 156 | executionEngine.explain(calcitePlan, format, context, listener); |
@@ -259,6 +265,18 @@ public RelNode analyze(UnresolvedPlan plan, CalcitePlanContext context) { |
259 | 265 | return getRelNodeVisitor().analyze(plan, context); |
260 | 266 | } |
261 | 267 |
|
| 268 | + /** |
| 269 | + * Run Calcite FILTER_MERGE once so adjacent filters created during analysis can collapse before |
| 270 | + * the rest of optimization. |
| 271 | + */ |
| 272 | + private RelNode mergeAdjacentFilters(RelNode relNode) { |
| 273 | + HepProgram program = |
| 274 | + new HepProgramBuilder().addRuleInstance(FilterMergeRule.Config.DEFAULT.toRule()).build(); |
| 275 | + HepPlanner planner = new HepPlanner(program); |
| 276 | + planner.setRoot(relNode); |
| 277 | + return planner.findBestExp(); |
| 278 | + } |
| 279 | + |
262 | 280 | /** Analyze {@link UnresolvedPlan}. */ |
263 | 281 | public LogicalPlan analyze(UnresolvedPlan plan, QueryType queryType) { |
264 | 282 | return analyzer.analyze(plan, new AnalysisContext(queryType)); |
|
0 commit comments