@@ -347,61 +347,59 @@ impl TopK {
347
347
348
348
// Are the new thresholds more selective than our existing ones?
349
349
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 ( ) {
351
352
assert ! ( current. len( ) == thresholds. len( ) ) ;
352
353
// Check if new thresholds are more selective than current ones
353
354
let mut more_selective = false ;
354
355
for ( ( current_value, new_value) , sort_expr) in
355
356
current. iter ( ) . zip ( thresholds. iter ( ) ) . zip ( self . expr . iter ( ) )
356
357
{
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
+ }
378
377
}
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 ;
401
399
}
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
405
403
break ;
406
404
}
407
405
}
@@ -415,6 +413,7 @@ impl TopK {
415
413
more_selective
416
414
} else {
417
415
// No current thresholds, so update with the new ones
416
+ * current = Some ( thresholds. clone ( ) ) ;
418
417
true
419
418
}
420
419
} ;
0 commit comments