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]