Path: blob/main/crates/polars-arrow/src/io/ipc/read/array/struct_.rs
8420 views
use std::collections::VecDeque;1use std::io::{Read, Seek};23use polars_error::{PolarsResult, polars_err};4use polars_utils::bool::UnsafeBool;56use super::super::super::IpcField;7use super::super::deserialize::{read, skip};8use super::super::read_basic::*;9use super::super::{Compression, Dictionaries, IpcBuffer, Node, Version};10use super::try_get_array_length;11use crate::array::StructArray;12use crate::datatypes::ArrowDataType;13use crate::io::ipc::read::array::try_get_field_node;1415#[allow(clippy::too_many_arguments)]16pub fn read_struct<R: Read + Seek>(17field_nodes: &mut VecDeque<Node>,18variadic_buffer_counts: &mut VecDeque<usize>,19dtype: ArrowDataType,20ipc_field: &IpcField,21buffers: &mut VecDeque<IpcBuffer>,22reader: &mut R,23dictionaries: &Dictionaries,24block_offset: u64,25is_little_endian: bool,26compression: Option<Compression>,27limit: Option<usize>,28version: Version,29scratch: &mut Vec<u8>,30checked: UnsafeBool,31) -> PolarsResult<StructArray> {32let field_node = try_get_field_node(field_nodes, &dtype)?;33let length = try_get_array_length(field_node, limit)?;3435let validity = read_validity(36buffers,37field_node,38reader,39block_offset,40is_little_endian,41compression,42limit,43scratch,44)?;4546let fields = StructArray::get_fields(&dtype);4748let values = fields49.iter()50.zip(ipc_field.fields.iter())51.map(|(field, ipc_field)| {52read(53field_nodes,54variadic_buffer_counts,55field,56ipc_field,57buffers,58reader,59dictionaries,60block_offset,61is_little_endian,62compression,63limit,64version,65scratch,66checked,67)68})69.collect::<PolarsResult<Vec<_>>>()?;7071StructArray::try_new(dtype, length, values, validity)72}7374pub fn skip_struct(75field_nodes: &mut VecDeque<Node>,76dtype: &ArrowDataType,77buffers: &mut VecDeque<IpcBuffer>,78variadic_buffer_counts: &mut VecDeque<usize>,79) -> PolarsResult<()> {80let _ = field_nodes.pop_front().ok_or_else(|| {81polars_err!(82oos = "IPC: unable to fetch the field for struct. The file or stream is corrupted."83)84})?;8586let _ = buffers87.pop_front()88.ok_or_else(|| polars_err!(oos = "IPC: missing validity buffer."))?;8990let fields = StructArray::get_fields(dtype);9192fields93.iter()94.try_for_each(|field| skip(field_nodes, field.dtype(), buffers, variadic_buffer_counts))95}969798