Path: blob/main/crates/polars-arrow/src/io/ipc/write/mod.rs
8424 views
//! APIs to write to Arrow's IPC format.1pub(crate) mod common;2pub mod schema;3mod serialize;4mod stream;5pub(crate) mod writer;67pub use arrow_format::ipc::{Block, KeyValue, KeyValueRef};8pub use common::{9Compression, DictionaryTracker, EncodedData, EncodedDataBytes, Record, WriteOptions,10arrow_ipc_block, commit_encoded_arrays, dictionaries_to_encode, encode_array,11encode_dictionary_values, encode_new_dictionaries, encode_record_batch,12};13pub use schema::schema_to_bytes;14pub use serialize::write;15pub use stream::StreamWriter;16pub use writer::FileWriter;1718pub mod common_sync;1920use super::IpcField;21use crate::datatypes::{ArrowDataType, Field};2223fn default_ipc_field(dtype: &ArrowDataType, current_id: &mut i64) -> IpcField {24use crate::datatypes::ArrowDataType::*;25match dtype.to_storage() {26// single child => recurse27Map(inner, ..) | FixedSizeList(inner, _) | LargeList(inner) | List(inner) => IpcField {28fields: vec![default_ipc_field(inner.dtype(), current_id)],29dictionary_id: None,30},31// multiple children => recurse32Struct(fields) => IpcField {33fields: fields34.iter()35.map(|f| default_ipc_field(f.dtype(), current_id))36.collect(),37dictionary_id: None,38},39// multiple children => recurse40Union(u) => IpcField {41fields: u42.fields43.iter()44.map(|f| default_ipc_field(f.dtype(), current_id))45.collect(),46dictionary_id: None,47},48// dictionary => current_id49Dictionary(_, dtype, _) => {50let dictionary_id = Some(*current_id);51*current_id += 1;52IpcField {53fields: vec![default_ipc_field(dtype, current_id)],54dictionary_id,55}56},57// no children => do nothing58_ => IpcField {59fields: vec![],60dictionary_id: None,61},62}63}6465/// Assigns every dictionary field a unique ID66pub fn default_ipc_fields<'a>(fields: impl ExactSizeIterator<Item = &'a Field>) -> Vec<IpcField> {67let mut dictionary_id = 0i64;68fields69.map(|field| default_ipc_field(field.dtype().to_storage(), &mut dictionary_id))70.collect()71}727374