Path: blob/main/crates/polars-arrow/src/io/ipc/read/array/dictionary.rs
6940 views
use std::collections::VecDeque;1use std::io::{Read, Seek};23use polars_error::{PolarsResult, polars_bail, polars_err};4use polars_utils::aliases::PlHashSet;56use super::super::{Compression, Dictionaries, IpcBuffer, Node};7use super::{read_primitive, skip_primitive};8use crate::array::{DictionaryArray, DictionaryKey};9use crate::datatypes::ArrowDataType;1011#[allow(clippy::too_many_arguments)]12pub fn read_dictionary<T: DictionaryKey, R: Read + Seek>(13field_nodes: &mut VecDeque<Node>,14dtype: ArrowDataType,15id: Option<i64>,16buffers: &mut VecDeque<IpcBuffer>,17reader: &mut R,18dictionaries: &Dictionaries,19block_offset: u64,20compression: Option<Compression>,21limit: Option<usize>,22is_little_endian: bool,23scratch: &mut Vec<u8>,24) -> PolarsResult<DictionaryArray<T>>25where26Vec<u8>: TryInto<T::Bytes>,27{28let id = if let Some(id) = id {29id30} else {31polars_bail!(oos = "Dictionary has no id.");32};33let values = dictionaries34.get(&id)35.ok_or_else(|| {36let valid_ids = dictionaries.keys().collect::<PlHashSet<_>>();37polars_err!(ComputeError:38"Dictionary id {id} not found. Valid ids: {valid_ids:?}"39)40})?41.clone();4243let keys = read_primitive(44field_nodes,45T::PRIMITIVE.into(),46buffers,47reader,48block_offset,49is_little_endian,50compression,51limit,52scratch,53)?;5455DictionaryArray::<T>::try_new(dtype, keys, values)56}5758pub fn skip_dictionary(59field_nodes: &mut VecDeque<Node>,60buffers: &mut VecDeque<IpcBuffer>,61) -> PolarsResult<()> {62skip_primitive(field_nodes, buffers)63}646566