59
59
//!
60
60
61
61
use std:: fmt:: Debug ;
62
+ use std:: ops:: Deref ;
62
63
use std:: task:: { Context , Poll } ;
63
64
use std:: { any:: Any , collections:: BTreeMap , fmt, sync:: Arc } ;
64
65
@@ -97,7 +98,8 @@ use datafusion::{
97
98
use datafusion_common:: config:: ConfigOptions ;
98
99
use datafusion_common:: tree_node:: { Transformed , TransformedResult , TreeNode } ;
99
100
use datafusion_common:: ScalarValue ;
100
- use datafusion_expr:: Projection ;
101
+ use datafusion_expr:: tree_node:: replace_sort_expression;
102
+ use datafusion_expr:: { Projection , SortExpr } ;
101
103
use datafusion_optimizer:: optimizer:: ApplyOrder ;
102
104
use datafusion_optimizer:: AnalyzerRule ;
103
105
@@ -375,7 +377,7 @@ impl OptimizerRule for TopKOptimizerRule {
375
377
node : Arc :: new ( TopKPlanNode {
376
378
k : * fetch,
377
379
input : input. as_ref ( ) . clone ( ) ,
378
- expr : expr[ 0 ] . clone ( ) ,
380
+ expr : expr[ 0 ] . unwrap_sort ( ) . clone ( ) ,
379
381
} ) ,
380
382
} ) ) ) ;
381
383
}
@@ -392,7 +394,7 @@ struct TopKPlanNode {
392
394
input : LogicalPlan ,
393
395
/// The sort expression (this example only supports a single sort
394
396
/// expr)
395
- expr : Expr ,
397
+ expr : SortExpr ,
396
398
}
397
399
398
400
impl Debug for TopKPlanNode {
@@ -418,7 +420,7 @@ impl UserDefinedLogicalNodeCore for TopKPlanNode {
418
420
}
419
421
420
422
fn expressions ( & self ) -> Vec < Expr > {
421
- vec ! [ self . expr. clone( ) ]
423
+ vec ! [ self . expr. expr . deref ( ) . clone( ) ]
422
424
}
423
425
424
426
/// For example: `TopK: k=10`
@@ -436,7 +438,7 @@ impl UserDefinedLogicalNodeCore for TopKPlanNode {
436
438
Ok ( Self {
437
439
k : self . k ,
438
440
input : inputs. swap_remove ( 0 ) ,
439
- expr : exprs. swap_remove ( 0 ) ,
441
+ expr : replace_sort_expression ( self . expr . clone ( ) , exprs. swap_remove ( 0 ) ) ,
440
442
} )
441
443
}
442
444
}
0 commit comments