@@ -155,6 +155,20 @@ impl InMemoryGenerator {
155155 }
156156 } ;
157157
158+ let fallback_sort = quote ! {
159+ let mut items: Vec <#row_type> = iter. collect( ) ;
160+ items. sort_by( |a, b| {
161+ for ( order, col) in & self . params. order {
162+ match col {
163+ #( #order_matches) *
164+ _ => continue ,
165+ }
166+ }
167+ std:: cmp:: Ordering :: Equal
168+ } ) ;
169+ iter = Box :: new( items. into_iter( ) ) ;
170+ } ;
171+
158172 quote ! {
159173 impl <I > SelectQueryExecutor <#row_type, I , #column_range_type, #row_fields_ident>
160174 for SelectQueryBuilder <#row_type, I , #column_range_type, #row_fields_ident>
@@ -181,19 +195,30 @@ impl InMemoryGenerator {
181195 #range
182196
183197 if !self . params. order. is_empty( ) {
184- let mut items: Vec <#row_type> = iter. collect( ) ;
185-
186- items. sort_by( |a, b| {
187- for ( order, col) in & self . params. order {
188- match col {
189- #( #order_matches) *
190- _ => continue ,
198+ // Optimization: single order on pre-sorted column with no additional range filters
199+ let can_optimize = self . params. sorted_by. is_some( )
200+ && self . params. range. is_empty( )
201+ && self . params. order. len( ) == 1 ;
202+
203+ if can_optimize {
204+ let ( order, col) = & self . params. order[ 0 ] ;
205+ let sorted_col = self . params. sorted_by. as_ref( ) . unwrap( ) ;
206+
207+ if col == sorted_col {
208+ match order {
209+ Order :: Desc => {
210+ iter = Box :: new( iter. rev( ) ) ;
211+ }
212+ Order :: Asc => {
213+ // Already sorted correctly, no action needed
214+ }
191215 }
216+ } else {
217+ #fallback_sort
192218 }
193- std:: cmp:: Ordering :: Equal
194- } ) ;
195-
196- iter = Box :: new( items. into_iter( ) ) ;
219+ } else {
220+ #fallback_sort
221+ }
197222 }
198223
199224 let iter_result: Box <dyn Iterator <Item = #row_type>> = if let Some ( offset) = self . params. offset {
0 commit comments