33
44use itertools:: Itertools ;
55use vortex_array:: ArrayRef ;
6+ use vortex_array:: ArrayView ;
67use vortex_array:: IntoArray ;
8+ use vortex_array:: arrays:: Primitive ;
79use vortex_array:: arrays:: PrimitiveArray ;
810use vortex_array:: dtype:: PType ;
911use vortex_array:: patches:: Patches ;
@@ -39,7 +41,10 @@ macro_rules! match_each_alp_float_ptype {
3941 } } ;
4042}
4143
42- pub fn alp_encode ( parray : & PrimitiveArray , exponents : Option < Exponents > ) -> VortexResult < ALPArray > {
44+ pub fn alp_encode (
45+ parray : ArrayView < ' _ , Primitive > ,
46+ exponents : Option < Exponents > ,
47+ ) -> VortexResult < ALPArray > {
4348 let ( exponents, encoded, patches) = match parray. ptype ( ) {
4449 PType :: F32 => alp_encode_components_typed :: < f32 > ( parray, exponents) ?,
4550 PType :: F64 => alp_encode_components_typed :: < f64 > ( parray, exponents) ?,
@@ -55,7 +60,7 @@ pub fn alp_encode(parray: &PrimitiveArray, exponents: Option<Exponents>) -> Vort
5560 reason = "u64 index cast to usize is safe for reasonable array sizes"
5661) ]
5762fn alp_encode_components_typed < T > (
58- values : & PrimitiveArray ,
63+ values : ArrayView < ' _ , Primitive > ,
5964 exponents : Option < Exponents > ,
6065) -> VortexResult < ( Exponents , ArrayRef , Option < Patches > ) >
6166where
6873
6974 let encoded_array = PrimitiveArray :: new ( encoded, values. validity ( ) ?) . into_array ( ) ;
7075
71- let validity = values. validity_mask ( ) ?;
76+ let validity = values. array ( ) . validity_mask ( ) ?;
7277 // exceptional_positions may contain exceptions at invalid positions (which contain garbage
7378 // data). We remove null exceptions in order to keep the Patches small.
7479 let ( valid_exceptional_positions, valid_exceptional_values) : ( Buffer < u64 > , Buffer < T > ) =
@@ -141,7 +146,7 @@ mod tests {
141146 #[ test]
142147 fn test_compress ( ) {
143148 let array = PrimitiveArray :: new ( buffer ! [ 1.234f32 ; 1025 ] , Validity :: NonNullable ) ;
144- let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
149+ let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
145150 assert ! ( encoded. patches( ) . is_none( ) ) ;
146151 let expected_encoded = PrimitiveArray :: from_iter ( vec ! [ 1234i32 ; 1025 ] ) ;
147152 assert_arrays_eq ! ( encoded. encoded( ) , expected_encoded) ;
@@ -155,7 +160,7 @@ mod tests {
155160 #[ test]
156161 fn test_nullable_compress ( ) {
157162 let array = PrimitiveArray :: from_option_iter ( [ None , Some ( 1.234f32 ) , None ] ) ;
158- let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
163+ let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
159164 assert ! ( encoded. patches( ) . is_none( ) ) ;
160165 let expected_encoded = PrimitiveArray :: from_option_iter ( [ None , Some ( 1234i32 ) , None ] ) ;
161166 assert_arrays_eq ! ( encoded. encoded( ) , expected_encoded) ;
@@ -172,7 +177,7 @@ mod tests {
172177 fn test_patched_compress ( ) {
173178 let values = buffer ! [ 1.234f64 , 2.718 , PI , 4.0 ] ;
174179 let array = PrimitiveArray :: new ( values. clone ( ) , Validity :: NonNullable ) ;
175- let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
180+ let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
176181 assert ! ( encoded. patches( ) . is_some( ) ) ;
177182 let expected_encoded = PrimitiveArray :: from_iter ( vec ! [ 1234i64 , 2718 , 1234 , 4000 ] ) ;
178183 assert_arrays_eq ! ( encoded. encoded( ) , expected_encoded) ;
@@ -189,7 +194,7 @@ mod tests {
189194 fn test_compress_ignores_invalid_exceptional_values ( ) {
190195 let values = buffer ! [ 1.234f64 , 2.718 , PI , 4.0 ] ;
191196 let array = PrimitiveArray :: new ( values, Validity :: from_iter ( [ true , true , false , true ] ) ) ;
192- let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
197+ let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
193198 assert ! ( encoded. patches( ) . is_none( ) ) ;
194199 let expected_encoded =
195200 PrimitiveArray :: from_option_iter ( buffer ! [ Some ( 1234i64 ) , Some ( 2718 ) , None , Some ( 4000 ) ] ) ;
@@ -211,7 +216,7 @@ mod tests {
211216 Some ( 4.0 ) ,
212217 None ,
213218 ] ) ;
214- let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
219+ let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
215220 assert ! ( encoded. patches( ) . is_some( ) ) ;
216221
217222 assert_eq ! ( encoded. exponents( ) , Exponents { e: 16 , f: 13 } ) ;
@@ -225,15 +230,15 @@ mod tests {
225230 #[ test]
226231 fn roundtrips_close_fractional ( ) {
227232 let original = PrimitiveArray :: from_iter ( [ 195.26274f32 , 195.27837 , -48.815685 ] ) ;
228- let alp_arr = alp_encode ( & original, None ) . unwrap ( ) ;
233+ let alp_arr = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
229234 assert_arrays_eq ! ( alp_arr, original) ;
230235 }
231236
232237 #[ test]
233238 fn roundtrips_all_null ( ) {
234239 let original =
235240 PrimitiveArray :: new ( buffer ! [ 195.26274f64 , PI , -48.815685 ] , Validity :: AllInvalid ) ;
236- let alp_arr = alp_encode ( & original, None ) . unwrap ( ) ;
241+ let alp_arr = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
237242 let decompressed = alp_arr. into_array ( ) . to_primitive ( ) ;
238243
239244 assert_eq ! (
@@ -251,7 +256,7 @@ mod tests {
251256 buffer ! [ 0.0f32 , -0.0 , f32 :: NAN , f32 :: NEG_INFINITY , f32 :: INFINITY ] ,
252257 Validity :: NonNullable ,
253258 ) ;
254- let encoded = alp_encode ( & original, None ) . unwrap ( ) ;
259+ let encoded = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
255260 let decoded = encoded. as_array ( ) . to_primitive ( ) ;
256261 for idx in 0 ..original. len ( ) {
257262 let decoded_val = decoded. as_slice :: < f32 > ( ) [ idx] ;
@@ -272,7 +277,7 @@ mod tests {
272277 values[ 1025 ] = PI ;
273278
274279 let array = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
275- let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
280+ let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
276281 let patches = encoded. patches ( ) . unwrap ( ) ;
277282
278283 let chunk_offsets = patches. chunk_offsets ( ) . clone ( ) . unwrap ( ) . to_primitive ( ) ;
@@ -295,7 +300,7 @@ mod tests {
295300 values[ 2048 ] = E ;
296301
297302 let array = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
298- let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
303+ let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
299304 let patches = encoded. patches ( ) . unwrap ( ) ;
300305
301306 let chunk_offsets = patches. chunk_offsets ( ) . clone ( ) . unwrap ( ) . to_primitive ( ) ;
@@ -317,7 +322,7 @@ mod tests {
317322 values[ 0 ] = PI ;
318323
319324 let array = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
320- let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
325+ let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
321326 let patches = encoded. patches ( ) . unwrap ( ) ;
322327
323328 let chunk_offsets = patches. chunk_offsets ( ) . clone ( ) . unwrap ( ) . to_primitive ( ) ;
@@ -340,7 +345,7 @@ mod tests {
340345 values[ 100 ] = E ;
341346
342347 let array = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
343- let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
348+ let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
344349 let patches = encoded. patches ( ) . unwrap ( ) ;
345350
346351 let chunk_offsets = patches. chunk_offsets ( ) . clone ( ) . unwrap ( ) . to_primitive ( ) ;
@@ -361,7 +366,7 @@ mod tests {
361366 // Create 1024 elements, encode, slice to first 512, then decode
362367 let values = vec ! [ 1.234f32 ; 1024 ] ;
363368 let original = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
364- let encoded = alp_encode ( & original, None ) . unwrap ( ) ;
369+ let encoded = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
365370
366371 let sliced_alp = encoded. slice ( 512 ..1024 ) . unwrap ( ) ;
367372
@@ -373,7 +378,7 @@ mod tests {
373378 fn test_slice_half_chunk_f64_roundtrip ( ) {
374379 let values = vec ! [ 5.678f64 ; 1024 ] ;
375380 let original = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
376- let encoded = alp_encode ( & original, None ) . unwrap ( ) ;
381+ let encoded = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
377382
378383 let sliced_alp = encoded. slice ( 512 ..1024 ) . unwrap ( ) ;
379384
@@ -389,7 +394,7 @@ mod tests {
389394 values[ 600 ] = 42.42 ;
390395
391396 let original = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
392- let encoded = alp_encode ( & original, None ) . unwrap ( ) ;
397+ let encoded = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
393398
394399 let sliced_alp = encoded. slice ( 512 ..1024 ) . unwrap ( ) ;
395400
@@ -409,7 +414,7 @@ mod tests {
409414 values[ 1023 ] = 42.42 ;
410415
411416 let original = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
412- let encoded = alp_encode ( & original, None ) . unwrap ( ) ;
417+ let encoded = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
413418
414419 let sliced_alp = encoded. slice ( 1023 ..1025 ) . unwrap ( ) ;
415420
@@ -425,7 +430,7 @@ mod tests {
425430 . collect :: < Vec < _ > > ( ) ;
426431
427432 let original = PrimitiveArray :: from_option_iter ( values) ;
428- let encoded = alp_encode ( & original, None ) . unwrap ( ) ;
433+ let encoded = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
429434
430435 let sliced_alp = encoded. slice ( 512 ..1024 ) . unwrap ( ) ;
431436 let decoded = sliced_alp. to_primitive ( ) ;
@@ -438,7 +443,7 @@ mod tests {
438443 fn test_large_f32_array_uniform_values ( ) {
439444 let size = 10_000 ;
440445 let array = PrimitiveArray :: new ( buffer ! [ 42.125f32 ; size] , Validity :: NonNullable ) ;
441- let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
446+ let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
442447
443448 assert ! ( encoded. patches( ) . is_none( ) ) ;
444449 let decoded =
@@ -450,7 +455,7 @@ mod tests {
450455 fn test_large_f64_array_uniform_values ( ) {
451456 let size = 50_000 ;
452457 let array = PrimitiveArray :: new ( buffer ! [ 123.456789f64 ; size] , Validity :: NonNullable ) ;
453- let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
458+ let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
454459
455460 assert ! ( encoded. patches( ) . is_none( ) ) ;
456461 let decoded =
@@ -468,7 +473,7 @@ mod tests {
468473 values[ 4500 ] = f32:: INFINITY ;
469474
470475 let array = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
471- let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
476+ let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
472477
473478 assert ! ( encoded. patches( ) . is_some( ) ) ;
474479 let decoded =
@@ -490,7 +495,7 @@ mod tests {
490495 values[ 7000 ] = 999.999999999 ;
491496
492497 let array = PrimitiveArray :: new ( Buffer :: from ( values. clone ( ) ) , Validity :: NonNullable ) ;
493- let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
498+ let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
494499
495500 assert ! ( encoded. patches( ) . is_some( ) ) ;
496501 let decoded =
@@ -520,7 +525,7 @@ mod tests {
520525 . collect ( ) ;
521526
522527 let array = PrimitiveArray :: from_option_iter ( values) ;
523- let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
528+ let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
524529 let decoded =
525530 decompress_into_array ( encoded, & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
526531
@@ -541,7 +546,7 @@ mod tests {
541546 let validity = Validity :: from_iter ( ( 0 ..size) . map ( |i| !matches ! ( i, 500 | 2500 ) ) ) ;
542547
543548 let array = PrimitiveArray :: new ( Buffer :: from ( values) , validity) ;
544- let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
549+ let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
545550 let decoded =
546551 decompress_into_array ( encoded, & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
547552
@@ -572,7 +577,7 @@ mod tests {
572577 values[ 2900 ] = PI ;
573578
574579 let original = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
575- let encoded = alp_encode ( & original, None ) . unwrap ( ) ;
580+ let encoded = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
576581 assert ! ( encoded. patches( ) . is_some( ) ) ;
577582
578583 // Slice ending mid-chunk-2 (element 2500 is inside chunk 2 = 2048..3072).
0 commit comments