Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GroupingSet Expr --> String Support #10521

Closed
Tracked by #9726
alamb opened this issue May 15, 2024 · 5 comments · Fixed by #10555
Closed
Tracked by #9726

GroupingSet Expr --> String Support #10521

alamb opened this issue May 15, 2024 · 5 comments · Fixed by #10555

Comments

@alamb
Copy link
Contributor

alamb commented May 15, 2024

Is your feature request related to a problem or challenge?

Part of #9726 to complete the Expr

Converting Expr back to SQL is valuable for several usecases such as using DataFusion in federated databases (e.g. generate SQL to push down) or using DataFusion's expr APIs to programatically create SQL.

Describe the solution you'd like

Support converting SQL syntax like this:

TODO I AM NOT SURE HOW TO MAKE THIS IN SQL

Describe alternatives you've considered

The basic pattern is:

  1. Implement the Expr --> AST reverse code in Unparser::expr_to_sql(source link)
  2. Add a test to expr_to_sql_ok

Note you can run the tests like

cargo test -p datafusion-sql -- expr_to_sql_ok

Additional context

This is likely NOT a good first issue

@xinlifoobar
Copy link
Contributor

Hi @alamb, I am wondering whether is there a way to implement the cube and 'rollup' functions easily. the inner vector is expanded in the planner.

@xinlifoobar
Copy link
Contributor

I think from the Vec<Expr> could not mapping back to the only unique Vec<Vec<Expr>> and hence unparse the cube statement would be difficult. How about store another copy of origin Vec in the Cube and Rollup instance? i.e.,

pub enum GroupingSet {
    /// Rollup grouping sets
    Rollup(Vec<Expr>, Vec<Vec<Expr>>),
    /// Cube grouping sets
    Cube(Vec<Expr>, Vec<Vec<Expr>>),
    /// User-defined grouping sets
    GroupingSets(Vec<Vec<Expr>>),
}

@alamb
Copy link
Contributor Author

alamb commented May 16, 2024

Hi @xinlifoobar - another thing that we could potentially do is to work at this from the SQL statement level (rather than the Expr level)

As in implement a round trip test like this for a query with a grouping set:

https://github.com/apache/datafusion/blob/main/datafusion/sql/tests/sql_integration.rs#L4678-L4708

@xinlifoobar
Copy link
Contributor

I made a mistake about the previous statements. The vector of cube and rollout is not expanded so the implement could be easy.

https://github.com/apache/datafusion/blob/main/datafusion/sql/src/expr/grouping_set.rs#L42-L81

@alamb
Copy link
Contributor Author

alamb commented May 20, 2024

Thanks again @xinlifoobar

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants