Path: blob/main/crates/polars-stream/src/nodes/io_sinks2/components/partition_key.rs
7884 views
use arrow::array::{BinaryViewArray, FixedSizeBinaryArray, PrimitiveArray};1use arrow::buffer::Buffer;2use arrow::datatypes::ArrowDataType;3use polars_core::prelude::{Column, DataType, LargeBinaryArray};4use polars_core::with_match_physical_integer_type;56pub type PartitionKey = polars_utils::small_bytes::SmallBytes;78pub enum PreComputedKeys {9Binview(BinaryViewArray),10Primitive(FixedSizeBinaryArray),11RowEncoded(LargeBinaryArray),12}1314impl PreComputedKeys {15#[expect(unused)]16pub fn name(&self) -> &'static str {17match self {18Self::Binview(_) => "Binview",19Self::Primitive(_) => "Primitive",20Self::RowEncoded(_) => "RowEncoded",21}22}2324pub fn opt_new_non_encoded(column: &Column) -> Option<Self> {25Some(match column.dtype() {26DataType::Binary => Self::Binview(27column28.binary()29.unwrap()30.rechunk()31.downcast_as_array()32.clone(),33),34DataType::String => Self::Binview(35column36.str()37.unwrap()38.as_binary()39.rechunk()40.downcast_as_array()41.clone(),42),43dt if dt.is_primitive() && dt.to_physical().is_integer() => {44let c = column.to_physical_repr();4546let [arr] = c47.as_materialized_series()48.rechunk()49.into_chunks()50.try_into()51.unwrap();5253let (bytes, width): (Buffer<u8>, usize) = with_match_physical_integer_type!(dt, |$T| {54let arr: &PrimitiveArray<$T> = arr.as_any().downcast_ref().unwrap();55(arr.values().clone().try_transmute().unwrap(), std::mem::size_of::<$T>())56});5758assert_eq!(width * arr.len(), bytes.len());5960let arr = FixedSizeBinaryArray::new(61ArrowDataType::FixedSizeBinary(width),62bytes,63arr.validity().cloned(),64);6566PreComputedKeys::Primitive(arr)67},68_ => return None,69})70}7172#[inline]73pub fn get_key(&self, idx: usize) -> PartitionKey {74match self {75Self::Binview(arr) => PartitionKey::from_opt_slice(arr.get(idx)),76Self::Primitive(arr) => PartitionKey::from_opt_slice(arr.get(idx)),77Self::RowEncoded(arr) => PartitionKey::from_slice(unsafe { arr.value_unchecked(idx) }),78}79}80}818283