@@ -347,61 +347,59 @@ impl TopK {
347347
348348 // Are the new thresholds more selective than our existing ones?
349349 let should_update = {
350- if let Some ( current) = self . filter . thresholds . write ( ) . as_mut ( ) {
350+ let mut current = self . filter . thresholds . write ( ) ;
351+ if let Some ( current) = current. as_mut ( ) {
351352 assert ! ( current. len( ) == thresholds. len( ) ) ;
352353 // Check if new thresholds are more selective than current ones
353354 let mut more_selective = false ;
354355 for ( ( current_value, new_value) , sort_expr) in
355356 current. iter ( ) . zip ( thresholds. iter ( ) ) . zip ( self . expr . iter ( ) )
356357 {
357- // Handle null cases
358- let ( current_is_null, new_is_null) =
359- ( current_value. is_null ( ) , new_value. is_null ( ) ) ;
360-
361- match ( current_is_null, new_is_null) {
362- ( true , true ) => {
363- // Both null, continue checking next values
364- }
365- ( true , false ) => {
366- // Current is null, new is not null
367- // For nulls_first: null < non-null, so new value is less selective
368- // For nulls_last: null > non-null, so new value is more selective
369- more_selective = !sort_expr. options . nulls_first ;
370- break ;
371- }
372- ( false , true ) => {
373- // Current is not null, new is null
374- // For nulls_first: non-null > null, so new value is more selective
375- // For nulls_last: non-null < null, so new value is less selective
376- more_selective = sort_expr. options . nulls_first ;
377- break ;
358+ match current_value. partial_cmp ( new_value) {
359+ Some ( ordering) => {
360+ match ordering {
361+ Ordering :: Equal => {
362+ // Continue checking next values
363+ }
364+ Ordering :: Less => {
365+ // For descending sort: new > current means more selective
366+ // For ascending sort: new > current means less selective
367+ more_selective = sort_expr. options . descending ;
368+ break ;
369+ }
370+ Ordering :: Greater => {
371+ // For descending sort: new < current means less selective
372+ // For ascending sort: new < current means more selective
373+ more_selective = !sort_expr. options . descending ;
374+ break ;
375+ }
376+ }
378377 }
379- ( false , false ) => {
380- // Neither is null, compare values
381- match current_value. partial_cmp ( new_value) {
382- Some ( ordering) => {
383- match ordering {
384- Ordering :: Equal => {
385- // Continue checking next values
386- }
387- Ordering :: Less => {
388- // For descending sort: new > current means more selective
389- // For ascending sort: new > current means less selective
390- more_selective = sort_expr. options . descending ;
391- break ;
392- }
393- Ordering :: Greater => {
394- // For descending sort: new < current means less selective
395- // For ascending sort: new < current means more selective
396- more_selective =
397- !sort_expr. options . descending ;
398- break ;
399- }
400- }
378+ None => {
379+ // One of the values is null or not comparable
380+ let current_is_null = current_value. is_null ( ) ;
381+ let new_is_null = new_value. is_null ( ) ;
382+ match ( current_is_null, new_is_null) {
383+ ( true , true ) => {
384+ // Both null, continue checking next values
385+ }
386+ ( true , false ) => {
387+ // Current is null, new is not null
388+ // For nulls_first: null < non-null, so new value is less selective
389+ // For nulls_last: null > non-null, so new value is more selective
390+ more_selective = !sort_expr. options . nulls_first ;
391+ break ;
392+ }
393+ ( false , true ) => {
394+ // Current is not null, new is null
395+ // For nulls_first: non-null > null, so new value is more selective
396+ // For nulls_last: non-null < null, so new value is less selective
397+ more_selective = sort_expr. options . nulls_first ;
398+ break ;
401399 }
402- None => {
403- // If values can't be compared, don 't update
404- more_selective = false ;
400+ ( false , false ) => {
401+ // Neither is null, we can 't compare them
402+ // This means we can't determine selectivity, so we assume that the new filter is more selective
405403 break ;
406404 }
407405 }
@@ -415,6 +413,7 @@ impl TopK {
415413 more_selective
416414 } else {
417415 // No current thresholds, so update with the new ones
416+ * current = Some ( thresholds. clone ( ) ) ;
418417 true
419418 }
420419 } ;
0 commit comments