@@ -899,6 +899,29 @@ impl SortExec {
899899 self
900900 }
901901
902+ /// Add or reset `self.filter` to a new `DynamicFilterPhysicalExpr`.
903+ fn create_filter ( & self ) -> Arc < DynamicFilterPhysicalExpr > {
904+ let children = self
905+ . expr
906+ . iter ( )
907+ . map ( |sort_expr| Arc :: clone ( & sort_expr. expr ) )
908+ . collect :: < Vec < _ > > ( ) ;
909+ Arc :: new ( DynamicFilterPhysicalExpr :: new ( children, lit ( true ) ) )
910+ }
911+
912+ fn cloned ( & self ) -> Self {
913+ SortExec {
914+ input : Arc :: clone ( & self . input ) ,
915+ expr : self . expr . clone ( ) ,
916+ metrics_set : self . metrics_set . clone ( ) ,
917+ preserve_partitioning : self . preserve_partitioning ,
918+ common_sort_prefix : self . common_sort_prefix . clone ( ) ,
919+ fetch : self . fetch ,
920+ cache : self . cache . clone ( ) ,
921+ filter : self . filter . clone ( ) ,
922+ }
923+ }
924+
902925 /// Modify how many rows to include in the result
903926 ///
904927 /// If None, then all rows will be returned, in sorted order.
@@ -920,25 +943,13 @@ impl SortExec {
920943 }
921944 let filter = fetch. is_some ( ) . then ( || {
922945 // If we already have a filter, keep it. Otherwise, create a new one.
923- self . filter . clone ( ) . unwrap_or_else ( || {
924- let children = self
925- . expr
926- . iter ( )
927- . map ( |sort_expr| Arc :: clone ( & sort_expr. expr ) )
928- . collect :: < Vec < _ > > ( ) ;
929- Arc :: new ( DynamicFilterPhysicalExpr :: new ( children, lit ( true ) ) )
930- } )
946+ self . filter . clone ( ) . unwrap_or_else ( || self . create_filter ( ) )
931947 } ) ;
932- SortExec {
933- input : Arc :: clone ( & self . input ) ,
934- expr : self . expr . clone ( ) ,
935- metrics_set : self . metrics_set . clone ( ) ,
936- preserve_partitioning : self . preserve_partitioning ,
937- common_sort_prefix : self . common_sort_prefix . clone ( ) ,
938- fetch,
939- cache,
940- filter,
941- }
948+ let mut new_sort = self . cloned ( ) ;
949+ new_sort. fetch = fetch;
950+ new_sort. cache = cache;
951+ new_sort. filter = filter;
952+ new_sort
942953 }
943954
944955 /// Input schema
@@ -1110,10 +1121,35 @@ impl ExecutionPlan for SortExec {
11101121 self : Arc < Self > ,
11111122 children : Vec < Arc < dyn ExecutionPlan > > ,
11121123 ) -> Result < Arc < dyn ExecutionPlan > > {
1113- let mut new_sort = SortExec :: new ( self . expr . clone ( ) , Arc :: clone ( & children[ 0 ] ) )
1114- . with_fetch ( self . fetch )
1115- . with_preserve_partitioning ( self . preserve_partitioning ) ;
1116- new_sort. filter = self . filter . clone ( ) ;
1124+ let mut new_sort = self . cloned ( ) ;
1125+ assert ! (
1126+ children. len( ) == 1 ,
1127+ "SortExec should have exactly one child"
1128+ ) ;
1129+ new_sort. input = Arc :: clone ( & children[ 0 ] ) ;
1130+ // Recompute the properties based on the new input since they may have changed
1131+ let ( cache, sort_prefix) = Self :: compute_properties (
1132+ & new_sort. input ,
1133+ new_sort. expr . clone ( ) ,
1134+ new_sort. preserve_partitioning ,
1135+ ) ?;
1136+ new_sort. cache = cache;
1137+ new_sort. common_sort_prefix = sort_prefix;
1138+
1139+ Ok ( Arc :: new ( new_sort) )
1140+ }
1141+
1142+ fn reset_state ( self : Arc < Self > ) -> Result < Arc < dyn ExecutionPlan > > {
1143+ let children = self . children ( ) . into_iter ( ) . cloned ( ) . collect ( ) ;
1144+ let new_sort = self . with_new_children ( children) ?;
1145+ let mut new_sort = new_sort
1146+ . as_any ( )
1147+ . downcast_ref :: < SortExec > ( )
1148+ . expect ( "cloned 1 lines above this line, we know the type" )
1149+ . clone ( ) ;
1150+ // Our dynamic filter and execution metrics are the state we need to reset.
1151+ new_sort. filter = Some ( new_sort. create_filter ( ) ) ;
1152+ new_sort. metrics_set = ExecutionPlanMetricsSet :: new ( ) ;
11171153
11181154 Ok ( Arc :: new ( new_sort) )
11191155 }
0 commit comments