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