@@ -38,3 +38,176 @@ impl Filter<MaskIndices<'_>> for &mut DecimalVectorMut {
3838 match_each_dvector_mut ! ( self , |d| { d. filter( selection) } ) ;
3939 }
4040}
41+
42+ #[ cfg( test) ]
43+ mod tests {
44+ use vortex_buffer:: BufferMut ;
45+ use vortex_dtype:: { DecimalTypeDowncast , PrecisionScale } ;
46+ use vortex_mask:: { Mask , MaskMut } ;
47+ use vortex_vector:: decimal:: DVectorMut ;
48+ use vortex_vector:: { VectorMutOps , VectorOps } ;
49+
50+ use super :: * ;
51+
52+ #[ test]
53+ fn test_filter_decimal_vector_with_mask ( ) {
54+ let ps = PrecisionScale :: < i32 > :: new ( 9 , 2 ) ;
55+ let elements = BufferMut :: from_iter ( [ 100_i32 , 200 , 300 , 400 , 500 ] ) ;
56+ let validity = MaskMut :: new_true ( 5 ) ;
57+ let vec = DecimalVector :: from ( DVectorMut :: new ( ps, elements, validity) . freeze ( ) ) ;
58+
59+ let mask = Mask :: from_iter ( [ true , false , true , false , true ] ) ;
60+
61+ let filtered = ( & vec) . filter ( & mask) ;
62+
63+ assert_eq ! ( filtered. len( ) , 3 ) ;
64+ assert_eq ! ( filtered. validity( ) . true_count( ) , 3 ) ;
65+ let d32 = filtered. into_i32 ( ) ;
66+ assert_eq ! ( d32. get( 0 ) , Some ( & 100 ) ) ;
67+ assert_eq ! ( d32. get( 1 ) , Some ( & 300 ) ) ;
68+ assert_eq ! ( d32. get( 2 ) , Some ( & 500 ) ) ;
69+ }
70+
71+ #[ test]
72+ fn test_filter_decimal_vector_with_mask_indices ( ) {
73+ let ps = PrecisionScale :: < i32 > :: new ( 9 , 2 ) ;
74+ let elements = BufferMut :: from_iter ( [ 100_i32 , 200 , 300 , 400 , 500 ] ) ;
75+ let validity = MaskMut :: new_true ( 5 ) ;
76+ let vec = DecimalVector :: from ( DVectorMut :: new ( ps, elements, validity) . freeze ( ) ) ;
77+
78+ let indices = unsafe { MaskIndices :: new_unchecked ( & [ 0 , 2 , 4 ] ) } ;
79+
80+ let filtered = ( & vec) . filter ( & indices) ;
81+
82+ assert_eq ! ( filtered. len( ) , 3 ) ;
83+ assert_eq ! ( filtered. validity( ) . true_count( ) , 3 ) ;
84+ let d32 = filtered. into_i32 ( ) ;
85+ assert_eq ! ( d32. get( 0 ) , Some ( & 100 ) ) ;
86+ assert_eq ! ( d32. get( 1 ) , Some ( & 300 ) ) ;
87+ assert_eq ! ( d32. get( 2 ) , Some ( & 500 ) ) ;
88+ }
89+
90+ #[ test]
91+ fn test_filter_decimal_vector_with_nulls ( ) {
92+ let ps = PrecisionScale :: < i64 > :: new ( 18 , 4 ) ;
93+ let elements = BufferMut :: from_iter ( [ 1000_i64 , 0 , 3000 , 4000 , 0 ] ) ;
94+ let mut validity = MaskMut :: with_capacity ( 5 ) ;
95+ validity. append_n ( true , 1 ) ;
96+ validity. append_n ( false , 1 ) ;
97+ validity. append_n ( true , 1 ) ;
98+ validity. append_n ( true , 1 ) ;
99+ validity. append_n ( false , 1 ) ;
100+ let vec = DecimalVector :: from ( DVectorMut :: new ( ps, elements, validity) . freeze ( ) ) ;
101+
102+ let mask = Mask :: from_iter ( [ true , true , false , true , false ] ) ;
103+
104+ let filtered = ( & vec) . filter ( & mask) ;
105+
106+ assert_eq ! ( filtered. len( ) , 3 ) ;
107+ assert_eq ! ( filtered. validity( ) . true_count( ) , 2 ) ;
108+ let d64 = filtered. into_i64 ( ) ;
109+ assert_eq ! ( d64. get( 0 ) , Some ( & 1000 ) ) ;
110+ assert_eq ! ( d64. get( 1 ) , None ) ;
111+ assert_eq ! ( d64. get( 2 ) , Some ( & 4000 ) ) ;
112+ }
113+
114+ #[ test]
115+ fn test_filter_decimal_vector_all_true ( ) {
116+ let ps = PrecisionScale :: < i32 > :: new ( 9 , 2 ) ;
117+ let elements = BufferMut :: from_iter ( [ 100_i32 , 200 , 300 ] ) ;
118+ let validity = MaskMut :: new_true ( 3 ) ;
119+ let vec = DecimalVector :: from ( DVectorMut :: new ( ps, elements, validity) . freeze ( ) ) ;
120+
121+ let mask = Mask :: new_true ( 3 ) ;
122+
123+ let filtered = ( & vec) . filter ( & mask) ;
124+
125+ assert_eq ! ( filtered. len( ) , 3 ) ;
126+ let d32 = filtered. into_i32 ( ) ;
127+ assert_eq ! ( d32. get( 0 ) , Some ( & 100 ) ) ;
128+ assert_eq ! ( d32. get( 1 ) , Some ( & 200 ) ) ;
129+ assert_eq ! ( d32. get( 2 ) , Some ( & 300 ) ) ;
130+ }
131+
132+ #[ test]
133+ fn test_filter_decimal_vector_all_false ( ) {
134+ let ps = PrecisionScale :: < i32 > :: new ( 9 , 2 ) ;
135+ let elements = BufferMut :: from_iter ( [ 100_i32 , 200 , 300 ] ) ;
136+ let validity = MaskMut :: new_true ( 3 ) ;
137+ let vec = DVectorMut :: new ( ps, elements, validity) . freeze ( ) ;
138+
139+ let mask = Mask :: new_false ( 3 ) ;
140+
141+ let filtered = ( & vec) . filter ( & mask) ;
142+
143+ assert_eq ! ( filtered. len( ) , 0 ) ;
144+ }
145+
146+ #[ test]
147+ fn test_filter_decimal_vector_mut_with_mask ( ) {
148+ let ps = PrecisionScale :: < i32 > :: new ( 9 , 2 ) ;
149+ let elements = BufferMut :: from_iter ( [ 100_i32 , 200 , 300 , 400 , 500 ] ) ;
150+ let validity = MaskMut :: new_true ( 5 ) ;
151+ let mut vec = DecimalVectorMut :: from ( DVectorMut :: new ( ps, elements, validity) ) ;
152+
153+ let mask = Mask :: from_iter ( [ true , false , true , false , true ] ) ;
154+
155+ ( & mut vec) . filter ( & mask) ;
156+
157+ assert_eq ! ( vec. len( ) , 3 ) ;
158+ let frozen = vec. freeze ( ) ;
159+ assert_eq ! ( frozen. len( ) , 3 ) ;
160+ assert_eq ! ( frozen. validity( ) . true_count( ) , 3 ) ;
161+ let d32 = frozen. into_i32 ( ) ;
162+ assert_eq ! ( d32. get( 0 ) , Some ( & 100 ) ) ;
163+ assert_eq ! ( d32. get( 1 ) , Some ( & 300 ) ) ;
164+ assert_eq ! ( d32. get( 2 ) , Some ( & 500 ) ) ;
165+ }
166+
167+ #[ test]
168+ fn test_filter_decimal_vector_mut_with_mask_indices ( ) {
169+ let ps = PrecisionScale :: < i32 > :: new ( 9 , 2 ) ;
170+ let elements = BufferMut :: from_iter ( [ 100_i32 , 200 , 300 , 400 , 500 ] ) ;
171+ let validity = MaskMut :: new_true ( 5 ) ;
172+ let mut vec = DecimalVectorMut :: from ( DVectorMut :: new ( ps, elements, validity) ) ;
173+
174+ let indices = unsafe { MaskIndices :: new_unchecked ( & [ 0 , 2 , 4 ] ) } ;
175+
176+ ( & mut vec) . filter ( & indices) ;
177+
178+ assert_eq ! ( vec. len( ) , 3 ) ;
179+ let frozen = vec. freeze ( ) ;
180+ assert_eq ! ( frozen. len( ) , 3 ) ;
181+ assert_eq ! ( frozen. validity( ) . true_count( ) , 3 ) ;
182+ let d32 = frozen. into_i32 ( ) ;
183+ assert_eq ! ( d32. get( 0 ) , Some ( & 100 ) ) ;
184+ assert_eq ! ( d32. get( 1 ) , Some ( & 300 ) ) ;
185+ assert_eq ! ( d32. get( 2 ) , Some ( & 500 ) ) ;
186+ }
187+
188+ #[ test]
189+ fn test_filter_decimal_vector_mut_with_nulls ( ) {
190+ let ps = PrecisionScale :: < i64 > :: new ( 18 , 4 ) ;
191+ let elements = BufferMut :: from_iter ( [ 1000_i64 , 0 , 3000 , 4000 , 0 ] ) ;
192+ let mut validity = MaskMut :: with_capacity ( 5 ) ;
193+ validity. append_n ( true , 1 ) ;
194+ validity. append_n ( false , 1 ) ;
195+ validity. append_n ( true , 1 ) ;
196+ validity. append_n ( true , 1 ) ;
197+ validity. append_n ( false , 1 ) ;
198+ let mut vec = DecimalVectorMut :: from ( DVectorMut :: new ( ps, elements, validity) ) ;
199+
200+ let mask = Mask :: from_iter ( [ true , true , false , true , false ] ) ;
201+
202+ ( & mut vec) . filter ( & mask) ;
203+
204+ assert_eq ! ( vec. len( ) , 3 ) ;
205+ let frozen = vec. freeze ( ) ;
206+ assert_eq ! ( frozen. len( ) , 3 ) ;
207+ assert_eq ! ( frozen. validity( ) . true_count( ) , 2 ) ;
208+ let d64 = frozen. into_i64 ( ) ;
209+ assert_eq ! ( d64. get( 0 ) , Some ( & 1000 ) ) ;
210+ assert_eq ! ( d64. get( 1 ) , None ) ;
211+ assert_eq ! ( d64. get( 2 ) , Some ( & 4000 ) ) ;
212+ }
213+ }
0 commit comments