@@ -576,23 +576,25 @@ impl<OffsetSize: OffsetSizeTrait> From<FixedSizeListArray> for GenericListViewAr
576576
577577impl < OffsetSize : OffsetSizeTrait > GenericListViewArray < OffsetSize > {
578578 fn try_new_from_array_data ( data : ArrayData ) -> Result < Self , ArrowError > {
579- if data. buffers ( ) . len ( ) != 2 {
579+ let ( data_type, len, nulls, offset, mut buffers, mut child_data) = data. into_parts ( ) ;
580+
581+ if buffers. len ( ) != 2 {
580582 return Err ( ArrowError :: InvalidArgumentError ( format ! (
581583 "ListViewArray data should contain two buffers (value offsets & value sizes), had {}" ,
582- data . buffers( ) . len( )
584+ buffers. len( )
583585 ) ) ) ;
584586 }
585587
586- if data . child_data ( ) . len ( ) != 1 {
588+ if child_data. len ( ) != 1 {
587589 return Err ( ArrowError :: InvalidArgumentError ( format ! (
588590 "ListViewArray should contain a single child array (values array), had {}" ,
589- data . child_data( ) . len( )
591+ child_data. len( )
590592 ) ) ) ;
591593 }
592594
593- let values = data . child_data ( ) [ 0 ] . clone ( ) ;
595+ let values = child_data. pop ( ) . expect ( "checked above" ) ;
594596
595- if let Some ( child_data_type) = Self :: get_type ( data . data_type ( ) ) {
597+ if let Some ( child_data_type) = Self :: get_type ( & data_type) {
596598 if values. data_type ( ) != child_data_type {
597599 return Err ( ArrowError :: InvalidArgumentError ( format ! (
598600 "{}ListViewArray's child datatype {:?} does not \
@@ -607,18 +609,21 @@ impl<OffsetSize: OffsetSizeTrait> GenericListViewArray<OffsetSize> {
607609 "{}ListViewArray's datatype must be {}ListViewArray(). It is {:?}" ,
608610 OffsetSize :: PREFIX ,
609611 OffsetSize :: PREFIX ,
610- data . data_type( )
612+ data_type
611613 ) ) ) ;
612614 }
613615
614616 let values = make_array ( values) ;
615617 // ArrayData is valid, and verified type above
616- let value_offsets = ScalarBuffer :: new ( data. buffers ( ) [ 0 ] . clone ( ) , data. offset ( ) , data. len ( ) ) ;
617- let value_sizes = ScalarBuffer :: new ( data. buffers ( ) [ 1 ] . clone ( ) , data. offset ( ) , data. len ( ) ) ;
618+ // buffer[0] is offsets, buffer[1] is sizes
619+ let sizes_buffer = buffers. pop ( ) . expect ( "checked above" ) ;
620+ let offsets_buffer = buffers. pop ( ) . expect ( "checked above" ) ;
621+ let value_offsets = ScalarBuffer :: new ( offsets_buffer, offset, len) ;
622+ let value_sizes = ScalarBuffer :: new ( sizes_buffer, offset, len) ;
618623
619624 Ok ( Self {
620- data_type : data . data_type ( ) . clone ( ) ,
621- nulls : data . nulls ( ) . cloned ( ) ,
625+ data_type,
626+ nulls,
622627 values,
623628 value_offsets,
624629 value_sizes,
0 commit comments