Path: blob/main/crates/polars-compute/src/comparisons/dyn_array.rs
8415 views
use arrow::array::{1Array, BinaryArray, BinaryViewArray, BooleanArray, DictionaryArray, FixedSizeBinaryArray,2ListArray, NullArray, PrimitiveArray, StructArray, Utf8Array, Utf8ViewArray,3};4use arrow::bitmap::Bitmap;5use arrow::types::{days_ms, i256, months_days_ns};6use polars_utils::float16::pf16;78use crate::comparisons::TotalEqKernel;910macro_rules! call_binary {11($T:ty, $lhs:expr, $rhs:expr, $op:path) => {{12let lhs: &$T = $lhs.as_any().downcast_ref().unwrap();13let rhs: &$T = $rhs.as_any().downcast_ref().unwrap();14$op(lhs, rhs)15}};16}1718macro_rules! compare {19($lhs:expr, $rhs:expr, $op:path) => {{20let lhs = $lhs;21let rhs = $rhs;2223assert_eq!(lhs.dtype(), rhs.dtype());2425use arrow::datatypes::{IntegerType as I, PhysicalType as PH, PrimitiveType as PR};26match lhs.dtype().to_physical_type() {27PH::Boolean => call_binary!(BooleanArray, lhs, rhs, $op),28PH::BinaryView => call_binary!(BinaryViewArray, lhs, rhs, $op),29PH::Utf8View => call_binary!(Utf8ViewArray, lhs, rhs, $op),30PH::Primitive(PR::Int8) => call_binary!(PrimitiveArray<i8>, lhs, rhs, $op),31PH::Primitive(PR::Int16) => call_binary!(PrimitiveArray<i16>, lhs, rhs, $op),32PH::Primitive(PR::Int32) => call_binary!(PrimitiveArray<i32>, lhs, rhs, $op),33PH::Primitive(PR::Int64) => call_binary!(PrimitiveArray<i64>, lhs, rhs, $op),34PH::Primitive(PR::Int128) => call_binary!(PrimitiveArray<i128>, lhs, rhs, $op),35PH::Primitive(PR::UInt8) => call_binary!(PrimitiveArray<u8>, lhs, rhs, $op),36PH::Primitive(PR::UInt16) => call_binary!(PrimitiveArray<u16>, lhs, rhs, $op),37PH::Primitive(PR::UInt32) => call_binary!(PrimitiveArray<u32>, lhs, rhs, $op),38PH::Primitive(PR::UInt64) => call_binary!(PrimitiveArray<u64>, lhs, rhs, $op),39PH::Primitive(PR::UInt128) => call_binary!(PrimitiveArray<u128>, lhs, rhs, $op),40PH::Primitive(PR::Float16) => call_binary!(PrimitiveArray<pf16>, lhs, rhs, $op),41PH::Primitive(PR::Float32) => call_binary!(PrimitiveArray<f32>, lhs, rhs, $op),42PH::Primitive(PR::Float64) => call_binary!(PrimitiveArray<f64>, lhs, rhs, $op),43PH::Primitive(PR::Int256) => call_binary!(PrimitiveArray<i256>, lhs, rhs, $op),44PH::Primitive(PR::DaysMs) => call_binary!(PrimitiveArray<days_ms>, lhs, rhs, $op),45PH::Primitive(PR::MonthDayNano) => {46call_binary!(PrimitiveArray<months_days_ns>, lhs, rhs, $op)47},48PH::Primitive(PR::MonthDayMillis) => unimplemented!(),4950#[cfg(feature = "dtype-array")]51PH::FixedSizeList => call_binary!(arrow::array::FixedSizeListArray, lhs, rhs, $op),52#[cfg(not(feature = "dtype-array"))]53PH::FixedSizeList => todo!(54"Comparison of FixedSizeListArray is not supported without dtype-array feature"55),5657PH::Null => call_binary!(NullArray, lhs, rhs, $op),58PH::FixedSizeBinary => call_binary!(FixedSizeBinaryArray, lhs, rhs, $op),59PH::Binary => call_binary!(BinaryArray<i32>, lhs, rhs, $op),60PH::LargeBinary => call_binary!(BinaryArray<i64>, lhs, rhs, $op),61PH::Utf8 => call_binary!(Utf8Array<i32>, lhs, rhs, $op),62PH::LargeUtf8 => call_binary!(Utf8Array<i64>, lhs, rhs, $op),63PH::List => call_binary!(ListArray<i32>, lhs, rhs, $op),64PH::LargeList => call_binary!(ListArray<i64>, lhs, rhs, $op),65PH::Struct => call_binary!(StructArray, lhs, rhs, $op),66PH::Union => todo!("Comparison of UnionArrays is not yet supported"),67PH::Map => todo!("Comparison of MapArrays is not yet supported"),68PH::Dictionary(I::Int8) => call_binary!(DictionaryArray<i8>, lhs, rhs, $op),69PH::Dictionary(I::Int16) => call_binary!(DictionaryArray<i16>, lhs, rhs, $op),70PH::Dictionary(I::Int32) => call_binary!(DictionaryArray<i32>, lhs, rhs, $op),71PH::Dictionary(I::Int64) => call_binary!(DictionaryArray<i64>, lhs, rhs, $op),72PH::Dictionary(I::Int128) => call_binary!(DictionaryArray<i128>, lhs, rhs, $op),73PH::Dictionary(I::UInt8) => call_binary!(DictionaryArray<u8>, lhs, rhs, $op),74PH::Dictionary(I::UInt16) => call_binary!(DictionaryArray<u16>, lhs, rhs, $op),75PH::Dictionary(I::UInt32) => call_binary!(DictionaryArray<u32>, lhs, rhs, $op),76PH::Dictionary(I::UInt64) => call_binary!(DictionaryArray<u64>, lhs, rhs, $op),77PH::Dictionary(I::UInt128) => call_binary!(DictionaryArray<u128>, lhs, rhs, $op),78}79}};80}8182pub fn array_tot_eq_missing_kernel(lhs: &dyn Array, rhs: &dyn Array) -> Bitmap {83compare!(lhs, rhs, TotalEqKernel::tot_eq_missing_kernel)84}8586pub fn array_tot_ne_missing_kernel(lhs: &dyn Array, rhs: &dyn Array) -> Bitmap {87compare!(lhs, rhs, TotalEqKernel::tot_ne_missing_kernel)88}899091