Path: blob/main/crates/polars-compute/src/min_max/dyn_array.rs
6939 views
use arrow::array::{1Array, BinaryArray, BinaryViewArray, BooleanArray, PrimitiveArray, Utf8Array, Utf8ViewArray,2};3use arrow::scalar::{BinaryScalar, BinaryViewScalar, BooleanScalar, PrimitiveScalar, Scalar};45use crate::min_max::MinMaxKernel;67macro_rules! call_op {8($T:ty, $scalar:ty, $arr:expr, $op:path) => {{9let arr: &$T = $arr.as_any().downcast_ref().unwrap();10$op(arr).map(|v| Box::new(<$scalar>::new(Some(v))) as Box<dyn Scalar>)11}};12(dt: $T:ty, $scalar:ty, $arr:expr, $op:path) => {{13let arr: &$T = $arr.as_any().downcast_ref().unwrap();14$op(arr).map(|v| Box::new(<$scalar>::new(arr.dtype().clone(), Some(v))) as Box<dyn Scalar>)15}};16($T:ty, $scalar:ty, $arr:expr, $op:path, ret_two) => {{17let arr: &$T = $arr.as_any().downcast_ref().unwrap();18$op(arr).map(|(l, r)| {19(20Box::new(<$scalar>::new(Some(l))) as Box<dyn Scalar>,21Box::new(<$scalar>::new(Some(r))) as Box<dyn Scalar>,22)23})24}};25(dt: $T:ty, $scalar:ty, $arr:expr, $op:path, ret_two) => {{26let arr: &$T = $arr.as_any().downcast_ref().unwrap();27$op(arr).map(|(l, r)| {28(29Box::new(<$scalar>::new(arr.dtype().clone(), Some(l))) as Box<dyn Scalar>,30Box::new(<$scalar>::new(arr.dtype().clone(), Some(r))) as Box<dyn Scalar>,31)32})33}};34}3536macro_rules! call {37($arr:expr, $op:path$(, $variant:ident)?) => {{38let arr = $arr;3940use arrow::datatypes::{PhysicalType as PH, PrimitiveType as PR};41use PrimitiveArray as PArr;42use PrimitiveScalar as PScalar;43match arr.dtype().to_physical_type() {44PH::Boolean => call_op!(BooleanArray, BooleanScalar, arr, $op$(, $variant)?),45PH::Primitive(PR::Int8) => call_op!(dt: PArr<i8>, PScalar<i8>, arr, $op$(, $variant)?),46PH::Primitive(PR::Int16) => call_op!(dt: PArr<i16>, PScalar<i16>, arr, $op$(, $variant)?),47PH::Primitive(PR::Int32) => call_op!(dt: PArr<i32>, PScalar<i32>, arr, $op$(, $variant)?),48PH::Primitive(PR::Int64) => call_op!(dt: PArr<i64>, PScalar<i64>, arr, $op$(, $variant)?),49PH::Primitive(PR::Int128) => call_op!(dt: PArr<i128>, PScalar<i128>, arr, $op$(, $variant)?),50PH::Primitive(PR::UInt8) => call_op!(dt: PArr<u8>, PScalar<u8>, arr, $op$(, $variant)?),51PH::Primitive(PR::UInt16) => call_op!(dt: PArr<u16>, PScalar<u16>, arr, $op$(, $variant)?),52PH::Primitive(PR::UInt32) => call_op!(dt: PArr<u32>, PScalar<u32>, arr, $op$(, $variant)?),53PH::Primitive(PR::UInt64) => call_op!(dt: PArr<u64>, PScalar<u64>, arr, $op$(, $variant)?),54PH::Primitive(PR::UInt128) => call_op!(dt: PArr<u128>, PScalar<u128>, arr, $op$(, $variant)?),55PH::Primitive(PR::Float32) => call_op!(dt: PArr<f32>, PScalar<f32>, arr, $op$(, $variant)?),56PH::Primitive(PR::Float64) => call_op!(dt: PArr<f64>, PScalar<f64>, arr, $op$(, $variant)?),5758PH::BinaryView => call_op!(BinaryViewArray, BinaryViewScalar<[u8]>, arr, $op$(, $variant)?),59PH::Utf8View => call_op!(Utf8ViewArray, BinaryViewScalar<str>, arr, $op$(, $variant)?),6061PH::Binary => call_op!(BinaryArray<i32>, BinaryScalar<i32>, arr, $op$(, $variant)?),62PH::LargeBinary => call_op!(BinaryArray<i64>, BinaryScalar<i64>, arr, $op$(, $variant)?),63PH::Utf8 => call_op!(Utf8Array<i32>, BinaryScalar<i32>, arr, $op$(, $variant)?),64PH::LargeUtf8 => call_op!(Utf8Array<i64>, BinaryScalar<i64>, arr, $op$(, $variant)?),6566_ => todo!("Dynamic MinMax is not yet implemented for {:?}", arr.dtype()),67}68}};69}7071pub fn dyn_array_min_ignore_nan(arr: &dyn Array) -> Option<Box<dyn Scalar>> {72call!(arr, MinMaxKernel::min_ignore_nan_kernel)73}7475pub fn dyn_array_max_ignore_nan(arr: &dyn Array) -> Option<Box<dyn Scalar>> {76call!(arr, MinMaxKernel::max_ignore_nan_kernel)77}7879pub fn dyn_array_min_propagate_nan(arr: &dyn Array) -> Option<Box<dyn Scalar>> {80call!(arr, MinMaxKernel::min_propagate_nan_kernel)81}8283pub fn dyn_array_max_propagate_nan(arr: &dyn Array) -> Option<Box<dyn Scalar>> {84call!(arr, MinMaxKernel::max_propagate_nan_kernel)85}8687pub fn dyn_array_min_max_propagate_nan(88arr: &dyn Array,89) -> Option<(Box<dyn Scalar>, Box<dyn Scalar>)> {90call!(arr, MinMaxKernel::min_max_propagate_nan_kernel, ret_two)91}929394