@@ -1531,12 +1531,17 @@ impl PhysicalPlanner {
1531
1531
partition_by : & [ Arc < dyn PhysicalExpr > ] ,
1532
1532
sort_exprs : & [ PhysicalSortExpr ] ,
1533
1533
) -> Result < Arc < dyn WindowExpr > , ExecutionError > {
1534
- let ( mut window_func_name, mut window_func_args) = ( String :: new ( ) , Vec :: new ( ) ) ;
1534
+ let window_func_name: String ;
1535
+ let window_args: Vec < Arc < dyn PhysicalExpr > > ;
1535
1536
if let Some ( func) = & spark_expr. built_in_window_function {
1536
1537
match & func. expr_struct {
1537
1538
Some ( ExprStruct :: ScalarFunc ( f) ) => {
1538
- window_func_name. clone_from ( & f. func ) ;
1539
- window_func_args. clone_from ( & f. args ) ;
1539
+ window_func_name = f. func . clone ( ) ;
1540
+ window_args = f
1541
+ . args
1542
+ . iter ( )
1543
+ . map ( |expr| self . create_expr ( expr, input_schema. clone ( ) ) )
1544
+ . collect :: < Result < Vec < _ > , ExecutionError > > ( ) ?;
1540
1545
}
1541
1546
other => {
1542
1547
return Err ( ExecutionError :: GeneralError ( format ! (
@@ -1545,9 +1550,9 @@ impl PhysicalPlanner {
1545
1550
}
1546
1551
} ;
1547
1552
} else if let Some ( agg_func) = & spark_expr. agg_func {
1548
- let result = Self :: process_agg_func ( agg_func) ?;
1553
+ let result = self . process_agg_func ( agg_func, input_schema . clone ( ) ) ?;
1549
1554
window_func_name = result. 0 ;
1550
- window_func_args = result. 1 ;
1555
+ window_args = result. 1 ;
1551
1556
} else {
1552
1557
return Err ( ExecutionError :: GeneralError (
1553
1558
"Both func and agg_func are not set" . to_string ( ) ,
@@ -1563,11 +1568,6 @@ impl PhysicalPlanner {
1563
1568
}
1564
1569
} ;
1565
1570
1566
- let window_args = window_func_args
1567
- . iter ( )
1568
- . map ( |expr| self . create_expr ( expr, input_schema. clone ( ) ) )
1569
- . collect :: < Result < Vec < _ > , ExecutionError > > ( ) ?;
1570
-
1571
1571
let spark_window_frame = match spark_expr
1572
1572
. spec
1573
1573
. as_ref ( )
@@ -1637,32 +1637,33 @@ impl PhysicalPlanner {
1637
1637
. map_err ( |e| ExecutionError :: DataFusionError ( e. to_string ( ) ) )
1638
1638
}
1639
1639
1640
- fn process_agg_func ( agg_func : & AggExpr ) -> Result < ( String , Vec < Expr > ) , ExecutionError > {
1641
- fn optional_expr_to_vec ( expr_option : & Option < Expr > ) -> Vec < Expr > {
1642
- expr_option
1643
- . as_ref ( )
1644
- . cloned ( )
1645
- . map_or_else ( Vec :: new, |e| vec ! [ e] )
1646
- }
1647
-
1648
- fn int_to_stats_type ( value : i32 ) -> Option < StatsType > {
1649
- match value {
1650
- 0 => Some ( StatsType :: Sample ) ,
1651
- 1 => Some ( StatsType :: Population ) ,
1652
- _ => None ,
1653
- }
1654
- }
1655
-
1640
+ fn process_agg_func (
1641
+ & self ,
1642
+ agg_func : & AggExpr ,
1643
+ schema : SchemaRef ,
1644
+ ) -> Result < ( String , Vec < Arc < dyn PhysicalExpr > > ) , ExecutionError > {
1656
1645
match & agg_func. expr_struct {
1657
1646
Some ( AggExprStruct :: Count ( expr) ) => {
1658
- let args = & expr. children ;
1659
- Ok ( ( "count" . to_string ( ) , args. to_vec ( ) ) )
1647
+ let children = expr
1648
+ . children
1649
+ . iter ( )
1650
+ . map ( |child| self . create_expr ( child, schema. clone ( ) ) )
1651
+ . collect :: < Result < Vec < _ > , _ > > ( ) ?;
1652
+ Ok ( ( "count" . to_string ( ) , children) )
1660
1653
}
1661
1654
Some ( AggExprStruct :: Min ( expr) ) => {
1662
- Ok ( ( "min" . to_string ( ) , optional_expr_to_vec ( & expr. child ) ) )
1655
+ let child = self . create_expr ( expr. child . as_ref ( ) . unwrap ( ) , schema. clone ( ) ) ?;
1656
+ Ok ( ( "min" . to_string ( ) , vec ! [ child] ) )
1663
1657
}
1664
1658
Some ( AggExprStruct :: Max ( expr) ) => {
1665
- Ok ( ( "max" . to_string ( ) , optional_expr_to_vec ( & expr. child ) ) )
1659
+ let child = self . create_expr ( expr. child . as_ref ( ) . unwrap ( ) , schema. clone ( ) ) ?;
1660
+ Ok ( ( "max" . to_string ( ) , vec ! [ child] ) )
1661
+ }
1662
+ Some ( AggExprStruct :: Sum ( expr) ) => {
1663
+ let child = self . create_expr ( expr. child . as_ref ( ) . unwrap ( ) , schema. clone ( ) ) ?;
1664
+ let datatype = to_arrow_datatype ( expr. datatype . as_ref ( ) . unwrap ( ) ) ;
1665
+ let child = Arc :: new ( CastExpr :: new ( child, datatype. clone ( ) , None ) ) ;
1666
+ Ok ( ( "sum" . to_string ( ) , vec ! [ child] ) )
1666
1667
}
1667
1668
other => Err ( ExecutionError :: GeneralError ( format ! (
1668
1669
"{other:?} not supported for window function"
0 commit comments