jduo commented on code in PR #3757:
URL: https://github.com/apache/calcite/pull/3757#discussion_r1601998815
##########
core/src/test/java/org/apache/calcite/test/RelBuilderTest.java:
##########
@@ -1450,6 +1452,225 @@ private RexNode caseCall(RelBuilder b, RexNode ref,
RexNode... nodes) {
assertThat(root, hasTree(expected));
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE/issues/CALCITE-6340">
+ * [CALCITE-6340] RelBuilder drops traits when aggregating over duplicate
projected fields</a>.
+ */
+ @Test void
testPruneProjectInputOfAggregatePreservesConventionAndCollationsWhenEmpty() {
+ final RelBuilder builder = createBuilder(config ->
config.withPruneInputOfAggregate(true));
+
+ RelNode node = builder
+ .scan("EMP")
+ .sort(builder.nullsLast(builder.desc(builder.field(1))),
+ builder.field(0))
+ .project(builder.alias(builder.field(0), "a"),
+ builder.alias(builder.field(1), "b"),
+ builder.alias(builder.field(0), "c"),
+ builder.alias(builder.field(1), "d"))
+ .build();
+
+ final RelTraitSet desiredTraits = builder.getCluster().traitSet()
+ .replace(EnumerableConvention.INSTANCE);
+
+ final RuleSet prepareRules =
+ RuleSets.ofList(EnumerableRules.ENUMERABLE_PROJECT_RULE,
+ EnumerableRules.ENUMERABLE_SORT_RULE,
+ EnumerableRules.ENUMERABLE_TABLE_SCAN_RULE);
+ final Program program = Programs.of(prepareRules);
+ node =
+ program.run(node.getCluster().getPlanner(), node, desiredTraits,
ImmutableList.of(),
+ ImmutableList.of());
+
+ // collations are lost as the sort is on column [1, 0], but we group on 0,
convention stays
+ node = builder.push(node)
+ .aggregate(
+ builder.groupKey(0), builder.aggregateCall(
+ SqlStdOperatorTable.SUM, builder.field(0)))
+ .build();
+
+ final RelTraitSet expectedTraitSet = builder.getCluster().traitSet()
+ .replace(EnumerableConvention.INSTANCE);
+ assertTrue(expectedTraitSet.contains(EnumerableConvention.INSTANCE));
+
+ if (Bug.CALCITE_6391_FIXED) {
+ assertThat(node.getInput(0).getTraitSet(), is(expectedTraitSet));
+ } else {
+ assertThat(node.getInput(0).getTraitSet().get(0),
is(expectedTraitSet.get(0)));
+ }
+ }
+
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE/issues/CALCITE-6340">
+ * [CALCITE-6340] RelBuilder drops set conventions when aggregating over
duplicate
+ * projected fields</a>.
+ */
+ @Test void
testPruneProjectInputOfAggregatePreservesConventionAndSingletonCollation() {
+ final RelBuilder builder = createBuilder(config ->
config.withPruneInputOfAggregate(true));
+
+ RelNode node = builder
+ .scan("EMP")
+ .sort(builder.nullsLast(builder.desc(builder.field(1))))
+ .project(builder.alias(builder.field(0), "a"),
+ builder.alias(builder.field(1), "b"),
+ builder.alias(builder.field(0), "c"),
+ builder.alias(builder.field(1), "d"))
+ .build();
+
+ final RelTraitSet desiredTraits = builder.getCluster().traitSet()
+ .replace(EnumerableConvention.INSTANCE);
+
+ final RuleSet prepareRules =
+ RuleSets.ofList(EnumerableRules.ENUMERABLE_PROJECT_RULE,
+ EnumerableRules.ENUMERABLE_SORT_RULE,
+ EnumerableRules.ENUMERABLE_TABLE_SCAN_RULE);
+ final Program program = Programs.of(prepareRules);
+
+ // turn the logical plan into a physical plan so that a convention can be
set
+ node =
+ program.run(node.getCluster().getPlanner(), node, desiredTraits,
ImmutableList.of(),
+ ImmutableList.of());
+
+
+ node = builder.push(node)
+ .aggregate(
+ builder.groupKey(1), builder.aggregateCall(
+ SqlStdOperatorTable.SUM, builder.field(1)))
+ .build();
+
+ final RelTraitSet expectedTraitSet = builder.getCluster().traitSet()
+ .replace(EnumerableConvention.INSTANCE)
+ .replace(
+ RelCollations.of(
+ new RelFieldCollation(0,
+ RelFieldCollation.Direction.DESCENDING,
RelFieldCollation.NullDirection.LAST)));
+
+ if (Bug.CALCITE_6391_FIXED) {
+ assertThat(node.getInput(0).getTraitSet(), is(expectedTraitSet));
+ } else {
+ assertThat(node.getInput(0).getTraitSet().get(0),
is(expectedTraitSet.get(0)));
+ }
+ }
+
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE/issues/CALCITE-6340">
+ * [CALCITE-6340] RelBuilder drops set conventions when aggregating over
duplicate
Review Comment:
Fixed.
##########
core/src/test/java/org/apache/calcite/test/RelBuilderTest.java:
##########
@@ -1450,6 +1452,225 @@ private RexNode caseCall(RelBuilder b, RexNode ref,
RexNode... nodes) {
assertThat(root, hasTree(expected));
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE/issues/CALCITE-6340">
+ * [CALCITE-6340] RelBuilder drops traits when aggregating over duplicate
projected fields</a>.
+ */
+ @Test void
testPruneProjectInputOfAggregatePreservesConventionAndCollationsWhenEmpty() {
+ final RelBuilder builder = createBuilder(config ->
config.withPruneInputOfAggregate(true));
+
+ RelNode node = builder
+ .scan("EMP")
+ .sort(builder.nullsLast(builder.desc(builder.field(1))),
+ builder.field(0))
+ .project(builder.alias(builder.field(0), "a"),
+ builder.alias(builder.field(1), "b"),
+ builder.alias(builder.field(0), "c"),
+ builder.alias(builder.field(1), "d"))
+ .build();
+
+ final RelTraitSet desiredTraits = builder.getCluster().traitSet()
+ .replace(EnumerableConvention.INSTANCE);
+
+ final RuleSet prepareRules =
+ RuleSets.ofList(EnumerableRules.ENUMERABLE_PROJECT_RULE,
+ EnumerableRules.ENUMERABLE_SORT_RULE,
+ EnumerableRules.ENUMERABLE_TABLE_SCAN_RULE);
+ final Program program = Programs.of(prepareRules);
+ node =
+ program.run(node.getCluster().getPlanner(), node, desiredTraits,
ImmutableList.of(),
+ ImmutableList.of());
+
+ // collations are lost as the sort is on column [1, 0], but we group on 0,
convention stays
+ node = builder.push(node)
+ .aggregate(
+ builder.groupKey(0), builder.aggregateCall(
+ SqlStdOperatorTable.SUM, builder.field(0)))
+ .build();
+
+ final RelTraitSet expectedTraitSet = builder.getCluster().traitSet()
+ .replace(EnumerableConvention.INSTANCE);
+ assertTrue(expectedTraitSet.contains(EnumerableConvention.INSTANCE));
+
+ if (Bug.CALCITE_6391_FIXED) {
+ assertThat(node.getInput(0).getTraitSet(), is(expectedTraitSet));
+ } else {
+ assertThat(node.getInput(0).getTraitSet().get(0),
is(expectedTraitSet.get(0)));
+ }
+ }
+
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE/issues/CALCITE-6340">
+ * [CALCITE-6340] RelBuilder drops set conventions when aggregating over
duplicate
Review Comment:
Fixed.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]