Skip to content

Commit 7585509

Browse files
authored
feat: split computation of primitive statistics (#1306)
1 parent fed92df commit 7585509

File tree

10 files changed

+226
-167
lines changed

10 files changed

+226
-167
lines changed

encodings/fastlanes/src/bitpacking/compute/search_sorted.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ impl<T: BitPacking + NativePType> IndexOrd<T> for BitPackedSearch<'_, T> {
177177
idx + self.offset as usize,
178178
)
179179
};
180-
Some(val.compare(*elem))
180+
Some(val.total_compare(*elem))
181181
}
182182
}
183183

encodings/runend/src/compress.rs

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@ use std::cmp::min;
33
use itertools::Itertools;
44
use num_traits::{AsPrimitive, FromPrimitive};
55
use vortex_array::array::PrimitiveArray;
6-
use vortex_array::compute::unary::scalar_at;
7-
use vortex_array::stats::{ArrayStatistics, Stat};
86
use vortex_array::validity::Validity;
97
use vortex_array::variants::PrimitiveArrayTrait;
108
use vortex_array::ArrayDType;
119
use vortex_dtype::{match_each_integer_ptype, match_each_native_ptype, NativePType, Nullability};
12-
use vortex_error::{vortex_panic, VortexResult, VortexUnwrap as _};
10+
use vortex_error::{vortex_panic, VortexResult};
1311

1412
pub fn runend_encode(array: &PrimitiveArray) -> (PrimitiveArray, PrimitiveArray) {
1513
let validity = if array.dtype().nullability() == Nullability::NonNullable {
@@ -23,48 +21,6 @@ pub fn runend_encode(array: &PrimitiveArray) -> (PrimitiveArray, PrimitiveArray)
2321
(PrimitiveArray::from_vec(ends, Validity::NonNullable), PrimitiveArray::from_vec(values, validity))
2422
});
2523

26-
// the values array stats are trivially derived
27-
compressed_values
28-
.statistics()
29-
.set(Stat::RunCount, compressed_values.len().into());
30-
compressed_values
31-
.statistics()
32-
.set(Stat::IsConstant, (compressed_values.len() == 1).into());
33-
if let Some(min) = array.statistics().get(Stat::Min) {
34-
compressed_values.statistics().set(Stat::Min, min);
35-
}
36-
if let Some(max) = array.statistics().get(Stat::Max) {
37-
compressed_values.statistics().set(Stat::Max, max);
38-
}
39-
if let Some(is_sorted) = array.statistics().get(Stat::IsSorted) {
40-
compressed_values
41-
.statistics()
42-
.set(Stat::IsSorted, is_sorted);
43-
}
44-
if let Some(is_strict_sorted) = array.statistics().get(Stat::IsStrictSorted) {
45-
compressed_values
46-
.statistics()
47-
.set(Stat::IsStrictSorted, is_strict_sorted);
48-
}
49-
50-
compressed_ends
51-
.statistics()
52-
.set(Stat::IsConstant, (compressed_ends.len() == 1).into());
53-
compressed_ends
54-
.statistics()
55-
.set(Stat::IsSorted, true.into());
56-
compressed_ends
57-
.statistics()
58-
.set(Stat::IsStrictSorted, true.into());
59-
if !compressed_ends.is_empty() {
60-
compressed_ends
61-
.statistics()
62-
.set(Stat::Min, scalar_at(&compressed_ends, 0).vortex_unwrap());
63-
compressed_ends
64-
.statistics()
65-
.set(Stat::Max, (array.len() as u64).into());
66-
}
67-
6824
assert_eq!(array.dtype(), compressed_values.dtype());
6925
(compressed_ends, compressed_values)
7026
}

encodings/zigzag/src/compress.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ pub fn zigzag_decode(parray: PrimitiveArray) -> VortexResult<PrimitiveArray> {
4848
parray.ptype()
4949
),
5050
};
51-
decoded.inherit_statistics(parray.statistics());
5251
Ok(decoded)
5352
}
5453

fuzz/src/search_sorted.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ impl<T: NativePType> IndexOrd<Option<T>> for SearchPrimitiveSlice<T> {
4242
// SAFETY: Used in search_sorted_by same as the standard library. The search_sorted ensures idx is in bounds
4343
match unsafe { self.0.get_unchecked(idx) } {
4444
None => Some(Ordering::Greater),
45-
Some(i) => Some(i.compare(*v)),
45+
Some(i) => Some(i.total_compare(*v)),
4646
}
4747
}
4848
}

fuzz/src/sort.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ pub fn sort_canonical_array(array: &Array) -> Array {
7676

7777
fn sort_primitive_slice<T: NativePType>(s: &mut [Option<T>]) {
7878
s.sort_by(|a, b| match (a, b) {
79-
(Some(v), Some(w)) => v.compare(*w),
79+
(Some(v), Some(w)) => v.total_compare(*w),
8080
(None, None) => Ordering::Equal,
8181
(None, Some(_)) => Ordering::Greater,
8282
(Some(_), None) => Ordering::Less,

vortex-array/src/array/primitive/compute/search_sorted.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ impl<'a, T: NativePType> SearchSortedPrimitive<'a, T> {
6767
impl<T: NativePType> IndexOrd<T> for SearchSortedPrimitive<'_, T> {
6868
fn index_cmp(&self, idx: usize, elem: &T) -> Option<Ordering> {
6969
// SAFETY: Used in search_sorted_by same as the standard library. The search_sorted ensures idx is in bounds
70-
Some(unsafe { self.values.get_unchecked(idx) }.compare(*elem))
70+
Some(unsafe { self.values.get_unchecked(idx) }.total_compare(*elem))
7171
}
7272
}
7373

0 commit comments

Comments
 (0)