Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-arrow/src/array/equal/struct_.rs
6939 views
1
use crate::array::{Array, StructArray};
2
3
pub(super) fn equal(lhs: &StructArray, rhs: &StructArray) -> bool {
4
lhs.dtype() == rhs.dtype()
5
&& lhs.len() == rhs.len()
6
&& match (lhs.validity(), rhs.validity()) {
7
(None, None) => lhs.values().iter().eq(rhs.values().iter()),
8
(Some(l_validity), Some(r_validity)) => lhs
9
.values()
10
.iter()
11
.zip(rhs.values().iter())
12
.all(|(lhs, rhs)| {
13
l_validity.iter().zip(r_validity.iter()).enumerate().all(
14
|(i, (lhs_is_valid, rhs_is_valid))| {
15
if lhs_is_valid && rhs_is_valid {
16
lhs.sliced(i, 1) == rhs.sliced(i, 1)
17
} else {
18
lhs_is_valid == rhs_is_valid
19
}
20
},
21
)
22
}),
23
(Some(l_validity), None) => {
24
lhs.values()
25
.iter()
26
.zip(rhs.values().iter())
27
.all(|(lhs, rhs)| {
28
l_validity.iter().enumerate().all(|(i, lhs_is_valid)| {
29
if lhs_is_valid {
30
lhs.sliced(i, 1) == rhs.sliced(i, 1)
31
} else {
32
// rhs is always valid => different
33
false
34
}
35
})
36
})
37
},
38
(None, Some(r_validity)) => {
39
lhs.values()
40
.iter()
41
.zip(rhs.values().iter())
42
.all(|(lhs, rhs)| {
43
r_validity.iter().enumerate().all(|(i, rhs_is_valid)| {
44
if rhs_is_valid {
45
lhs.sliced(i, 1) == rhs.sliced(i, 1)
46
} else {
47
// lhs is always valid => different
48
false
49
}
50
})
51
})
52
},
53
}
54
}
55
56