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

yashmayya pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new c58c13feca4 Fix missing GROUPING SETS in multi-stage EXPLAIN when 
asking servers (#19769)
c58c13feca4 is described below

commit c58c13feca49a03a5e5a7cdb534ab6d950cc2da6
Author: Yash Mayya <[email protected]>
AuthorDate: Tue Oct 6 21:13:43 2026 -0700

    Fix missing GROUPING SETS in multi-stage EXPLAIN when asking servers 
(#19769)
---
 .../planner/logical/PlanNodeToRelConverter.java      | 14 ++++++++++++--
 .../planner/logical/PlanNodeToRelConverterTest.java  | 20 ++++++++++++++++++++
 2 files changed, 32 insertions(+), 2 deletions(-)

diff --git 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/PlanNodeToRelConverter.java
 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/PlanNodeToRelConverter.java
index 9b39f80cbd1..2ff2e9289bb 100644
--- 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/PlanNodeToRelConverter.java
+++ 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/PlanNodeToRelConverter.java
@@ -108,8 +108,18 @@ public final class PlanNodeToRelConverter {
       visitChildren(node);
 
       try {
-        int[] groupKeyArr = 
node.getGroupKeys().stream().mapToInt(Integer::intValue).toArray();
-        RelBuilder.GroupKey groupKey = _builder.groupKey(groupKeyArr);
+        List<Integer> groupKeys = node.getGroupKeys();
+        RelBuilder.GroupKey groupKey;
+        if (node.isGroupingSets()) {
+          // Each grouping set holds indexes into the group keys, not input 
field indexes
+          List<ImmutableBitSet> groupSets = new 
ArrayList<>(node.getGroupingSets().size());
+          for (List<Integer> groupingSet : node.getGroupingSets()) {
+            
groupSets.add(ImmutableBitSet.of(groupingSet.stream().map(groupKeys::get).collect(Collectors.toList())));
+          }
+          groupKey = _builder.groupKey(ImmutableBitSet.of(groupKeys), 
groupSets);
+        } else {
+          groupKey = 
_builder.groupKey(groupKeys.stream().mapToInt(Integer::intValue).toArray());
+        }
 
         List<RexExpression.FunctionCall> functionCalls = node.getAggCalls();
         List<Integer> filterArgs = node.getFilterArgs();
diff --git 
a/pinot-query-planner/src/test/java/org/apache/pinot/query/planner/logical/PlanNodeToRelConverterTest.java
 
b/pinot-query-planner/src/test/java/org/apache/pinot/query/planner/logical/PlanNodeToRelConverterTest.java
index d642beb5118..646d2ce4911 100644
--- 
a/pinot-query-planner/src/test/java/org/apache/pinot/query/planner/logical/PlanNodeToRelConverterTest.java
+++ 
b/pinot-query-planner/src/test/java/org/apache/pinot/query/planner/logical/PlanNodeToRelConverterTest.java
@@ -61,4 +61,24 @@ public class PlanNodeToRelConverterTest {
             + "  LogicalProject(a=[$0], c=[$2])\n"
             + "    Leaf\n");
   }
+
+  @Test
+  public void testAggregateGroupingSets() {
+    // MAX(d) ... GROUP BY ROLLUP(b, c), where the grouping sets hold indexes 
into the group keys [1, 2]
+    DataSchema leafSchema = new DataSchema(new String[]{"a", "b", "c", "d"},
+        new ColumnDataType[]{ColumnDataType.INT, ColumnDataType.INT, 
ColumnDataType.INT, ColumnDataType.INT});
+    PlanNode leaf = new ExplainedNode(0, leafSchema, null, List.of(), "Leaf", 
Map.of());
+    DataSchema aggregateSchema = new DataSchema(new String[]{"b", "c", 
"$groupingId", "max"},
+        new ColumnDataType[]{ColumnDataType.INT, ColumnDataType.INT, 
ColumnDataType.INT, ColumnDataType.INT});
+    RexExpression.FunctionCall max =
+        new RexExpression.FunctionCall(ColumnDataType.INT, "MAX", List.of(new 
RexExpression.InputRef(3)));
+    PlanNode aggregate = new AggregateNode(0, aggregateSchema, null, 
List.of(leaf), List.of(max), List.of(-1),
+        List.of(1, 2), AggregateNode.AggType.LEAF, false, null, 0, 
List.of(List.of(0, 1), List.of(0), List.of()));
+
+    RelBuilder relBuilder = 
RelBuilder.create(Frameworks.newConfigBuilder().build());
+    RelNode relNode = PlanNodeToRelConverter.convert(relBuilder, aggregate);
+    assertEquals(RelOptUtil.toString(relNode),
+        "LogicalAggregate(group=[{1, 2}], groups=[[{1, 2}, {1}, {}]], 
agg#0=[MAX($3)])\n"
+            + "  Leaf\n");
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to