polars_compute/comparisons/
struct_.rs

1use 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}