Skip to content

Commit ad43837

Browse files
RyanL1997penghuo
andcommitted
Directly apply Calcite CoreRules.FILTER_MERGE before VolcanoPlanner plan
Co-authored-by: Peng Huo <penghuo@gmail.com> Signed-off-by: Jialiang Liang <jiallian@amazon.com>
1 parent 3dfd44b commit ad43837

File tree

3 files changed

+19
-90
lines changed

3 files changed

+19
-90
lines changed

core/src/main/java/org/opensearch/sql/calcite/CalciteRelNodeVisitor.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,7 @@ public CalciteRelNodeVisitor(DataSourceService dataSourceService) {
176176
}
177177

178178
public RelNode analyze(UnresolvedPlan unresolved, CalcitePlanContext context) {
179-
// Build the RelNode tree (may contain deep Filter chains)
180-
RelNode relNode = unresolved.accept(this, context);
181-
182-
// Apply filter merge optimization as post-processing
183-
// This merges consecutive LogicalFilter nodes to prevent OOM with deep chains
184-
FilterMergeVisitor filterMergeVisitor = new FilterMergeVisitor();
185-
return relNode.accept(filterMergeVisitor);
179+
return unresolved.accept(this, context);
186180
}
187181

188182
@Override

core/src/main/java/org/opensearch/sql/calcite/FilterMergeVisitor.java

Lines changed: 0 additions & 83 deletions
This file was deleted.

core/src/main/java/org/opensearch/sql/executor/QueryService.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,15 @@
1616
import lombok.extern.log4j.Log4j2;
1717
import org.apache.calcite.jdbc.CalciteSchema;
1818
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;
1922
import org.apache.calcite.rel.RelCollation;
2023
import org.apache.calcite.rel.RelCollations;
2124
import org.apache.calcite.rel.RelNode;
2225
import org.apache.calcite.rel.core.Sort;
2326
import org.apache.calcite.rel.logical.LogicalSort;
27+
import org.apache.calcite.rel.rules.FilterMergeRule;
2428
import org.apache.calcite.schema.SchemaPlus;
2529
import org.apache.calcite.sql.parser.SqlParser;
2630
import org.apache.calcite.tools.FrameworkConfig;
@@ -100,6 +104,7 @@ public void executeWithCalcite(
100104
CalcitePlanContext.create(
101105
buildFrameworkConfig(), SysLimit.fromSettings(settings), queryType);
102106
RelNode relNode = analyze(plan, context);
107+
relNode = mergeAdjacentFilters(relNode);
103108
RelNode optimized = optimize(relNode, context);
104109
RelNode calcitePlan = convertToCalcitePlan(optimized);
105110
executionEngine.execute(calcitePlan, context, listener);
@@ -145,6 +150,7 @@ public void explainWithCalcite(
145150
context.run(
146151
() -> {
147152
RelNode relNode = analyze(plan, context);
153+
relNode = mergeAdjacentFilters(relNode);
148154
RelNode optimized = optimize(relNode, context);
149155
RelNode calcitePlan = convertToCalcitePlan(optimized);
150156
executionEngine.explain(calcitePlan, format, context, listener);
@@ -259,6 +265,18 @@ public RelNode analyze(UnresolvedPlan plan, CalcitePlanContext context) {
259265
return getRelNodeVisitor().analyze(plan, context);
260266
}
261267

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+
262280
/** Analyze {@link UnresolvedPlan}. */
263281
public LogicalPlan analyze(UnresolvedPlan plan, QueryType queryType) {
264282
return analyzer.analyze(plan, new AnalysisContext(queryType));

0 commit comments

Comments
 (0)