@@ -12,17 +12,19 @@ use vortex_buffer::{Buffer, BufferMut};
1212use vortex_dtype:: DType ;
1313use vortex_error:: { VortexExpect as _, VortexResult , VortexUnwrap , vortex_bail} ;
1414
15+ use crate :: arrays:: PrimitiveArray ;
1516use crate :: iter:: { ArrayIterator , ArrayIteratorAdapter } ;
1617use crate :: search_sorted:: { SearchSorted , SearchSortedSide } ;
1718use crate :: stats:: ArrayStats ;
1819use crate :: stream:: { ArrayStream , ArrayStreamAdapter } ;
20+ use crate :: validity:: Validity ;
1921use crate :: { Array , ArrayRef , IntoArray } ;
2022
2123#[ derive( Clone , Debug ) ]
2224pub struct ChunkedArray {
2325 pub ( super ) dtype : DType ,
2426 pub ( super ) len : usize ,
25- pub ( super ) chunk_offsets : Buffer < u64 > ,
27+ pub ( super ) chunk_offsets : PrimitiveArray ,
2628 pub ( super ) chunks : Vec < ArrayRef > ,
2729 pub ( super ) stats_set : ArrayStats ,
2830}
@@ -58,20 +60,22 @@ impl ChunkedArray {
5860
5961 let nchunks = chunks. len ( ) ;
6062
61- let mut chunk_offsets = BufferMut :: < u64 > :: with_capacity ( nchunks + 1 ) ;
63+ let mut chunk_offsets_buf = BufferMut :: < u64 > :: with_capacity ( nchunks + 1 ) ;
6264 // SAFETY: nchunks + 1
63- unsafe { chunk_offsets . push_unchecked ( 0 ) }
65+ unsafe { chunk_offsets_buf . push_unchecked ( 0 ) }
6466 let mut curr_offset = 0 ;
6567 for c in & chunks {
6668 curr_offset += c. len ( ) as u64 ;
6769 // SAFETY: nchunks + 1
68- unsafe { chunk_offsets . push_unchecked ( curr_offset) }
70+ unsafe { chunk_offsets_buf . push_unchecked ( curr_offset) }
6971 }
7072
73+ let chunk_offsets = PrimitiveArray :: new ( chunk_offsets_buf. freeze ( ) , Validity :: NonNullable ) ;
74+
7175 Self {
7276 dtype,
7377 len : curr_offset. try_into ( ) . vortex_unwrap ( ) ,
74- chunk_offsets : chunk_offsets . freeze ( ) ,
78+ chunk_offsets,
7579 chunks,
7680 stats_set : Default :: default ( ) ,
7781 }
@@ -102,8 +106,8 @@ impl ChunkedArray {
102106 }
103107
104108 #[ inline]
105- pub fn chunk_offsets ( & self ) -> & Buffer < u64 > {
106- & self . chunk_offsets
109+ pub fn chunk_offsets ( & self ) -> Buffer < u64 > {
110+ self . chunk_offsets . buffer ( )
107111 }
108112
109113 pub ( crate ) fn find_chunk_idx ( & self , index : usize ) -> ( usize , usize ) {
0 commit comments