Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-compute/src/comparisons/struct_.rs
6939 views
1
use arrow::array::{Array, StructArray};
2
use arrow::bitmap::{Bitmap, BitmapBuilder};
3
4
use super::TotalEqKernel;
5
use crate::comparisons::dyn_array::array_tot_eq_missing_kernel;
6
7
impl 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
}
109
110