Path: blob/main/crates/polars-parquet/src/arrow/read/expr.rs
6940 views
use std::sync::Arc;12use arrow::array::Array;3use arrow::bitmap::{Bitmap, BitmapBuilder};4use arrow::types::AlignedBytes;56#[derive(Clone)]7pub enum ParquetScalar {8Null,910Boolean(bool),1112Int8(i8),13Int16(i16),14Int32(i32),15Int64(i64),16UInt8(u8),17UInt16(u16),18UInt32(u32),19UInt64(u64),2021Float32(f32),22Float64(f64),2324FixedSizeBinary(Box<[u8]>),2526String(Box<str>),27Binary(Box<[u8]>),28}2930impl ParquetScalar {31pub(crate) fn is_null(&self) -> bool {32matches!(self, Self::Null)33}3435pub(crate) fn to_aligned_bytes<B: AlignedBytes>(&self) -> Option<B> {36match self {37Self::Int8(v) => <B::Unaligned>::try_from(&v.to_le_bytes())38.ok()39.map(B::from_unaligned),40Self::Int16(v) => <B::Unaligned>::try_from(&v.to_le_bytes())41.ok()42.map(B::from_unaligned),43Self::Int32(v) => <B::Unaligned>::try_from(&v.to_le_bytes())44.ok()45.map(B::from_unaligned),46Self::Int64(v) => <B::Unaligned>::try_from(&v.to_le_bytes())47.ok()48.map(B::from_unaligned),49Self::UInt8(v) => <B::Unaligned>::try_from(&v.to_le_bytes())50.ok()51.map(B::from_unaligned),52Self::UInt16(v) => <B::Unaligned>::try_from(&v.to_le_bytes())53.ok()54.map(B::from_unaligned),55Self::UInt32(v) => <B::Unaligned>::try_from(&v.to_le_bytes())56.ok()57.map(B::from_unaligned),58Self::UInt64(v) => <B::Unaligned>::try_from(&v.to_le_bytes())59.ok()60.map(B::from_unaligned),61Self::Float32(v) => <B::Unaligned>::try_from(&v.to_le_bytes())62.ok()63.map(B::from_unaligned),64Self::Float64(v) => <B::Unaligned>::try_from(&v.to_le_bytes())65.ok()66.map(B::from_unaligned),67_ => None,68}69}7071pub(crate) fn as_str(&self) -> Option<&str> {72match self {73Self::String(s) => Some(s.as_ref()),74_ => None,75}76}7778pub(crate) fn as_binary(&self) -> Option<&[u8]> {79match self {80Self::Binary(s) => Some(s.as_ref()),81_ => None,82}83}84}8586#[derive(Clone)]87pub enum SpecializedParquetColumnExpr {88Equal(ParquetScalar),8990Between(ParquetScalar, ParquetScalar),9192EqualOneOf(Box<[ParquetScalar]>),9394StartsWith(Box<[u8]>),95EndsWith(Box<[u8]>),96StartEndsWith(Box<[u8]>, Box<[u8]>),97}9899pub type ParquetColumnExprRef = Arc<dyn ParquetColumnExpr>;100pub trait ParquetColumnExpr: Send + Sync {101fn evaluate(&self, values: &dyn Array) -> Bitmap {102let mut bm = BitmapBuilder::new();103self.evaluate_mut(values, &mut bm);104bm.freeze()105}106fn evaluate_mut(&self, values: &dyn Array, bm: &mut BitmapBuilder);107fn evaluate_null(&self) -> bool;108109fn as_specialized(&self) -> Option<&SpecializedParquetColumnExpr>;110}111112113