alamb commented on issue #6747:
URL: https://github.com/apache/datafusion/issues/6747#issuecomment-2090260284

   Here is another example from https://github.com/apache/datafusion/pull/10345 
/ @timsaucer  showing how non easy it is to create a window function via the 
expr API
   
   ```rust
   use datafusion::{logical_expr::{expr::WindowFunction, BuiltInWindowFunction, 
WindowFrame, WindowFunctionDefinition}, prelude::*};
   
   #[tokio::main]
   async fn main() -> datafusion::error::Result<()> {
   
       let ctx = SessionContext::new();
       let mut df = 
ctx.read_csv("/Users/tsaucer/working/testing_ballista/lead_lag/example.csv", 
CsvReadOptions::default()).await?;
   
       df = df.with_column("array_col", make_array(vec![col("a"), col("b"), 
col("c")]))?;
   
       df.clone().show().await?;
   
       let lag_expr = Expr::WindowFunction(WindowFunction::new(
           WindowFunctionDefinition::BuiltInWindowFunction(
               BuiltInWindowFunction::Lead,
           ),
           vec![col("array_col")],
           vec![],
           vec![],
           WindowFrame::new(None),
           None,
       ));
   
       df = df.select(vec![col("a"), col("b"), col("c"), col("array_col"), 
lag_expr.alias("lagged")])?;
   
       df.show().await?;
   
       Ok(())
   }
   ```
   
   It would be great if instead of 
   
   ```rust
       let lag_expr = Expr::WindowFunction(WindowFunction::new(
           WindowFunctionDefinition::BuiltInWindowFunction(
               BuiltInWindowFunction::Lead,
           ),
           vec![col("array_col")],
           vec![],
           vec![],
           WindowFrame::new(None),
           None,
       ));
   ```
   
   It looked more like
   
   ```rust
       let lag_expr = lead(
           vec![col("array_col")],
           vec![],
           vec![],
           WindowFrame::new(None),
           None,
       ));
   ```
   
   Maybe even better like a builder style 
   
   ```rust
       let lag_expr = lead(col("array_col")).build()
   ```
   
   Which would permit adding the various `OVER` clauses like
   ```rust
       let lag_expr = lead(col("array_col"))
         .partition_by(vec![])
         .order_by(vec![])
         .build()
   ```
   
   Maybe there are some inspirations in the polars API too: 
https://docs.pola.rs/user-guide/expressions/window/#group-by-aggregations-in-selection


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org
For additional commands, e-mail: github-h...@datafusion.apache.org

Reply via email to