Skip to content

Commit ddd8d24

Browse files
committed
refactor
1 parent 30a2195 commit ddd8d24

File tree

1 file changed

+46
-47
lines changed
  • datafusion/physical-plan/src/topk

1 file changed

+46
-47
lines changed

datafusion/physical-plan/src/topk/mod.rs

Lines changed: 46 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)