Path: blob/main/crates/polars-arrow/src/io/ipc/read/array/map.rs
8415 views
use std::collections::VecDeque;1use std::io::{Read, Seek};23use polars_buffer::Buffer;4use polars_error::{PolarsResult, polars_err};5use polars_utils::bool::UnsafeBool;67use super::super::super::IpcField;8use super::super::deserialize::{read, skip};9use super::super::read_basic::*;10use super::super::{Compression, Dictionaries, IpcBuffer, Node, Version};11use crate::array::MapArray;12use crate::datatypes::ArrowDataType;13use crate::io::ipc::read::array::{try_get_array_length, try_get_field_node};1415#[allow(clippy::too_many_arguments)]16pub fn read_map<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<MapArray> {32let field_node = try_get_field_node(field_nodes, &dtype)?;3334let validity = read_validity(35buffers,36field_node,37reader,38block_offset,39is_little_endian,40compression,41limit,42scratch,43)?;4445let length = try_get_array_length(field_node, limit)?;4647let offsets = read_buffer::<i32, _>(48buffers,491 + length,50reader,51block_offset,52is_little_endian,53compression,54scratch,55)56// Older versions of the IPC format sometimes do not report an offset57.or_else(|_| PolarsResult::Ok(Buffer::<i32>::from(vec![0i32])))?;5859let field = MapArray::get_field(&dtype);6061let last_offset: usize = offsets.last().copied().unwrap() as usize;6263let field = read(64field_nodes,65variadic_buffer_counts,66field,67&ipc_field.fields[0],68buffers,69reader,70dictionaries,71block_offset,72is_little_endian,73compression,74Some(last_offset),75version,76scratch,77checked,78)?;79MapArray::try_new(dtype, offsets.try_into()?, field, validity)80}8182pub fn skip_map(83field_nodes: &mut VecDeque<Node>,84dtype: &ArrowDataType,85buffers: &mut VecDeque<IpcBuffer>,86variadic_buffer_counts: &mut VecDeque<usize>,87) -> PolarsResult<()> {88let _ = field_nodes.pop_front().ok_or_else(|| {89polars_err!(90oos = "IPC: unable to fetch the field for map. The file or stream is corrupted."91)92})?;9394let _ = buffers95.pop_front()96.ok_or_else(|| polars_err!(oos = "IPC: missing validity buffer."))?;97let _ = buffers98.pop_front()99.ok_or_else(|| polars_err!(oos = "IPC: missing offsets buffer."))?;100101let dtype = MapArray::get_field(dtype).dtype();102103skip(field_nodes, dtype, buffers, variadic_buffer_counts)104}105106107