Reads the correct number of buffers based on data type and null_count, and creates a primitive array ref
(
&self,
field_node: &FieldNode,
data_type: &DataType,
buffers: &[Buffer],
)
| 262 | /// Reads the correct number of buffers based on data type and null_count, and creates a |
| 263 | /// primitive array ref |
| 264 | fn create_primitive_array( |
| 265 | &self, |
| 266 | field_node: &FieldNode, |
| 267 | data_type: &DataType, |
| 268 | buffers: &[Buffer], |
| 269 | ) -> Result<ArrayRef, ArrowError> { |
| 270 | let length = field_node.length() as usize; |
| 271 | let null_buffer = (field_node.null_count() > 0).then_some(buffers[0].clone()); |
| 272 | let mut builder = match data_type { |
| 273 | Utf8 | Binary | LargeBinary | LargeUtf8 => { |
| 274 | // read 3 buffers: null buffer (optional), offsets buffer and data buffer |
| 275 | ArrayData::builder(data_type.clone()) |
| 276 | .len(length) |
| 277 | .buffers(buffers[1..3].to_vec()) |
| 278 | .null_bit_buffer(null_buffer) |
| 279 | } |
| 280 | BinaryView | Utf8View => ArrayData::builder(data_type.clone()) |
| 281 | .len(length) |
| 282 | .buffers(buffers[1..].to_vec()) |
| 283 | .null_bit_buffer(null_buffer), |
| 284 | _ if data_type.is_primitive() || matches!(data_type, Boolean | FixedSizeBinary(_)) => { |
| 285 | // read 2 buffers: null buffer (optional) and data buffer |
| 286 | ArrayData::builder(data_type.clone()) |
| 287 | .len(length) |
| 288 | .add_buffer(buffers[1].clone()) |
| 289 | .null_bit_buffer(null_buffer) |
| 290 | } |
| 291 | t => unreachable!("Data type {:?} either unsupported or not primitive", t), |
| 292 | }; |
| 293 | |
| 294 | builder = builder.null_count(field_node.null_count() as usize); |
| 295 | |
| 296 | self.create_array_from_builder(builder) |
| 297 | } |
| 298 | |
| 299 | /// Update the ArrayDataBuilder based on settings in this decoder |
| 300 | fn create_array_from_builder(&self, builder: ArrayDataBuilder) -> Result<ArrayRef, ArrowError> { |
no test coverage detected