Path: blob/main/crates/polars-arrow/src/io/ipc/read/deserialize.rs
6940 views
use std::collections::VecDeque;1use std::io::{Read, Seek};23use arrow_format::ipc::{BodyCompressionRef, MetadataVersion};4use polars_error::PolarsResult;56use super::array::*;7use super::{Dictionaries, IpcBuffer, Node};8use crate::array::*;9use crate::datatypes::{ArrowDataType, Field, PhysicalType};10use crate::io::ipc::IpcField;11use crate::{match_integer_type, with_match_primitive_type_full};1213#[allow(clippy::too_many_arguments)]14pub fn read<R: Read + Seek>(15field_nodes: &mut VecDeque<Node>,16variadic_buffer_counts: &mut VecDeque<usize>,17field: &Field,18ipc_field: &IpcField,19buffers: &mut VecDeque<IpcBuffer>,20reader: &mut R,21dictionaries: &Dictionaries,22block_offset: u64,23is_little_endian: bool,24compression: Option<BodyCompressionRef>,25limit: Option<usize>,26version: MetadataVersion,27scratch: &mut Vec<u8>,28) -> PolarsResult<Box<dyn Array>> {29use PhysicalType::*;30let dtype = field.dtype.clone();3132match dtype.to_physical_type() {33Null => read_null(field_nodes, dtype, limit).map(|x| x.boxed()),34Boolean => read_boolean(35field_nodes,36dtype,37buffers,38reader,39block_offset,40is_little_endian,41compression,42limit,43scratch,44)45.map(|x| x.boxed()),46Primitive(primitive) => with_match_primitive_type_full!(primitive, |$T| {47read_primitive::<$T, _>(48field_nodes,49dtype,50buffers,51reader,52block_offset,53is_little_endian,54compression,55limit,56scratch,57)58.map(|x| x.boxed())59}),60Binary => read_binary::<i32, _>(61field_nodes,62dtype,63buffers,64reader,65block_offset,66is_little_endian,67compression,68limit,69scratch,70)71.map(|x| x.boxed()),72LargeBinary => read_binary::<i64, _>(73field_nodes,74dtype,75buffers,76reader,77block_offset,78is_little_endian,79compression,80limit,81scratch,82)83.map(|x| x.boxed()),84FixedSizeBinary => read_fixed_size_binary(85field_nodes,86dtype,87buffers,88reader,89block_offset,90is_little_endian,91compression,92limit,93scratch,94)95.map(|x| x.boxed()),96Utf8 => read_utf8::<i32, _>(97field_nodes,98dtype,99buffers,100reader,101block_offset,102is_little_endian,103compression,104limit,105scratch,106)107.map(|x| x.boxed()),108LargeUtf8 => read_utf8::<i64, _>(109field_nodes,110dtype,111buffers,112reader,113block_offset,114is_little_endian,115compression,116limit,117scratch,118)119.map(|x| x.boxed()),120List => read_list::<i32, _>(121field_nodes,122variadic_buffer_counts,123dtype,124ipc_field,125buffers,126reader,127dictionaries,128block_offset,129is_little_endian,130compression,131limit,132version,133scratch,134)135.map(|x| x.boxed()),136LargeList => read_list::<i64, _>(137field_nodes,138variadic_buffer_counts,139dtype,140ipc_field,141buffers,142reader,143dictionaries,144block_offset,145is_little_endian,146compression,147limit,148version,149scratch,150)151.map(|x| x.boxed()),152FixedSizeList => read_fixed_size_list(153field_nodes,154variadic_buffer_counts,155dtype,156ipc_field,157buffers,158reader,159dictionaries,160block_offset,161is_little_endian,162compression,163limit,164version,165scratch,166)167.map(|x| x.boxed()),168Struct => read_struct(169field_nodes,170variadic_buffer_counts,171dtype,172ipc_field,173buffers,174reader,175dictionaries,176block_offset,177is_little_endian,178compression,179limit,180version,181scratch,182)183.map(|x| x.boxed()),184Dictionary(key_type) => {185match_integer_type!(key_type, |$T| {186read_dictionary::<$T, _>(187field_nodes,188dtype,189ipc_field.dictionary_id,190buffers,191reader,192dictionaries,193block_offset,194compression,195limit,196is_little_endian,197scratch,198)199.map(|x| x.boxed())200})201},202Union => read_union(203field_nodes,204variadic_buffer_counts,205dtype,206ipc_field,207buffers,208reader,209dictionaries,210block_offset,211is_little_endian,212compression,213limit,214version,215scratch,216)217.map(|x| x.boxed()),218Map => read_map(219field_nodes,220variadic_buffer_counts,221dtype,222ipc_field,223buffers,224reader,225dictionaries,226block_offset,227is_little_endian,228compression,229limit,230version,231scratch,232)233.map(|x| x.boxed()),234Utf8View => read_binview::<str, _>(235field_nodes,236variadic_buffer_counts,237dtype,238buffers,239reader,240block_offset,241is_little_endian,242compression,243limit,244scratch,245),246BinaryView => read_binview::<[u8], _>(247field_nodes,248variadic_buffer_counts,249dtype,250buffers,251reader,252block_offset,253is_little_endian,254compression,255limit,256scratch,257),258}259}260261pub fn skip(262field_nodes: &mut VecDeque<Node>,263dtype: &ArrowDataType,264buffers: &mut VecDeque<IpcBuffer>,265variadic_buffer_counts: &mut VecDeque<usize>,266) -> PolarsResult<()> {267use PhysicalType::*;268match dtype.to_physical_type() {269Null => skip_null(field_nodes),270Boolean => skip_boolean(field_nodes, buffers),271Primitive(_) => skip_primitive(field_nodes, buffers),272LargeBinary | Binary => skip_binary(field_nodes, buffers),273LargeUtf8 | Utf8 => skip_utf8(field_nodes, buffers),274FixedSizeBinary => skip_fixed_size_binary(field_nodes, buffers),275List => skip_list::<i32>(field_nodes, dtype, buffers, variadic_buffer_counts),276LargeList => skip_list::<i64>(field_nodes, dtype, buffers, variadic_buffer_counts),277FixedSizeList => skip_fixed_size_list(field_nodes, dtype, buffers, variadic_buffer_counts),278Struct => skip_struct(field_nodes, dtype, buffers, variadic_buffer_counts),279Dictionary(_) => skip_dictionary(field_nodes, buffers),280Union => skip_union(field_nodes, dtype, buffers, variadic_buffer_counts),281Map => skip_map(field_nodes, dtype, buffers, variadic_buffer_counts),282BinaryView | Utf8View => skip_binview(field_nodes, buffers, variadic_buffer_counts),283}284}285286287