|
17 | 17 |
|
18 | 18 | use crate::reader::tape::{Tape, TapeElement}; |
19 | 19 | use crate::reader::{ArrayDecoder, DecoderContext}; |
20 | | -use arrow_array::OffsetSizeTrait; |
21 | 20 | use arrow_array::builder::{BooleanBufferBuilder, BufferBuilder}; |
22 | | -use arrow_buffer::buffer::NullBuffer; |
23 | | -use arrow_data::{ArrayData, ArrayDataBuilder}; |
| 21 | +use arrow_array::{Array, GenericListArray, OffsetSizeTrait, make_array}; |
| 22 | +use arrow_buffer::{OffsetBuffer, ScalarBuffer, buffer::NullBuffer}; |
| 23 | +use arrow_data::ArrayData; |
24 | 24 | use arrow_schema::{ArrowError, DataType}; |
25 | 25 | use std::marker::PhantomData; |
26 | 26 |
|
@@ -93,15 +93,14 @@ impl<O: OffsetSizeTrait> ArrayDecoder for ListArrayDecoder<O> { |
93 | 93 |
|
94 | 94 | let child_data = self.decoder.decode(tape, &child_pos)?; |
95 | 95 | let nulls = nulls.as_mut().map(|x| NullBuffer::new(x.finish())); |
| 96 | + let values = make_array(child_data); |
| 97 | + let field = match &self.data_type { |
| 98 | + DataType::List(f) | DataType::LargeList(f) => f.clone(), |
| 99 | + _ => unreachable!(), |
| 100 | + }; |
| 101 | + let offsets = OffsetBuffer::<O>::new(ScalarBuffer::from(offsets.finish())); |
96 | 102 |
|
97 | | - let data = ArrayDataBuilder::new(self.data_type.clone()) |
98 | | - .len(pos.len()) |
99 | | - .nulls(nulls) |
100 | | - .add_buffer(offsets.finish()) |
101 | | - .child_data(vec![child_data]); |
102 | | - |
103 | | - // Safety |
104 | | - // Validated lengths above |
105 | | - Ok(unsafe { data.build_unchecked() }) |
| 103 | + let array = GenericListArray::<O>::try_new(field, offsets, values, nulls)?; |
| 104 | + Ok(array.into_data()) |
106 | 105 | } |
107 | 106 | } |
0 commit comments