@@ -21,8 +21,11 @@ use datafusion::{
21
21
tree_node:: { Transformed , TreeNode , TreeNodeRecursion , TreeNodeRewriter , TreeNodeVisitor } ,
22
22
Result , TableReference ,
23
23
} ,
24
+ physical_expr:: LexOrdering ,
24
25
physical_plan:: {
25
- repartition:: RepartitionExec , ExecutionPlan , ExecutionPlanProperties , Partitioning ,
26
+ repartition:: RepartitionExec ,
27
+ sorts:: { sort:: SortExec , sort_preserving_merge:: SortPreservingMergeExec } ,
28
+ ExecutionPlan , ExecutionPlanProperties , Partitioning ,
26
29
} ,
27
30
} ;
28
31
use hashbrown:: HashMap ;
@@ -120,12 +123,30 @@ impl TreeNodeRewriter for RemoteScanRewriter {
120
123
for child in node. children ( ) {
121
124
let mut visitor = TableNameVisitor :: new ( ) ;
122
125
child. visit ( & mut visitor) ?;
123
- let table_name = visitor. table_name . clone ( ) . unwrap ( ) ;
124
- let remote_scan = Arc :: new ( RemoteScanExec :: new (
125
- child. clone ( ) ,
126
- self . remote_scan_nodes . get_remote_node ( & table_name) ,
127
- ) ?) ;
128
- new_children. push ( remote_scan) ;
126
+ // For sort, we should add a SortPreservingMergeExec
127
+ if child. name ( ) == "SortExec" {
128
+ let table_name = visitor. table_name . clone ( ) . unwrap ( ) ;
129
+ let sort = child. as_any ( ) . downcast_ref :: < SortExec > ( ) . unwrap ( ) ;
130
+ let sort_merge = Arc :: new (
131
+ SortPreservingMergeExec :: new (
132
+ LexOrdering :: new ( sort. expr ( ) . to_vec ( ) ) ,
133
+ Arc :: new ( sort. clone ( ) ) ,
134
+ )
135
+ . with_fetch ( sort. fetch ( ) ) ,
136
+ ) ;
137
+ let remote_scan = Arc :: new ( RemoteScanExec :: new (
138
+ sort_merge,
139
+ self . remote_scan_nodes . get_remote_node ( & table_name) ,
140
+ ) ?) ;
141
+ new_children. push ( remote_scan) ;
142
+ } else {
143
+ let table_name = visitor. table_name . clone ( ) . unwrap ( ) ;
144
+ let remote_scan = Arc :: new ( RemoteScanExec :: new (
145
+ child. clone ( ) ,
146
+ self . remote_scan_nodes . get_remote_node ( & table_name) ,
147
+ ) ?) ;
148
+ new_children. push ( remote_scan) ;
149
+ }
129
150
}
130
151
let new_node = node. with_new_children ( new_children) ?;
131
152
self . is_changed = true ;
0 commit comments