@@ -319,21 +319,25 @@ fn find_window_fn(
319319}
320320
321321/// Creates a new Window function expression
322+ #[ allow( clippy:: too_many_arguments) ]
322323#[ pyfunction]
323- #[ pyo3( signature = ( name, args, partition_by=None , order_by=None , window_frame=None , ctx=None ) ) ]
324+ #[ pyo3( signature = ( name, args, partition_by=None , order_by=None , window_frame=None , filter= None , distinct= false , ctx=None ) ) ]
324325fn window (
325326 name : & str ,
326327 args : Vec < PyExpr > ,
327328 partition_by : Option < Vec < PyExpr > > ,
328329 order_by : Option < Vec < PySortExpr > > ,
329330 window_frame : Option < PyWindowFrame > ,
331+ filter : Option < PyExpr > ,
332+ distinct : bool ,
330333 ctx : Option < PySessionContext > ,
331334) -> PyResult < PyExpr > {
332335 let fun = find_window_fn ( name, ctx) ?;
333336
334337 let window_frame = window_frame
335338 . map ( |w| w. into ( ) )
336339 . unwrap_or ( WindowFrame :: new ( order_by. as_ref ( ) . map ( |v| !v. is_empty ( ) ) ) ) ;
340+ let filter = filter. map ( |f| f. expr . into ( ) ) ;
337341
338342 Ok ( PyExpr {
339343 expr : datafusion:: logical_expr:: Expr :: WindowFunction ( Box :: new ( WindowFunction {
@@ -351,6 +355,8 @@ fn window(
351355 . map ( |x| x. into ( ) )
352356 . collect :: < Vec < _ > > ( ) ,
353357 window_frame,
358+ filter,
359+ distinct,
354360 null_treatment : None ,
355361 } ,
356362 } ) ) ,
@@ -649,36 +655,36 @@ aggregate_function!(approx_median);
649655// aggregate_function!(grouping);
650656
651657#[ pyfunction]
652- #[ pyo3( signature = ( expression , percentile, num_centroids=None , filter=None ) ) ]
658+ #[ pyo3( signature = ( sort_expression , percentile, num_centroids=None , filter=None ) ) ]
653659pub fn approx_percentile_cont (
654- expression : PyExpr ,
660+ sort_expression : PySortExpr ,
655661 percentile : f64 ,
656662 num_centroids : Option < i64 > , // enforces optional arguments at the end, currently
657663 filter : Option < PyExpr > ,
658664) -> PyDataFusionResult < PyExpr > {
659- let args = if let Some ( num_centroids) = num_centroids {
660- vec ! [ expression. expr, lit( percentile) , lit( num_centroids) ]
661- } else {
662- vec ! [ expression. expr, lit( percentile) ]
663- } ;
664- let udaf = functions_aggregate:: approx_percentile_cont:: approx_percentile_cont_udaf ( ) ;
665- let agg_fn = udaf. call ( args) ;
665+ let agg_fn = functions_aggregate:: expr_fn:: approx_percentile_cont (
666+ sort_expression. sort ,
667+ lit ( percentile) ,
668+ num_centroids. map ( lit) ,
669+ ) ;
666670
667671 add_builder_fns_to_aggregate ( agg_fn, None , filter, None , None )
668672}
669673
670674#[ pyfunction]
671- #[ pyo3( signature = ( expression , weight, percentile, filter=None ) ) ]
675+ #[ pyo3( signature = ( sort_expression , weight, percentile, num_centroids= None , filter=None ) ) ]
672676pub fn approx_percentile_cont_with_weight (
673- expression : PyExpr ,
677+ sort_expression : PySortExpr ,
674678 weight : PyExpr ,
675679 percentile : f64 ,
680+ num_centroids : Option < i64 > ,
676681 filter : Option < PyExpr > ,
677682) -> PyDataFusionResult < PyExpr > {
678683 let agg_fn = functions_aggregate:: expr_fn:: approx_percentile_cont_with_weight (
679- expression . expr ,
684+ sort_expression . sort ,
680685 weight. expr ,
681686 lit ( percentile) ,
687+ num_centroids. map ( lit) ,
682688 ) ;
683689
684690 add_builder_fns_to_aggregate ( agg_fn, None , filter, None , None )
0 commit comments