@@ -131,6 +131,7 @@ impl CubeScanWrapperNode {
131131fn expr_name ( e : & Expr , schema : & Arc < DFSchema > ) -> Result < String > {
132132 match e {
133133 Expr :: Column ( col) => Ok ( col. name . clone ( ) ) ,
134+ Expr :: Sort { expr, .. } => expr_name ( expr, schema) ,
134135 _ => e. name ( schema) ,
135136 }
136137}
@@ -276,7 +277,7 @@ impl CubeScanWrapperNode {
276277 having_expr : _having_expr,
277278 limit,
278279 offset,
279- order_expr : _order_expr ,
280+ order_expr,
280281 alias,
281282 ungrouped,
282283 } ) = wrapped_select_node
@@ -368,7 +369,7 @@ impl CubeScanWrapperNode {
368369 let ( projection, sql) = Self :: generate_column_expr (
369370 plan. clone ( ) ,
370371 schema. clone ( ) ,
371- projection_expr,
372+ projection_expr. clone ( ) ,
372373 sql,
373374 generator. clone ( ) ,
374375 & column_remapping,
@@ -381,7 +382,7 @@ impl CubeScanWrapperNode {
381382 let ( group_by, sql) = Self :: generate_column_expr (
382383 plan. clone ( ) ,
383384 schema. clone ( ) ,
384- group_expr,
385+ group_expr. clone ( ) ,
385386 sql,
386387 generator. clone ( ) ,
387388 & column_remapping,
@@ -391,10 +392,23 @@ impl CubeScanWrapperNode {
391392 ungrouped_scan_node. clone ( ) ,
392393 )
393394 . await ?;
394- let ( aggregate, mut sql) = Self :: generate_column_expr (
395+ let ( aggregate, sql) = Self :: generate_column_expr (
395396 plan. clone ( ) ,
396397 schema. clone ( ) ,
397- aggr_expr,
398+ aggr_expr. clone ( ) ,
399+ sql,
400+ generator. clone ( ) ,
401+ & column_remapping,
402+ & mut next_remapping,
403+ alias. clone ( ) ,
404+ can_rename_columns,
405+ ungrouped_scan_node. clone ( ) ,
406+ )
407+ . await ?;
408+ let ( order, mut sql) = Self :: generate_column_expr (
409+ plan. clone ( ) ,
410+ schema. clone ( ) ,
411+ order_expr. clone ( ) ,
398412 sql,
399413 generator. clone ( ) ,
400414 & column_remapping,
@@ -437,6 +451,60 @@ impl CubeScanWrapperNode {
437451 } )
438452 . collect :: < Result < _ > > ( ) ?,
439453 ) ;
454+ if !order_expr. is_empty ( ) {
455+ load_request. order = Some (
456+ order_expr
457+ . iter ( )
458+ . map ( |o| -> Result < _ > { match o {
459+ Expr :: Sort {
460+ expr,
461+ asc,
462+ ..
463+ } => {
464+ let col_name = expr_name ( & expr, & schema) ?;
465+ let aliased_column = aggr_expr
466+ . iter ( )
467+ . find_position ( |e| {
468+ expr_name ( e, & schema) . map ( |n| & n == & col_name) . unwrap_or ( false )
469+ } )
470+ . map ( |( i, _) | aggregate[ i] . clone ( ) ) . or_else ( || {
471+ projection_expr
472+ . iter ( )
473+ . find_position ( |e| {
474+ expr_name ( e, & schema) . map ( |n| & n == & col_name) . unwrap_or ( false )
475+ } )
476+ . map ( |( i, _) | {
477+ projection[ i] . clone ( )
478+ } )
479+ } ) . or_else ( || {
480+ group_expr
481+ . iter ( )
482+ . find_position ( |e| {
483+ expr_name ( e, & schema) . map ( |n| & n == & col_name) . unwrap_or ( false )
484+ } )
485+ . map ( |( i, _) | group_by[ i] . clone ( ) )
486+ } ) . ok_or_else ( || {
487+ DataFusionError :: Execution ( format ! (
488+ "Can't find column {} in projection {:?} or aggregate {:?} or group {:?}" ,
489+ col_name,
490+ projection,
491+ aggregate,
492+ group_by
493+ ) )
494+ } ) ?;
495+ Ok ( vec ! [
496+ aliased_column. alias. clone( ) ,
497+ if * asc { "asc" . to_string( ) } else { "desc" . to_string( ) } ,
498+ ] )
499+ }
500+ _ => Err ( DataFusionError :: Execution ( format ! (
501+ "Expected sort expression, found {:?}" ,
502+ o
503+ ) ) ) ,
504+ } } )
505+ . collect :: < Result < Vec < _ > > > ( ) ?,
506+ ) ;
507+ }
440508 load_request. ungrouped =
441509 if let WrappedSelectType :: Projection = select_type {
442510 load_request. ungrouped . clone ( )
@@ -479,7 +547,7 @@ impl CubeScanWrapperNode {
479547 from_alias. unwrap_or ( "" . to_string ( ) ) ,
480548 None ,
481549 None ,
482- Vec :: new ( ) ,
550+ order ,
483551 limit,
484552 offset,
485553 )
@@ -841,7 +909,33 @@ impl CubeScanWrapperNode {
841909 }
842910 // Expr::Cast { .. } => {}
843911 // Expr::TryCast { .. } => {}
844- // Expr::Sort { .. } => {}
912+ Expr :: Sort {
913+ expr,
914+ asc,
915+ nulls_first,
916+ } => {
917+ let ( expr, sql_query) = Self :: generate_sql_for_expr (
918+ plan. clone ( ) ,
919+ sql_query,
920+ sql_generator. clone ( ) ,
921+ * expr,
922+ ungrouped_scan_node. clone ( ) ,
923+ )
924+ . await ?;
925+ let resulting_sql = Self :: escape_interpolation_quotes (
926+ sql_generator
927+ . get_sql_templates ( )
928+ . sort_expr ( expr, asc, nulls_first)
929+ . map_err ( |e| {
930+ DataFusionError :: Internal ( format ! (
931+ "Can't generate SQL for sort expr: {}" ,
932+ e
933+ ) )
934+ } ) ?,
935+ ungrouped_scan_node. is_some ( ) ,
936+ ) ;
937+ Ok ( ( resulting_sql, sql_query) )
938+ }
845939 // Expr::ScalarUDF { .. } => {}
846940 // Expr::TableUDF { .. } => {}
847941 Expr :: Literal ( literal) => {
0 commit comments