Skip to content

Commit 4e2dc07

Browse files
committed
tests for primitive
Signed-off-by: Andrew Duffy <[email protected]>
1 parent 7e713ce commit 4e2dc07

File tree

1 file changed

+156
-0
lines changed

1 file changed

+156
-0
lines changed

vortex-compute/src/filter/vector/primitive.rs

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,159 @@ impl Filter<MaskIndices<'_>> for &mut PrimitiveVectorMut {
3838
match_each_pvector_mut!(self, |v| { v.filter(indices) })
3939
}
4040
}
41+
42+
#[cfg(test)]
43+
mod tests {
44+
use vortex_dtype::PTypeDowncast;
45+
use vortex_mask::Mask;
46+
use vortex_vector::primitive::PVectorMut;
47+
use vortex_vector::{VectorMutOps, VectorOps};
48+
49+
use super::*;
50+
51+
#[test]
52+
fn test_filter_primitive_vector_with_mask() {
53+
let vec = PrimitiveVector::from(
54+
PVectorMut::<i32>::from_iter([100, 200, 300, 400, 500].map(Some)).freeze(),
55+
);
56+
57+
let mask = Mask::from_iter([true, false, true, false, true]);
58+
59+
let filtered = (&vec).filter(&mask);
60+
61+
assert_eq!(filtered.len(), 3);
62+
assert_eq!(filtered.validity().true_count(), 3);
63+
let p32 = filtered.into_i32();
64+
assert_eq!(p32.get(0), Some(&100));
65+
assert_eq!(p32.get(1), Some(&300));
66+
assert_eq!(p32.get(2), Some(&500));
67+
}
68+
69+
#[test]
70+
fn test_filter_primitive_vector_with_mask_indices() {
71+
let vec = PrimitiveVector::from(
72+
PVectorMut::<i32>::from_iter([100, 200, 300, 400, 500].map(Some)).freeze(),
73+
);
74+
75+
let indices = unsafe { MaskIndices::new_unchecked(&[0, 2, 4]) };
76+
77+
let filtered = (&vec).filter(&indices);
78+
79+
assert_eq!(filtered.len(), 3);
80+
assert_eq!(filtered.validity().true_count(), 3);
81+
let p32 = filtered.into_i32();
82+
assert_eq!(p32.get(0), Some(&100));
83+
assert_eq!(p32.get(1), Some(&300));
84+
assert_eq!(p32.get(2), Some(&500));
85+
}
86+
87+
#[test]
88+
fn test_filter_primitive_vector_with_nulls() {
89+
let vec = PrimitiveVector::from(
90+
PVectorMut::<i64>::from_iter([Some(1000), None, Some(3000), Some(4000), None]).freeze(),
91+
);
92+
93+
let mask = Mask::from_iter([true, true, false, true, false]);
94+
95+
let filtered = (&vec).filter(&mask);
96+
97+
assert_eq!(filtered.len(), 3);
98+
assert_eq!(filtered.validity().true_count(), 2);
99+
let p64 = filtered.into_i64();
100+
assert_eq!(p64.get(0), Some(&1000));
101+
assert_eq!(p64.get(1), None);
102+
assert_eq!(p64.get(2), Some(&4000));
103+
}
104+
105+
#[test]
106+
fn test_filter_primitive_vector_all_true() {
107+
let vec =
108+
PrimitiveVector::from(PVectorMut::<i32>::from_iter([100, 200, 300].map(Some)).freeze());
109+
110+
let mask = Mask::new_true(3);
111+
112+
let filtered = (&vec).filter(&mask);
113+
114+
assert_eq!(filtered.len(), 3);
115+
let p32 = filtered.into_i32();
116+
assert_eq!(p32.get(0), Some(&100));
117+
assert_eq!(p32.get(1), Some(&200));
118+
assert_eq!(p32.get(2), Some(&300));
119+
}
120+
121+
#[test]
122+
fn test_filter_primitive_vector_all_false() {
123+
let vec =
124+
PrimitiveVector::from(PVectorMut::<i32>::from_iter([100, 200, 300].map(Some)).freeze());
125+
126+
let mask = Mask::new_false(3);
127+
128+
let filtered = (&vec).filter(&mask);
129+
130+
assert_eq!(filtered.len(), 0);
131+
}
132+
133+
#[test]
134+
fn test_filter_primitive_vector_mut_with_mask() {
135+
let mut vec = PrimitiveVectorMut::from(PVectorMut::<i32>::from_iter(
136+
[100, 200, 300, 400, 500].map(Some),
137+
));
138+
139+
let mask = Mask::from_iter([true, false, true, false, true]);
140+
141+
(&mut vec).filter(&mask);
142+
143+
assert_eq!(vec.len(), 3);
144+
let frozen = vec.freeze();
145+
assert_eq!(frozen.len(), 3);
146+
assert_eq!(frozen.validity().true_count(), 3);
147+
let p32 = frozen.into_i32();
148+
assert_eq!(p32.get(0), Some(&100));
149+
assert_eq!(p32.get(1), Some(&300));
150+
assert_eq!(p32.get(2), Some(&500));
151+
}
152+
153+
#[test]
154+
fn test_filter_primitive_vector_mut_with_mask_indices() {
155+
let mut vec = PrimitiveVectorMut::from(PVectorMut::<i32>::from_iter(
156+
[100, 200, 300, 400, 500].map(Some),
157+
));
158+
159+
let indices = unsafe { MaskIndices::new_unchecked(&[0, 2, 4]) };
160+
161+
(&mut vec).filter(&indices);
162+
163+
assert_eq!(vec.len(), 3);
164+
let frozen = vec.freeze();
165+
assert_eq!(frozen.len(), 3);
166+
assert_eq!(frozen.validity().true_count(), 3);
167+
let p32 = frozen.into_i32();
168+
assert_eq!(p32.get(0), Some(&100));
169+
assert_eq!(p32.get(1), Some(&300));
170+
assert_eq!(p32.get(2), Some(&500));
171+
}
172+
173+
#[test]
174+
fn test_filter_primitive_vector_mut_with_nulls() {
175+
let mut vec = PrimitiveVectorMut::from(PVectorMut::<i64>::from_iter([
176+
Some(1000),
177+
None,
178+
Some(3000),
179+
Some(4000),
180+
None,
181+
]));
182+
183+
let mask = Mask::from_iter([true, true, false, true, false]);
184+
185+
(&mut vec).filter(&mask);
186+
187+
assert_eq!(vec.len(), 3);
188+
let frozen = vec.freeze();
189+
assert_eq!(frozen.len(), 3);
190+
assert_eq!(frozen.validity().true_count(), 2);
191+
let p64 = frozen.into_i64();
192+
assert_eq!(p64.get(0), Some(&1000));
193+
assert_eq!(p64.get(1), None);
194+
assert_eq!(p64.get(2), Some(&4000));
195+
}
196+
}

0 commit comments

Comments
 (0)