Path: blob/main/crates/polars-arrow/src/io/ipc/read/array/struct_.rs
6940 views
use std::collections::VecDeque;1use std::io::{Read, Seek};23use polars_error::{PolarsResult, polars_err};45use super::super::super::IpcField;6use super::super::deserialize::{read, skip};7use super::super::read_basic::*;8use super::super::{Compression, Dictionaries, IpcBuffer, Node, Version};9use super::try_get_array_length;10use crate::array::StructArray;11use crate::datatypes::ArrowDataType;12use crate::io::ipc::read::array::try_get_field_node;1314#[allow(clippy::too_many_arguments)]15pub fn read_struct<R: Read + Seek>(16field_nodes: &mut VecDeque<Node>,17variadic_buffer_counts: &mut VecDeque<usize>,18dtype: ArrowDataType,19ipc_field: &IpcField,20buffers: &mut VecDeque<IpcBuffer>,21reader: &mut R,22dictionaries: &Dictionaries,23block_offset: u64,24is_little_endian: bool,25compression: Option<Compression>,26limit: Option<usize>,27version: Version,28scratch: &mut Vec<u8>,29) -> PolarsResult<StructArray> {30let field_node = try_get_field_node(field_nodes, &dtype)?;31let length = try_get_array_length(field_node, limit)?;3233let validity = read_validity(34buffers,35field_node,36reader,37block_offset,38is_little_endian,39compression,40limit,41scratch,42)?;4344let fields = StructArray::get_fields(&dtype);4546let values = fields47.iter()48.zip(ipc_field.fields.iter())49.map(|(field, ipc_field)| {50read(51field_nodes,52variadic_buffer_counts,53field,54ipc_field,55buffers,56reader,57dictionaries,58block_offset,59is_little_endian,60compression,61limit,62version,63scratch,64)65})66.collect::<PolarsResult<Vec<_>>>()?;6768StructArray::try_new(dtype, length, values, validity)69}7071pub fn skip_struct(72field_nodes: &mut VecDeque<Node>,73dtype: &ArrowDataType,74buffers: &mut VecDeque<IpcBuffer>,75variadic_buffer_counts: &mut VecDeque<usize>,76) -> PolarsResult<()> {77let _ = field_nodes.pop_front().ok_or_else(|| {78polars_err!(79oos = "IPC: unable to fetch the field for struct. The file or stream is corrupted."80)81})?;8283let _ = buffers84.pop_front()85.ok_or_else(|| polars_err!(oos = "IPC: missing validity buffer."))?;8687let fields = StructArray::get_fields(dtype);8889fields90.iter()91.try_for_each(|field| skip(field_nodes, field.dtype(), buffers, variadic_buffer_counts))92}939495