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

alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new e6920c3386 Implement Unparse `GroupingSet` Expr --> String Support  
sql (#10555)
e6920c3386 is described below

commit e6920c3386067262a3a55ea5c9f4c1ed02da8f7d
Author: Xin Li <[email protected]>
AuthorDate: Mon May 20 21:59:16 2024 +0800

    Implement Unparse `GroupingSet` Expr --> String Support  sql (#10555)
    
    * Implement groupingset -> expr
    
    * fix comments
---
 datafusion/sql/src/unparser/expr.rs | 55 +++++++++++++++++++++++++++++++------
 1 file changed, 46 insertions(+), 9 deletions(-)

diff --git a/datafusion/sql/src/unparser/expr.rs 
b/datafusion/sql/src/unparser/expr.rs
index a50bb7a698..463ec13817 100644
--- a/datafusion/sql/src/unparser/expr.rs
+++ b/datafusion/sql/src/unparser/expr.rs
@@ -16,7 +16,7 @@
 // under the License.
 
 use core::fmt;
-use std::fmt::Display;
+use std::{fmt::Display, vec};
 
 use arrow_array::{Date32Array, Date64Array};
 use arrow_schema::DataType;
@@ -26,7 +26,7 @@ use datafusion_common::{
 };
 use datafusion_expr::{
     expr::{Alias, Exists, InList, ScalarFunction, Sort, WindowFunction},
-    Between, BinaryExpr, Case, Cast, Expr, Like, Operator, TryCast,
+    Between, BinaryExpr, Case, Cast, Expr, GroupingSet, Like, Operator, 
TryCast,
 };
 use sqlparser::ast::{
     self, Expr as AstExpr, Function, FunctionArg, Ident, UnaryOperator,
@@ -425,9 +425,40 @@ impl Unparser<'_> {
             Expr::Wildcard { qualifier: _ } => {
                 not_impl_err!("Unsupported Expr conversion: {expr:?}")
             }
-            Expr::GroupingSet(_) => {
-                not_impl_err!("Unsupported Expr conversion: {expr:?}")
-            }
+            Expr::GroupingSet(grouping_set) => match grouping_set {
+                GroupingSet::GroupingSets(grouping_sets) => {
+                    let expr_ast_sets = grouping_sets
+                        .iter()
+                        .map(|set| {
+                            set.iter()
+                                .map(|e| self.expr_to_sql(e))
+                                .collect::<Result<Vec<_>>>()
+                        })
+                        .collect::<Result<Vec<_>>>()?;
+
+                    Ok(ast::Expr::GroupingSets(expr_ast_sets))
+                }
+                GroupingSet::Cube(cube) => {
+                    let expr_ast_sets = cube
+                        .iter()
+                        .map(|e| {
+                            let sql = self.expr_to_sql(e)?;
+                            Ok(vec![sql])
+                        })
+                        .collect::<Result<Vec<_>>>()?;
+                    Ok(ast::Expr::Cube(expr_ast_sets))
+                }
+                GroupingSet::Rollup(rollup) => {
+                    let expr_ast_sets: Vec<Vec<AstExpr>> = rollup
+                        .iter()
+                        .map(|e| {
+                            let sql = self.expr_to_sql(e)?;
+                            Ok(vec![sql])
+                        })
+                        .collect::<Result<Vec<_>>>()?;
+                    Ok(ast::Expr::Rollup(expr_ast_sets))
+                }
+            },
             Expr::Placeholder(p) => {
                 Ok(ast::Expr::Value(ast::Value::Placeholder(p.id.to_string())))
             }
@@ -892,11 +923,11 @@ mod tests {
     use arrow_schema::DataType::Int8;
     use datafusion_common::TableReference;
     use datafusion_expr::{
-        case, col, exists,
+        case, col, cube, exists,
         expr::{AggregateFunction, AggregateFunctionDefinition},
-        lit, not, not_exists, out_ref_col, placeholder, table_scan, try_cast, 
when,
-        wildcard, ColumnarValue, ScalarUDF, ScalarUDFImpl, Signature, 
Volatility,
-        WindowFrame, WindowFunctionDefinition,
+        grouping_set, lit, not, not_exists, out_ref_col, placeholder, rollup, 
table_scan,
+        try_cast, when, wildcard, ColumnarValue, ScalarUDF, ScalarUDFImpl, 
Signature,
+        Volatility, WindowFrame, WindowFunctionDefinition,
     };
 
     use crate::unparser::dialect::CustomDialect;
@@ -1196,6 +1227,12 @@ mod tests {
                 out_ref_col(DataType::Int32, "t.a").gt(lit(1)),
                 r#"("t"."a" > 1)"#,
             ),
+            (
+                grouping_set(vec![vec![col("a"), col("b")], vec![col("a")]]),
+                r#"GROUPING SETS (("a", "b"), ("a"))"#,
+            ),
+            (cube(vec![col("a"), col("b")]), r#"CUBE ("a", "b")"#),
+            (rollup(vec![col("a"), col("b")]), r#"ROLLUP ("a", "b")"#),
         ];
 
         for (expr, expected) in tests {


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

Reply via email to