polars_compute/comparisons/
binary.rs1use 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}