asolimando commented on code in PR #3757:
URL: https://github.com/apache/calcite/pull/3757#discussion_r1601900134
##########
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:
The commit message here is stale
##########
core/src/main/java/org/apache/calcite/util/Bug.java:
##########
@@ -215,6 +215,12 @@ public abstract class Bug {
* Fix failing quidem tests for FORMAT in CAST</a> is fixed. */
public static final boolean CALCITE_6375_FIXED = false;
+ /** Whether
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE/issues/CALCITE-6391">
+ * [CALCITE-6340] Apply mapping to RelCompositeTrait does not apply it to
wrapped traits</a>
Review Comment:
```suggestion
* [CALCITE-6391] Apply mapping to RelCompositeTrait does not apply it to
wrapped traits</a>
```
##########
core/src/main/java/org/apache/calcite/tools/RelBuilder.java:
##########
@@ -2502,9 +2502,12 @@ private RelBuilder
pruneAggregateInputFieldsAndDeduplicateAggCalls(
newProjects.add(project.getProjects().get(i));
builder.add(project.getRowType().getFieldList().get(i));
}
+
+ // This currently does not apply mappings correctly to the
RelCollation due to
+ // https://issues.apache.org/jira/browse/CALCITE-6391.
Review Comment:
```suggestion
// https://issues.apache.org/jira/browse/CALCITE-6391
```
##########
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:
The commit message here is stale too
--
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]