polars_compute/comparisons/
struct_.rs1use arrow::array::{Array, StructArray};
2use arrow::bitmap::{Bitmap, BitmapBuilder};
3
4use super::TotalEqKernel;
5use crate::comparisons::dyn_array::array_tot_eq_missing_kernel;
6
7impl TotalEqKernel for StructArray {
8 type Scalar = Box<dyn Array>;
9
10 fn tot_eq_kernel(&self, other: &Self) -> Bitmap {
11 let lhs = self;
12 let rhs = other;
13 assert_eq!(lhs.len(), rhs.len());
14
15 if lhs.fields() != rhs.fields() {
16 return Bitmap::new_zeroed(lhs.len());
17 }
18
19 let ln = lhs.validity();
20 let rn = rhs.validity();
21
22 let lv = lhs.values();
23 let rv = rhs.values();
24
25 let mut bitmap = BitmapBuilder::with_capacity(lhs.len());
26
27 for i in 0..lhs.len() {
28 let mut is_equal = true;
29
30 if !ln.is_none_or(|v| v.get(i).unwrap()) || !rn.is_none_or(|v| v.get(i).unwrap()) {
31 bitmap.push(true);
32 continue;
33 }
34
35 for j in 0..lhs.values().len() {
36 if lv[j].len() != rv[j].len() {
37 is_equal = false;
38 break;
39 }
40
41 let result = array_tot_eq_missing_kernel(lv[j].as_ref(), rv[j].as_ref());
42 if result.unset_bits() != 0 {
43 is_equal = false;
44 break;
45 }
46 }
47
48 bitmap.push(is_equal);
49 }
50
51 bitmap.freeze()
52 }
53
54 fn tot_ne_kernel(&self, other: &Self) -> Bitmap {
55 let lhs = self;
56 let rhs = other;
57
58 if lhs.fields() != rhs.fields() {
59 return Bitmap::new_with_value(true, lhs.len());
60 }
61
62 if lhs.values().len() != rhs.values().len() {
63 return Bitmap::new_with_value(true, lhs.len());
64 }
65
66 let ln = lhs.validity();
67 let rn = rhs.validity();
68
69 let lv = lhs.values();
70 let rv = rhs.values();
71
72 let mut bitmap = BitmapBuilder::with_capacity(lhs.len());
73
74 for i in 0..lhs.len() {
75 let mut is_equal = true;
76
77 if !ln.is_none_or(|v| v.get(i).unwrap()) || !rn.is_none_or(|v| v.get(i).unwrap()) {
78 bitmap.push(false);
79 continue;
80 }
81
82 for j in 0..lhs.values().len() {
83 if lv[j].len() != rv[j].len() {
84 is_equal = false;
85 break;
86 }
87
88 let result = array_tot_eq_missing_kernel(lv[j].as_ref(), rv[j].as_ref());
89 if result.unset_bits() != 0 {
90 is_equal = false;
91 break;
92 }
93 }
94
95 bitmap.push(!is_equal);
96 }
97
98 bitmap.freeze()
99 }
100
101 fn tot_eq_kernel_broadcast(&self, _other: &Self::Scalar) -> Bitmap {
102 todo!()
103 }
104
105 fn tot_ne_kernel_broadcast(&self, _other: &Self::Scalar) -> Bitmap {
106 todo!()
107 }
108}