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