@@ -129,11 +129,12 @@ where
129129/// # Returns
130130///
131131/// A `PrimitiveArray` containing the decompressed floating-point values with all patches applied.
132- pub fn decompress ( array : & ALPArray ) -> PrimitiveArray {
133- if let Some ( patches) = array. patches ( )
132+ pub fn decompress ( array : ALPArray ) -> PrimitiveArray {
133+ let patches = array. patches ( ) . cloned ( ) ;
134+ if let Some ( patches) = patches
134135 && let Some ( chunk_offsets) = patches. chunk_offsets ( )
135136 {
136- return decompress_chunked ( array, patches, & chunk_offsets. as_ref ( ) . to_primitive ( ) ) ;
137+ return decompress_chunked ( array, & patches, & chunk_offsets. as_ref ( ) . to_primitive ( ) ) ;
137138 }
138139
139140 decompress_unchunked ( array)
@@ -154,31 +155,36 @@ pub fn decompress(array: &ALPArray) -> PrimitiveArray {
154155/// A `PrimitiveArray` containing the decompressed values with all patches applied.
155156#[ allow( clippy:: cognitive_complexity) ]
156157pub fn decompress_chunked (
157- array : & ALPArray ,
158+ array : ALPArray ,
158159 patches : & Patches ,
159160 patches_chunk_offsets : & PrimitiveArray ,
160161) -> PrimitiveArray {
161- let alp_encoded = array. encoded ( ) . to_primitive ( ) ;
162- let validity = alp_encoded . validity ( ) . clone ( ) ;
162+ let encoded = array. encoded ( ) . to_primitive ( ) ;
163+ let validity = encoded . validity ( ) . clone ( ) ;
163164
164165 let patches_indices = patches. indices ( ) . as_ref ( ) . to_primitive ( ) ;
165166 let patches_values = patches. values ( ) . as_ref ( ) . to_primitive ( ) ;
166-
167- match_each_alp_float_ptype ! ( array. dtype( ) . as_ptype( ) , |T | {
167+ let ptype = array. dtype ( ) . as_ptype ( ) ;
168+ let array_len = array. len ( ) ;
169+ let exponents = array. exponents ( ) ;
170+ let patches_offset = patches. offset ( ) ;
171+
172+ // We need to drop ALPArray here in case converting encoded buffer into primitive didn't create a copy. In that case
173+ // both alp_encoded and array will hold a reference to the buffer we want to mutate.
174+ drop ( array) ;
175+
176+ match_each_alp_float_ptype ! ( ptype, |T | {
177+ let patches_values = patches_values. as_slice:: <T >( ) ;
178+ let mut alp_buffer = encoded. into_buffer_mut( ) ;
168179 match_each_unsigned_integer_ptype!( patches_chunk_offsets. ptype( ) , |C | {
180+ let patches_chunk_offsets = patches_chunk_offsets. as_slice:: <C >( ) ;
169181 match_each_unsigned_integer_ptype!( patches_indices. ptype( ) , |I | {
170182 let patches_indices = patches_indices. as_slice:: <I >( ) ;
171- let patches_values = patches_values. as_slice:: <T >( ) ;
172- let patches_chunk_offsets = patches_chunk_offsets. as_slice:: <C >( ) ;
173-
174- let mut alp_buffer = alp_encoded. into_buffer_mut( ) ;
175- let array_len = array. len( ) ;
176- let patches_offset = patches. offset( ) ;
177183
178184 for ( chunk_idx, chunk_start) in ( 0 ..array_len) . step_by( 1024 ) . enumerate( ) {
179185 let chunk_end = ( chunk_start + 1024 ) . min( array_len) ;
180186 let chunk_slice = & mut alp_buffer. as_mut_slice( ) [ chunk_start..chunk_end] ;
181- <T >:: decode_slice_inplace( chunk_slice, array . exponents( ) ) ;
187+ <T >:: decode_slice_inplace( chunk_slice, exponents) ;
182188
183189 let decoded_chunk: & mut [ T ] = unsafe { transmute( chunk_slice) } ;
184190 PrimitiveArray :: patch_chunk(
@@ -201,19 +207,26 @@ pub fn decompress_chunked(
201207/// Decompresses an ALP-encoded array without chunk offsets.
202208///
203209/// This function decodes the complete array at once and then applies any patches after.
204- fn decompress_unchunked ( array : & ALPArray ) -> PrimitiveArray {
210+ fn decompress_unchunked ( array : ALPArray ) -> PrimitiveArray {
211+ let patches = array. patches ( ) . cloned ( ) ;
205212 let encoded = array. encoded ( ) . to_primitive ( ) ;
206213 let validity = encoded. validity ( ) . clone ( ) ;
214+ let exponents = array. exponents ( ) ;
215+ let ptype = array. dtype ( ) . as_ptype ( ) ;
216+
217+ // We need to drop ALPArray here in case converting encoded buffer into primitive didn't create a copy. In that case
218+ // both alp_encoded and array will hold a reference to the buffer we want to mutate.
219+ drop ( array) ;
207220
208- let decoded = match_each_alp_float_ptype ! ( array . dtype ( ) . as_ptype ( ) , |T | {
221+ let decoded = match_each_alp_float_ptype ! ( ptype , |T | {
209222 PrimitiveArray :: new:: <T >(
210- <T >:: decode_buffer( encoded. into_buffer_mut( ) , array . exponents( ) ) ,
223+ <T >:: decode_buffer( encoded. into_buffer_mut( ) , exponents) ,
211224 validity,
212225 )
213226 } ) ;
214227
215- if let Some ( patches) = array . patches ( ) {
216- decoded. patch ( patches)
228+ if let Some ( patches) = patches {
229+ decoded. patch ( & patches)
217230 } else {
218231 decoded
219232 }
@@ -240,7 +253,7 @@ mod tests {
240253 assert_arrays_eq ! ( encoded. encoded( ) , expected_encoded) ;
241254 assert_eq ! ( encoded. exponents( ) , Exponents { e: 9 , f: 6 } ) ;
242255
243- let decoded = decompress ( & encoded) ;
256+ let decoded = decompress ( encoded) ;
244257 assert_arrays_eq ! ( decoded, array) ;
245258 }
246259
@@ -253,7 +266,7 @@ mod tests {
253266 assert_arrays_eq ! ( encoded. encoded( ) , expected_encoded) ;
254267 assert_eq ! ( encoded. exponents( ) , Exponents { e: 9 , f: 6 } ) ;
255268
256- let decoded = decompress ( & encoded) ;
269+ let decoded = decompress ( encoded) ;
257270 let expected = PrimitiveArray :: from_option_iter ( vec ! [ None , Some ( 1.234f32 ) , None ] ) ;
258271 assert_arrays_eq ! ( decoded, expected) ;
259272 }
@@ -269,7 +282,7 @@ mod tests {
269282 assert_arrays_eq ! ( encoded. encoded( ) , expected_encoded) ;
270283 assert_eq ! ( encoded. exponents( ) , Exponents { e: 16 , f: 13 } ) ;
271284
272- let decoded = decompress ( & encoded) ;
285+ let decoded = decompress ( encoded) ;
273286 let expected_decoded = PrimitiveArray :: new ( values, Validity :: NonNullable ) ;
274287 assert_arrays_eq ! ( decoded, expected_decoded) ;
275288 }
@@ -286,7 +299,7 @@ mod tests {
286299 assert_arrays_eq ! ( encoded. encoded( ) , expected_encoded) ;
287300 assert_eq ! ( encoded. exponents( ) , Exponents { e: 16 , f: 13 } ) ;
288301
289- let decoded = decompress ( & encoded) ;
302+ let decoded = decompress ( encoded) ;
290303 assert_arrays_eq ! ( decoded, array) ;
291304 }
292305
@@ -305,9 +318,9 @@ mod tests {
305318
306319 assert_eq ! ( encoded. exponents( ) , Exponents { e: 16 , f: 13 } ) ;
307320
308- assert_arrays_eq ! ( & encoded, array) ;
321+ assert_arrays_eq ! ( encoded, array) ;
309322
310- let _decoded = decompress ( & encoded) ;
323+ let _decoded = decompress ( encoded) ;
311324 }
312325
313326 #[ test]
@@ -513,7 +526,7 @@ mod tests {
513526 let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
514527
515528 assert ! ( encoded. patches( ) . is_none( ) ) ;
516- let decoded = decompress ( & encoded) ;
529+ let decoded = decompress ( encoded) ;
517530 assert_eq ! ( array. as_slice:: <f32 >( ) , decoded. as_slice:: <f32 >( ) ) ;
518531 }
519532
@@ -524,7 +537,7 @@ mod tests {
524537 let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
525538
526539 assert ! ( encoded. patches( ) . is_none( ) ) ;
527- let decoded = decompress ( & encoded) ;
540+ let decoded = decompress ( encoded) ;
528541 assert_eq ! ( array. as_slice:: <f64 >( ) , decoded. as_slice:: <f64 >( ) ) ;
529542 }
530543
@@ -541,7 +554,7 @@ mod tests {
541554 let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
542555
543556 assert ! ( encoded. patches( ) . is_some( ) ) ;
544- let decoded = decompress ( & encoded) ;
557+ let decoded = decompress ( encoded) ;
545558 assert_eq ! ( values. as_slice( ) , decoded. as_slice:: <f32 >( ) ) ;
546559 }
547560
@@ -562,7 +575,7 @@ mod tests {
562575 let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
563576
564577 assert ! ( encoded. patches( ) . is_some( ) ) ;
565- let decoded = decompress ( & encoded) ;
578+ let decoded = decompress ( encoded) ;
566579
567580 for idx in 0 ..size {
568581 let decoded_val = decoded. as_slice :: < f64 > ( ) [ idx] ;
@@ -589,7 +602,7 @@ mod tests {
589602
590603 let array = PrimitiveArray :: from_option_iter ( values) ;
591604 let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
592- let decoded = decompress ( & encoded) ;
605+ let decoded = decompress ( encoded) ;
593606
594607 assert_arrays_eq ! ( decoded, array) ;
595608 }
@@ -609,7 +622,7 @@ mod tests {
609622
610623 let array = PrimitiveArray :: new ( Buffer :: from ( values) , validity) ;
611624 let encoded = alp_encode ( & array, None ) . unwrap ( ) ;
612- let decoded = decompress ( & encoded) ;
625+ let decoded = decompress ( encoded) ;
613626
614627 assert_arrays_eq ! ( decoded, array) ;
615628 }
0 commit comments