@@ -15,6 +15,7 @@ use vortex_array::IntoArray;
1515use vortex_array:: Precision ;
1616use vortex_array:: ProstMetadata ;
1717use vortex_array:: SerializeMetadata ;
18+ use vortex_array:: arrays:: lazy_patched:: LazyPatchedArray ;
1819use vortex_array:: buffer:: BufferHandle ;
1920use vortex_array:: builders:: ArrayBuilder ;
2021use vortex_array:: dtype:: DType ;
@@ -50,6 +51,7 @@ use crate::bitpacking::array::SLOT_NAMES;
5051use crate :: bitpacking:: array:: VALIDITY_SLOT ;
5152use crate :: bitpacking:: vtable:: kernels:: PARENT_KERNELS ;
5253use crate :: bitpacking:: vtable:: rules:: RULES ;
54+
5355mod kernels;
5456mod operations;
5557mod rules;
@@ -208,7 +210,7 @@ impl VTable for BitPacked {
208210 metadata : & Self :: Metadata ,
209211 buffers : & [ BufferHandle ] ,
210212 children : & dyn ArrayChildren ,
211- ) -> VortexResult < BitPackedArray > {
213+ ) -> VortexResult < ArrayRef > {
212214 if buffers. len ( ) != 1 {
213215 vortex_bail ! ( "Expected 1 buffer, got {}" , buffers. len( ) ) ;
214216 }
@@ -238,25 +240,11 @@ impl VTable for BitPacked {
238240
239241 let validity = load_validity ( validity_idx) ?;
240242
241- let patches = metadata
242- . patches
243- . map ( |p| {
244- let indices = children. get ( 0 , & p. indices_dtype ( ) ?, p. len ( ) ?) ?;
245- let values = children. get ( 1 , dtype, p. len ( ) ?) ?;
246- let chunk_offsets = p
247- . chunk_offsets_dtype ( ) ?
248- . map ( |dtype| children. get ( 2 , & dtype, p. chunk_offsets_len ( ) as usize ) )
249- . transpose ( ) ?;
250-
251- Patches :: new ( len, p. offset ( ) ?, indices, values, chunk_offsets)
252- } )
253- . transpose ( ) ?;
254-
255- BitPackedArray :: try_new (
243+ let bitpacked = BitPackedArray :: try_new (
256244 packed,
257245 PType :: try_from ( dtype) ?,
258246 validity,
259- patches ,
247+ None ,
260248 u8:: try_from ( metadata. bit_width ) . map_err ( |_| {
261249 vortex_err ! (
262250 "BitPackedMetadata bit_width {} does not fit in u8" ,
@@ -270,7 +258,24 @@ impl VTable for BitPacked {
270258 metadata. offset
271259 )
272260 } ) ?,
273- )
261+ ) ?
262+ . into_array ( ) ;
263+
264+ match metadata. patches {
265+ Some ( p) => {
266+ let indices = children. get ( 0 , & p. indices_dtype ( ) ?, p. len ( ) ?) ?;
267+ let values = children. get ( 1 , dtype, p. len ( ) ?) ?;
268+ let chunk_offsets = p
269+ . chunk_offsets_dtype ( ) ?
270+ . map ( |dtype| children. get ( 2 , & dtype, p. chunk_offsets_len ( ) as usize ) )
271+ . transpose ( ) ?;
272+
273+ let patches = Patches :: new ( len, p. offset ( ) ?, indices, values, chunk_offsets) ?;
274+
275+ Ok ( LazyPatchedArray :: try_new ( bitpacked, patches) ?. into_array ( ) )
276+ }
277+ None => Ok ( bitpacked) ,
278+ }
274279 }
275280
276281 fn append_to_builder (
0 commit comments