polars_compute/comparisons/
binary.rs

1use arrow::array::{BinaryArray, FixedSizeBinaryArray};
2use arrow::bitmap::Bitmap;
3use arrow::types::Offset;
4use polars_utils::total_ord::{TotalEq, TotalOrd};
5
6use super::{TotalEqKernel, TotalOrdKernel};
7
8impl<O: Offset> TotalEqKernel for BinaryArray<O> {
9    type Scalar = [u8];
10
11    fn tot_eq_kernel(&self, other: &Self) -> Bitmap {
12        assert!(self.len() == other.len());
13        self.values_iter()
14            .zip(other.values_iter())
15            .map(|(l, r)| l.tot_eq(&r))
16            .collect()
17    }
18
19    fn tot_ne_kernel(&self, other: &Self) -> Bitmap {
20        assert!(self.len() == other.len());
21        self.values_iter()
22            .zip(other.values_iter())
23            .map(|(l, r)| l.tot_ne(&r))
24            .collect()
25    }
26
27    fn tot_eq_kernel_broadcast(&self, other: &Self::Scalar) -> Bitmap {
28        self.values_iter().map(|l| l.tot_eq(&other)).collect()
29    }
30
31    fn tot_ne_kernel_broadcast(&self, other: &Self::Scalar) -> Bitmap {
32        self.values_iter().map(|l| l.tot_ne(&other)).collect()
33    }
34}
35
36impl<O: Offset> TotalOrdKernel for BinaryArray<O> {
37    type Scalar = [u8];
38
39    fn tot_lt_kernel(&self, other: &Self) -> Bitmap {
40        assert!(self.len() == other.len());
41        self.values_iter()
42            .zip(other.values_iter())
43            .map(|(l, r)| l.tot_lt(&r))
44            .collect()
45    }
46
47    fn tot_le_kernel(&self, other: &Self) -> Bitmap {
48        assert!(self.len() == other.len());
49        self.values_iter()
50            .zip(other.values_iter())
51            .map(|(l, r)| l.tot_le(&r))
52            .collect()
53    }
54
55    fn tot_lt_kernel_broadcast(&self, other: &Self::Scalar) -> Bitmap {
56        self.values_iter().map(|l| l.tot_lt(&other)).collect()
57    }
58
59    fn tot_le_kernel_broadcast(&self, other: &Self::Scalar) -> Bitmap {
60        self.values_iter().map(|l| l.tot_le(&other)).collect()
61    }
62
63    fn tot_gt_kernel_broadcast(&self, other: &Self::Scalar) -> Bitmap {
64        self.values_iter().map(|l| l.tot_gt(&other)).collect()
65    }
66
67    fn tot_ge_kernel_broadcast(&self, other: &Self::Scalar) -> Bitmap {
68        self.values_iter().map(|l| l.tot_ge(&other)).collect()
69    }
70}
71
72impl TotalEqKernel for FixedSizeBinaryArray {
73    type Scalar = [u8];
74
75    fn tot_eq_kernel(&self, other: &Self) -> Bitmap {
76        assert!(self.len() == other.len());
77
78        if self.size() != other.size() {
79            return Bitmap::new_zeroed(self.len());
80        }
81
82        (0..self.len())
83            .map(|i| self.value(i) == other.value(i))
84            .collect()
85    }
86
87    fn tot_ne_kernel(&self, other: &Self) -> Bitmap {
88        assert!(self.len() == other.len());
89
90        if self.size() != other.size() {
91            return Bitmap::new_with_value(true, self.len());
92        }
93
94        (0..self.len())
95            .map(|i| self.value(i) != other.value(i))
96            .collect()
97    }
98
99    fn tot_eq_kernel_broadcast(&self, other: &Self::Scalar) -> Bitmap {
100        if self.size() != other.len() {
101            return Bitmap::new_zeroed(self.len());
102        }
103
104        (0..self.len()).map(|i| self.value(i) == other).collect()
105    }
106
107    fn tot_ne_kernel_broadcast(&self, other: &Self::Scalar) -> Bitmap {
108        if self.size() != other.len() {
109            return Bitmap::new_with_value(true, self.len());
110        }
111
112        (0..self.len()).map(|i| self.value(i) != other).collect()
113    }
114}