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));
     }
 

Reply via email to