@@ -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