Path: blob/main/crates/polars-compute/src/unique/dictionary.rs
6939 views
use arrow::array::{Array, DictionaryArray};1use arrow::datatypes::ArrowDataType;23use super::{PrimitiveRangedUniqueState, RangedUniqueKernel};45/// A specialized unique kernel for [`DictionaryArray`] for when all values are in a small known6/// range.7pub struct DictionaryRangedUniqueState {8key_state: PrimitiveRangedUniqueState<u32>,9values: Box<dyn Array>,10}1112impl DictionaryRangedUniqueState {13pub fn new(values: Box<dyn Array>) -> Self {14Self {15key_state: PrimitiveRangedUniqueState::new(0, values.len() as u32 + 1),16values,17}18}1920pub fn key_state(&mut self) -> &mut PrimitiveRangedUniqueState<u32> {21&mut self.key_state22}23}2425impl RangedUniqueKernel for DictionaryRangedUniqueState {26type Array = DictionaryArray<u32>;2728fn has_seen_all(&self) -> bool {29self.key_state.has_seen_all()30}3132fn append(&mut self, array: &Self::Array) {33self.key_state.append(array.keys());34}3536fn append_state(&mut self, other: &Self) {37debug_assert_eq!(self.values, other.values);38self.key_state.append_state(&other.key_state);39}4041fn finalize_unique(self) -> Self::Array {42let keys = self.key_state.finalize_unique();43DictionaryArray::<u32>::try_new(44ArrowDataType::Dictionary(45arrow::datatypes::IntegerType::UInt32,46Box::new(self.values.dtype().clone()),47false,48),49keys,50self.values,51)52.unwrap()53}5455fn finalize_n_unique(&self) -> usize {56self.key_state.finalize_n_unique()57}5859fn finalize_n_unique_non_null(&self) -> usize {60self.key_state.finalize_n_unique_non_null()61}62}636465