@@ -574,23 +574,25 @@ impl<OffsetSize: OffsetSizeTrait> From<FixedSizeListArray> for GenericListViewAr
574574
575575impl < OffsetSize : OffsetSizeTrait > GenericListViewArray < OffsetSize > {
576576 fn try_new_from_array_data ( data : ArrayData ) -> Result < Self , ArrowError > {
577- if data. buffers ( ) . len ( ) != 2 {
577+ let ( data_type, len, nulls, offset, mut buffers, mut child_data) = data. into_parts ( ) ;
578+
579+ if buffers. len ( ) != 2 {
578580 return Err ( ArrowError :: InvalidArgumentError ( format ! (
579581 "ListViewArray data should contain two buffers (value offsets & value sizes), had {}" ,
580- data . buffers( ) . len( )
582+ buffers. len( )
581583 ) ) ) ;
582584 }
583585
584- if data . child_data ( ) . len ( ) != 1 {
586+ if child_data. len ( ) != 1 {
585587 return Err ( ArrowError :: InvalidArgumentError ( format ! (
586588 "ListViewArray should contain a single child array (values array), had {}" ,
587- data . child_data( ) . len( )
589+ child_data. len( )
588590 ) ) ) ;
589591 }
590592
591- let values = data . child_data ( ) [ 0 ] . clone ( ) ;
593+ let values = child_data. pop ( ) . expect ( "checked above" ) ;
592594
593- if let Some ( child_data_type) = Self :: get_type ( data . data_type ( ) ) {
595+ if let Some ( child_data_type) = Self :: get_type ( & data_type) {
594596 if values. data_type ( ) != child_data_type {
595597 return Err ( ArrowError :: InvalidArgumentError ( format ! (
596598 "{}ListViewArray's child datatype {:?} does not \
@@ -605,18 +607,21 @@ impl<OffsetSize: OffsetSizeTrait> GenericListViewArray<OffsetSize> {
605607 "{}ListViewArray's datatype must be {}ListViewArray(). It is {:?}" ,
606608 OffsetSize :: PREFIX ,
607609 OffsetSize :: PREFIX ,
608- data . data_type( )
610+ data_type
609611 ) ) ) ;
610612 }
611613
612614 let values = make_array ( values) ;
613615 // ArrayData is valid, and verified type above
614- let value_offsets = ScalarBuffer :: new ( data. buffers ( ) [ 0 ] . clone ( ) , data. offset ( ) , data. len ( ) ) ;
615- let value_sizes = ScalarBuffer :: new ( data. buffers ( ) [ 1 ] . clone ( ) , data. offset ( ) , data. len ( ) ) ;
616+ // buffer[0] is offsets, buffer[1] is sizes
617+ let sizes_buffer = buffers. pop ( ) . expect ( "checked above" ) ;
618+ let offsets_buffer = buffers. pop ( ) . expect ( "checked above" ) ;
619+ let value_offsets = ScalarBuffer :: new ( offsets_buffer, offset, len) ;
620+ let value_sizes = ScalarBuffer :: new ( sizes_buffer, offset, len) ;
616621
617622 Ok ( Self {
618- data_type : data . data_type ( ) . clone ( ) ,
619- nulls : data . nulls ( ) . cloned ( ) ,
623+ data_type,
624+ nulls,
620625 values,
621626 value_offsets,
622627 value_sizes,
0 commit comments