@@ -14,6 +14,7 @@ use vortex_array::IntoArray;
1414use vortex_array:: Precision ;
1515use vortex_array:: ProstMetadata ;
1616use vortex_array:: SerializeMetadata ;
17+ use vortex_array:: arrays:: lazy_patched:: LazyPatchedArray ;
1718use vortex_array:: buffer:: BufferHandle ;
1819use vortex_array:: builders:: ArrayBuilder ;
1920use vortex_array:: dtype:: DType ;
@@ -46,6 +47,7 @@ use crate::bitpack_decompress::unpack_array;
4647use crate :: bitpack_decompress:: unpack_into_primitive_builder;
4748use crate :: bitpacking:: vtable:: kernels:: PARENT_KERNELS ;
4849use crate :: bitpacking:: vtable:: rules:: RULES ;
50+
4951mod kernels;
5052mod operations;
5153mod rules;
@@ -277,7 +279,7 @@ impl VTable for BitPacked {
277279 metadata : & Self :: Metadata ,
278280 buffers : & [ BufferHandle ] ,
279281 children : & dyn ArrayChildren ,
280- ) -> VortexResult < BitPackedArray > {
282+ ) -> VortexResult < ArrayRef > {
281283 if buffers. len ( ) != 1 {
282284 vortex_bail ! ( "Expected 1 buffer, got {}" , buffers. len( ) ) ;
283285 }
@@ -307,25 +309,11 @@ impl VTable for BitPacked {
307309
308310 let validity = load_validity ( validity_idx) ?;
309311
310- let patches = metadata
311- . patches
312- . map ( |p| {
313- let indices = children. get ( 0 , & p. indices_dtype ( ) ?, p. len ( ) ?) ?;
314- let values = children. get ( 1 , dtype, p. len ( ) ?) ?;
315- let chunk_offsets = p
316- . chunk_offsets_dtype ( ) ?
317- . map ( |dtype| children. get ( 2 , & dtype, p. chunk_offsets_len ( ) as usize ) )
318- . transpose ( ) ?;
319-
320- Patches :: new ( len, p. offset ( ) ?, indices, values, chunk_offsets)
321- } )
322- . transpose ( ) ?;
323-
324- BitPackedArray :: try_new (
312+ let bitpacked = BitPackedArray :: try_new (
325313 packed,
326314 PType :: try_from ( dtype) ?,
327315 validity,
328- patches ,
316+ None ,
329317 u8:: try_from ( metadata. bit_width ) . map_err ( |_| {
330318 vortex_err ! (
331319 "BitPackedMetadata bit_width {} does not fit in u8" ,
@@ -339,7 +327,24 @@ impl VTable for BitPacked {
339327 metadata. offset
340328 )
341329 } ) ?,
342- )
330+ ) ?
331+ . into_array ( ) ;
332+
333+ match metadata. patches {
334+ Some ( p) => {
335+ let indices = children. get ( 0 , & p. indices_dtype ( ) ?, p. len ( ) ?) ?;
336+ let values = children. get ( 1 , dtype, p. len ( ) ?) ?;
337+ let chunk_offsets = p
338+ . chunk_offsets_dtype ( ) ?
339+ . map ( |dtype| children. get ( 2 , & dtype, p. chunk_offsets_len ( ) as usize ) )
340+ . transpose ( ) ?;
341+
342+ let patches = Patches :: new ( len, p. offset ( ) ?, indices, values, chunk_offsets) ?;
343+
344+ Ok ( LazyPatchedArray :: try_new ( bitpacked, patches) ?. into_array ( ) )
345+ }
346+ None => Ok ( bitpacked) ,
347+ }
343348 }
344349
345350 fn append_to_builder (
0 commit comments