Path: blob/main/crates/polars-parquet/src/arrow/read/expr.rs
8430 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}8485pub(crate) fn as_bool(&self) -> Option<bool> {86match self {87Self::Boolean(s) => Some(*s),88_ => None,89}90}91}9293#[derive(Clone)]94pub enum SpecializedParquetColumnExpr {95Equal(ParquetScalar),96Between(ParquetScalar, ParquetScalar),97EqualOneOf(Box<[ParquetScalar]>),98StartsWith(Box<[u8]>),99EndsWith(Box<[u8]>),100RegexMatch(regex::bytes::Regex),101}102103pub type ParquetColumnExprRef = Arc<dyn ParquetColumnExpr>;104pub trait ParquetColumnExpr: Send + Sync {105fn evaluate(&self, values: &dyn Array) -> Bitmap {106let mut bm = BitmapBuilder::new();107self.evaluate_mut(values, &mut bm);108bm.freeze()109}110fn evaluate_mut(&self, values: &dyn Array, bm: &mut BitmapBuilder);111fn evaluate_null(&self) -> bool;112113fn as_specialized(&self) -> Option<&SpecializedParquetColumnExpr>;114}115116117