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

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


The following commit(s) were added to refs/heads/master by this push:
     new f45fbbd1ab11 [SPARK-54920][SQL] Move grouping analytics extraction 
logic to a common `GroupingAnalyticsExtractor`
f45fbbd1ab11 is described below

commit f45fbbd1ab118c3f0740afe6ba2b6fb9245118a3
Author: mihailoale-db <[email protected]>
AuthorDate: Wed Jan 7 06:56:34 2026 +0900

    [SPARK-54920][SQL] Move grouping analytics extraction logic to a common 
`GroupingAnalyticsExtractor`
    
    ### What changes were proposed in this pull request?
    Move grouping analytics extraction logic to a common 
`GroupingAnalyticsExtractor`.
    
    ### Why are the changes needed?
    In order to reuse the code in the single-pass resolver implementation of 
grouping analytics resolution.
    
    ### Does this PR introduce _any_ user-facing change?
    No.
    
    ### How was this patch tested?
    Existing tests.
    
    ### Was this patch authored or co-authored using generative AI tooling?
    No.
    
    Closes #53696 from mihailoale-db/refactorgaextraction.
    
    Authored-by: mihailoale-db <[email protected]>
    Signed-off-by: Hyukjin Kwon <[email protected]>
---
 .../expressions/GroupingAnalyticsExtractor.scala   | 48 ++++++++++++++++++++++
 .../spark/sql/catalyst/expressions/grouping.scala  | 14 +------
 2 files changed, 49 insertions(+), 13 deletions(-)

diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/GroupingAnalyticsExtractor.scala
 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/GroupingAnalyticsExtractor.scala
new file mode 100644
index 000000000000..103b87d0ecc8
--- /dev/null
+++ 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/GroupingAnalyticsExtractor.scala
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.spark.sql.catalyst.expressions
+
+/**
+ * Extracts and processes grouping expressions from GROUP BY clauses that may 
contain
+ * grouping analytics operations (GROUPING SETS, ROLLUP, CUBE).
+ *
+ * This object analyzes a sequence of expressions to compute:
+ *  1. The cartesian product of selected group-by expressions from all 
grouping sets
+ *  2. A distinct list of all group-by expressions used across all grouping 
sets
+ */
+object GroupingAnalyticsExtractor {
+
+  def apply(expressions: Seq[Expression]): Option[(Seq[Seq[Expression]], 
Seq[Expression])] = {
+    val groups = expressions.flatMap {
+      case baseGroupingSets: BaseGroupingSets => baseGroupingSets.groupByExprs
+      case other: Expression => other :: Nil
+    }
+
+    val unmergedSelectedGroupByExprs = expressions.map {
+      case baseGroupingSets: BaseGroupingSets => 
baseGroupingSets.selectedGroupByExprs
+      case other: Expression => Seq(Seq(other))
+    }
+
+    val selectedGroupByExprs = unmergedSelectedGroupByExprs.tail
+      .foldLeft(unmergedSelectedGroupByExprs.head) { (x, y) =>
+        for (a <- x; b <- y) yield a ++ b
+      }
+
+    Some((selectedGroupByExprs, BaseGroupingSets.distinctGroupByExprs(groups)))
+  }
+}
diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/grouping.scala
 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/grouping.scala
index 15161b62758c..0a12735b38da 100644
--- 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/grouping.scala
+++ 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/grouping.scala
@@ -282,19 +282,7 @@ object GroupingAnalytics extends AliasHelper {
       if (!resolved) {
         None
       } else {
-        val groups = exprsNoAlias.flatMap {
-          case gs: BaseGroupingSets => gs.groupByExprs
-          case other: Expression => other :: Nil
-        }
-        val unmergedSelectedGroupByExprs = exprsNoAlias.map {
-          case gs: BaseGroupingSets => gs.selectedGroupByExprs
-          case other: Expression => Seq(Seq(other))
-        }
-        val selectedGroupByExprs = unmergedSelectedGroupByExprs.tail
-          .foldLeft(unmergedSelectedGroupByExprs.head) { (x, y) =>
-            for (a <- x; b <- y) yield a ++ b
-          }
-        Some(selectedGroupByExprs, 
BaseGroupingSets.distinctGroupByExprs(groups))
+        GroupingAnalyticsExtractor(exprsNoAlias)
       }
     }
   }


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

Reply via email to