@@ -71,6 +71,10 @@ impl<OffsetSize: OffsetSizeTrait, T: ArrayBuilder> ArrayBuilder
7171 fn finish_cloned ( & self ) -> ArrayRef {
7272 Arc :: new ( self . finish_cloned ( ) )
7373 }
74+
75+ fn finish_preserve_values ( & mut self ) -> ArrayRef {
76+ Arc :: new ( self . finish_preserve_values ( ) )
77+ }
7478}
7579
7680impl < OffsetSize : OffsetSizeTrait , T : ArrayBuilder > GenericListViewBuilder < OffsetSize , T > {
@@ -216,6 +220,23 @@ where
216220 GenericListViewArray :: new ( field, offsets, sizes, values, nulls)
217221 }
218222
223+ fn finish_preserve_values ( & mut self ) -> GenericListViewArray < OffsetSize > {
224+ let values = self . values_builder . finish_preserve_values ( ) ;
225+ let nulls = self . null_buffer_builder . finish ( ) ;
226+ let offsets = Buffer :: from_vec ( std:: mem:: take ( & mut self . offsets_builder ) ) ;
227+ self . current_offset = OffsetSize :: zero ( ) ;
228+
229+ // Safety: Safe by construction
230+ let offsets = ScalarBuffer :: from ( offsets) ;
231+ let sizes = Buffer :: from_vec ( std:: mem:: take ( & mut self . sizes_builder ) ) ;
232+ let sizes = ScalarBuffer :: from ( sizes) ;
233+ let field = match & self . field {
234+ Some ( f) => f. clone ( ) ,
235+ None => Arc :: new ( Field :: new ( "item" , values. data_type ( ) . clone ( ) , true ) ) ,
236+ } ;
237+ GenericListViewArray :: new ( field, offsets, sizes, values, nulls)
238+ }
239+
219240 /// Returns the current offsets buffer as a slice
220241 pub fn offsets_slice ( & self ) -> & [ OffsetSize ] {
221242 self . offsets_builder . as_slice ( )
@@ -245,7 +266,7 @@ where
245266#[ cfg( test) ]
246267mod tests {
247268 use super :: * ;
248- use crate :: builder:: { Int32Builder , ListViewBuilder , make_builder} ;
269+ use crate :: builder:: { Int32Builder , ListViewBuilder , make_builder, tests :: PreserveValuesMock } ;
249270 use crate :: cast:: AsArray ;
250271 use crate :: types:: Int32Type ;
251272 use crate :: { Array , Int32Array } ;
@@ -703,4 +724,17 @@ mod tests {
703724 builder. append_value ( [ Some ( 1 ) ] ) ;
704725 builder. finish ( ) ;
705726 }
727+
728+ #[ test]
729+ fn test_finish_preserve_values ( ) {
730+ let mut builder = ListViewBuilder :: new ( PreserveValuesMock :: default ( ) ) ;
731+
732+ builder. values ( ) . inner . append_value ( 1 ) ;
733+ builder. append ( true ) ;
734+
735+ let arr = builder. finish_preserve_values ( ) ;
736+
737+ assert_eq ! ( 1 , arr. len( ) ) ;
738+ assert_eq ! ( 1 , builder. values( ) . called) ;
739+ }
706740}
0 commit comments