This is an automated email from the ASF dual-hosted git repository.
tjbanghart pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new 7e118bb05e [CALCITE-7265] Allow RelOptFixture.relFn to be used with
VolcanoPlanner
7e118bb05e is described below
commit 7e118bb05e4f88ef5c0e32b82f64fb8378987627
Author: TJ Banghart <[email protected]>
AuthorDate: Tue Nov 18 21:24:44 2025 -0800
[CALCITE-7265] Allow RelOptFixture.relFn to be used with VolcanoPlanner
---
.../java/org/apache/calcite/tools/RelBuilder.java | 7 +++++++
.../java/org/apache/calcite/test/RelOptRulesTest.java | 19 +++++++++++++++++++
.../org/apache/calcite/test/RelOptRulesTest.xml | 14 ++++++++++++++
.../java/org/apache/calcite/test/RelSupplier.java | 6 ++++++
4 files changed, 46 insertions(+)
diff --git a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
index 44a7999727..b8500177c0 100644
--- a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
+++ b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
@@ -255,6 +255,13 @@ public static RelBuilder create(FrameworkConfig config) {
new RelBuilder(config.getContext(), cluster, relOptSchema));
}
+ /** Creates a RelBuilder with a given RelOptCluster. */
+ public static RelBuilder create(FrameworkConfig config, RelOptCluster
existingCluster) {
+ return Frameworks.withPrepare(config,
+ (cluster, relOptSchema, rootSchema, statement) ->
+ new RelBuilder(config.getContext(), existingCluster,
relOptSchema));
+ }
+
/** Creates a copy of this RelBuilder, with the same state as this, applying
* a transform to the config. */
public RelBuilder transform(UnaryOperator<Config> transform) {
diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
index 92e27614e5..53e4b5feef 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -11491,4 +11491,23 @@ private void
checkLoptOptimizeJoinRule(LoptOptimizeJoinRule rule) {
})
.check();
}
+
+ /** Test case of
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-7265">[CALCITE-7265]
+ * Verify that relFn works with VolcanoPlanner</a>. */
+ @Test void testRelFnWithVolcanoPlanner() {
+ final Function<RelBuilder, RelNode> relFn = b ->
+ b.scan("EMP")
+ .filter(
+ b.call(SqlStdOperatorTable.GREATER_THAN,
+ b.field("SAL"),
+ b.literal(2000)))
+ .build();
+
+ relFn(relFn)
+ .withVolcanoPlanner(false, p -> {
+ RelOptUtil.registerDefaultRules(p, false, false);
+ })
+ .check();
+ }
}
diff --git
a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index 0fe14272f3..a9b4bc81a0 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -16510,6 +16510,20 @@ LogicalProject(ENAME=[$0], EMPNO=[$1], EMPNO_R=[$3],
TYPE=[1])
LogicalProject(ENAME=[$1], EMPNO=[$0], __SOURCE__TYPE__=['bounded'])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
LogicalTableFunctionScan(invocation=[RAMP($cor0.EMPNO)],
rowType=[RecordType(INTEGER I)])
+]]>
+ </Resource>
+ </TestCase>
+ <TestCase name="testRelFnWithVolcanoPlanner">
+ <Resource name="planBefore">
+ <![CDATA[
+LogicalFilter(condition=[>($5, 2000)])
+ LogicalTableScan(table=[[scott, EMP]])
+]]>
+ </Resource>
+ <Resource name="planAfter">
+ <![CDATA[
+EnumerableFilter(condition=[>($5, 2000)])
+ EnumerableTableScan(table=[[scott, EMP]])
]]>
</Resource>
</TestCase>
diff --git a/testkit/src/main/java/org/apache/calcite/test/RelSupplier.java
b/testkit/src/main/java/org/apache/calcite/test/RelSupplier.java
index 44a82f54df..ffcc7bd45f 100644
--- a/testkit/src/main/java/org/apache/calcite/test/RelSupplier.java
+++ b/testkit/src/main/java/org/apache/calcite/test/RelSupplier.java
@@ -16,7 +16,9 @@
*/
package org.apache.calcite.test;
+import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelTraitDef;
+import org.apache.calcite.plan.volcano.VolcanoPlanner;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.sql.parser.SqlParser;
import org.apache.calcite.tools.FrameworkConfig;
@@ -128,6 +130,10 @@ private FnRelSupplier(Function<RelBuilder, RelNode> relFn)
{
}
@Override public RelNode apply(RelOptFixture fixture) {
+ if (fixture.planner instanceof VolcanoPlanner) {
+ RelOptCluster existingCluster =
fixture.factory.createSqlToRelConverter().getCluster();
+ return relFn.apply(RelBuilder.create(FRAMEWORK_CONFIG,
existingCluster));
+ }
return relFn.apply(RelBuilder.create(FRAMEWORK_CONFIG));
}