This is an automated email from the ASF dual-hosted git repository.

rubenql 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 2e3e4ae220 [CALCITE-5401] Rule fired by HepPlanner can return 
Volcano's RelSubset
2e3e4ae220 is described below

commit 2e3e4ae220a69a0936792caec1fae23d947e77f3
Author: rubenada <rube...@gmail.com>
AuthorDate: Mon Jun 5 12:36:45 2023 +0100

    [CALCITE-5401] Rule fired by HepPlanner can return Volcano's RelSubset
---
 .../EnumerableBatchNestedLoopJoinRule.java         |  4 ++--
 .../adapter/enumerable/EnumerableLimitRule.java    |  3 ++-
 .../enumerable/EnumerableLimitSortRule.java        |  2 +-
 .../enumerable/EnumerableMergeUnionRule.java       |  3 ++-
 .../java/org/apache/calcite/plan/RelOptRule.java   |  9 +++++++--
 .../calcite/rel/rules/AggregateRemoveRule.java     |  2 +-
 .../apache/calcite/rel/rules/CalcRemoveRule.java   |  1 +
 .../calcite/rel/rules/ProjectRemoveRule.java       |  2 +-
 .../apache/calcite/rel/rules/SortRemoveRule.java   |  2 +-
 .../org/apache/calcite/test/HepPlannerTest.java    | 22 ++++++++++++++++++++++
 .../calcite/adapter/geode/rel/GeodeRules.java      |  2 +-
 11 files changed, 41 insertions(+), 11 deletions(-)

diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoinRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoinRule.java
index 10d875d08e..d7accbd705 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoinRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoinRule.java
@@ -140,9 +140,9 @@ public class EnumerableBatchNestedLoopJoinRule
 
     call.transformTo(
         EnumerableBatchNestedLoopJoin.create(
-            convert(join.getLeft(), join.getLeft().getTraitSet()
+            convert(call.getPlanner(), join.getLeft(), 
join.getLeft().getTraitSet()
                 .replace(EnumerableConvention.INSTANCE)),
-            convert(right, right.getTraitSet()
+            convert(call.getPlanner(), right, right.getTraitSet()
                 .replace(EnumerableConvention.INSTANCE)),
             join.getCondition(),
             requiredColumns.build(),
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimitRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimitRule.java
index 4f84bd92cb..7cea6575cb 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimitRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimitRule.java
@@ -57,7 +57,8 @@ public class EnumerableLimitRule
     }
     call.transformTo(
         EnumerableLimit.create(
-            convert(input, 
input.getTraitSet().replace(EnumerableConvention.INSTANCE)),
+            convert(call.getPlanner(), input,
+                input.getTraitSet().replace(EnumerableConvention.INSTANCE)),
             sort.offset,
             sort.fetch));
   }
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimitSortRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimitSortRule.java
index 6ea7e55115..1a03338001 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimitSortRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimitSortRule.java
@@ -43,7 +43,7 @@ public class EnumerableLimitSortRule extends 
RelRule<EnumerableLimitSortRule.Con
     RelNode input = sort.getInput();
     final Sort o =
         EnumerableLimitSort.create(
-            convert(input,
+            convert(call.getPlanner(), input,
                 input.getTraitSet().replace(EnumerableConvention.INSTANCE)),
             sort.getCollation(), sort.offset, sort.fetch);
 
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeUnionRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeUnionRule.java
index 47982dde83..b38179dc68 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeUnionRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeUnionRule.java
@@ -135,7 +135,8 @@ public class EnumerableMergeUnionRule extends 
RelRule<EnumerableMergeUnionRule.C
       final RelNode newInput =
           sort.copy(sort.getTraitSet(), unsortedInput, collation, null, 
inputFetch);
       inputs.add(
-          convert(newInput, 
newInput.getTraitSet().replace(EnumerableConvention.INSTANCE)));
+          convert(call.getPlanner(), newInput,
+              newInput.getTraitSet().replace(EnumerableConvention.INSTANCE)));
     }
 
     RelNode result = EnumerableMergeUnion.create(sort.getCollation(), inputs, 
union.all);
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptRule.java 
b/core/src/main/java/org/apache/calcite/plan/RelOptRule.java
index c9a7280b08..080b50f660 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptRule.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptRule.java
@@ -588,8 +588,10 @@ public abstract class RelOptRule {
    * @return a relational expression with the desired traits; never null
    */
   public static RelNode convert(RelNode rel, RelTraitSet toTraits) {
-    RelOptPlanner planner = rel.getCluster().getPlanner();
+    return convert(rel.getCluster().getPlanner(), rel, toTraits);
+  }
 
+  public static RelNode convert(RelOptPlanner planner, RelNode rel, 
RelTraitSet toTraits) {
     RelTraitSet outTraits = rel.getTraitSet();
     for (int i = 0; i < toTraits.size(); i++) {
       RelTrait toTrait = toTraits.getTrait(i);
@@ -614,7 +616,10 @@ public abstract class RelOptRule {
    * @return a relational expression with the desired trait; never null
    */
   public static RelNode convert(RelNode rel, @Nullable RelTrait toTrait) {
-    RelOptPlanner planner = rel.getCluster().getPlanner();
+    return convert(rel.getCluster().getPlanner(), rel, toTrait);
+  }
+
+  public static RelNode convert(RelOptPlanner planner, RelNode rel, @Nullable 
RelTrait toTrait) {
     RelTraitSet outTraits = rel.getTraitSet();
     if (toTrait != null) {
       outTraits = outTraits.replace(toTrait);
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/AggregateRemoveRule.java 
b/core/src/main/java/org/apache/calcite/rel/rules/AggregateRemoveRule.java
index 14a894e114..64186116bb 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateRemoveRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateRemoveRule.java
@@ -147,7 +147,7 @@ public class AggregateRemoveRule
       projects.add(cast);
     }
 
-    final RelNode newInput = convert(input, 
aggregate.getTraitSet().simplify());
+    final RelNode newInput = convert(call.getPlanner(), input, 
aggregate.getTraitSet().simplify());
     relBuilder.push(newInput);
     if (!projects.isEmpty()) {
       projects.addAll(0, relBuilder.fields(aggregate.getGroupSet()));
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/CalcRemoveRule.java 
b/core/src/main/java/org/apache/calcite/rel/rules/CalcRemoveRule.java
index 5ef3a1d484..0e20bd99b1 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/CalcRemoveRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/CalcRemoveRule.java
@@ -59,6 +59,7 @@ public class CalcRemoveRule extends 
RelRule<CalcRemoveRule.Config>
     input = call.getPlanner().register(input, calc);
     call.transformTo(
         convert(
+            call.getPlanner(),
             input,
             calc.getTraitSet()));
   }
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java 
b/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java
index 551cae2086..d3e57230df 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java
@@ -67,7 +67,7 @@ public class ProjectRemoveRule
               childProject.getInput(), childProject.getProjects(),
               project.getRowType());
     }
-    stripped = convert(stripped, project.getConvention());
+    stripped = convert(call.getPlanner(), stripped, project.getConvention());
     call.transformTo(stripped);
   }
 
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/SortRemoveRule.java 
b/core/src/main/java/org/apache/calcite/rel/rules/SortRemoveRule.java
index c5ae9299cb..861a719094 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/SortRemoveRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/SortRemoveRule.java
@@ -70,7 +70,7 @@ public class SortRemoveRule
         .getTrait(RelCollationTraitDef.INSTANCE);
     final RelTraitSet traits = sort.getInput().getTraitSet()
         .replace(collation).replaceIf(ConventionTraitDef.INSTANCE, 
sort::getConvention);
-    call.transformTo(convert(sort.getInput(), traits));
+    call.transformTo(convert(call.getPlanner(), sort.getInput(), traits));
   }
 
   /** Rule configuration. */
diff --git a/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java 
b/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java
index 1b30b20f04..ca86e30f43 100644
--- a/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java
+++ b/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java
@@ -26,9 +26,11 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.externalize.RelDotWriter;
 import org.apache.calcite.rel.logical.LogicalIntersect;
 import org.apache.calcite.rel.logical.LogicalUnion;
+import org.apache.calcite.rel.logical.LogicalValues;
 import org.apache.calcite.rel.rules.CoerceInputsRule;
 import org.apache.calcite.rel.rules.CoreRules;
 import org.apache.calcite.sql.SqlExplainLevel;
+import org.apache.calcite.tools.RelBuilder;
 
 import com.google.common.collect.ImmutableList;
 
@@ -41,6 +43,7 @@ import java.io.StringWriter;
 
 import static org.apache.calcite.test.Matchers.isLinux;
 
+import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -421,4 +424,23 @@ class HepPlannerTest {
     @Override public void relChosen(RelChosenEvent event) {
     }
   }
+
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-5401";>[CALCITE-5401]
+   * Rule fired by HepPlanner can return Volcano's RelSubset</a>. */
+  @Test void testAggregateRemove() {
+    final RelBuilder builder = RelBuilderTest.createBuilder(c -> 
c.withAggregateUnique(true));
+    final RelNode root =
+        builder
+            .values(new String[]{"i"}, 1, 2, 3)
+            .distinct()
+            .build();
+    final HepProgram program = new HepProgramBuilder()
+        .addRuleInstance(CoreRules.AGGREGATE_REMOVE)
+        .build();
+    final HepPlanner planner = new HepPlanner(program);
+    planner.setRoot(root);
+    final RelNode result = planner.findBestExp();
+    assertThat(result, is(instanceOf(LogicalValues.class)));
+  }
 }
diff --git 
a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRules.java 
b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRules.java
index 6004f8b5bb..5fa2b56340 100644
--- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRules.java
+++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRules.java
@@ -225,7 +225,7 @@ public class GeodeRules {
 
       GeodeSort geodeSort =
           new GeodeSort(sort.getCluster(), traitSet,
-              convert(sort.getInput(), traitSet.replace(RelCollations.EMPTY)),
+              convert(call.getPlanner(), sort.getInput(), 
traitSet.replace(RelCollations.EMPTY)),
               sort.getCollation(), sort.fetch);
 
       call.transformTo(geodeSort);

Reply via email to