1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
use crate::util::bit_util::get_bit;
use crate::{
array::data::count_nulls,
array::{ArrayData, OffsetSizeTrait},
};
use super::utils::equal_len;
fn offset_value_equal<T: OffsetSizeTrait>(
lhs_values: &[u8],
rhs_values: &[u8],
lhs_offsets: &[T],
rhs_offsets: &[T],
lhs_pos: usize,
rhs_pos: usize,
len: usize,
) -> bool {
let lhs_start = lhs_offsets[lhs_pos].to_usize().unwrap();
let rhs_start = rhs_offsets[rhs_pos].to_usize().unwrap();
let lhs_len = lhs_offsets[lhs_pos + len] - lhs_offsets[lhs_pos];
let rhs_len = rhs_offsets[rhs_pos + len] - rhs_offsets[rhs_pos];
lhs_len == rhs_len
&& equal_len(
lhs_values,
rhs_values,
lhs_start,
rhs_start,
lhs_len.to_usize().unwrap(),
)
}
pub(super) fn variable_sized_equal<T: OffsetSizeTrait>(
lhs: &ArrayData,
rhs: &ArrayData,
lhs_start: usize,
rhs_start: usize,
len: usize,
) -> bool {
let lhs_offsets = lhs.buffer::<T>(0);
let rhs_offsets = rhs.buffer::<T>(0);
let lhs_values = lhs.buffers()[1].as_slice();
let rhs_values = rhs.buffers()[1].as_slice();
let lhs_null_count = count_nulls(lhs.null_buffer(), lhs_start + lhs.offset(), len);
let rhs_null_count = count_nulls(rhs.null_buffer(), rhs_start + rhs.offset(), len);
if lhs_null_count == 0
&& rhs_null_count == 0
&& !lhs_values.is_empty()
&& !rhs_values.is_empty()
{
offset_value_equal(
lhs_values,
rhs_values,
lhs_offsets,
rhs_offsets,
lhs_start,
rhs_start,
len,
)
} else {
(0..len).all(|i| {
let lhs_pos = lhs_start + i;
let rhs_pos = rhs_start + i;
let lhs_is_null = !lhs
.null_buffer()
.map(|v| get_bit(v.as_slice(), lhs.offset() + lhs_pos))
.unwrap_or(true);
let rhs_is_null = !rhs
.null_buffer()
.map(|v| get_bit(v.as_slice(), rhs.offset() + rhs_pos))
.unwrap_or(true);
lhs_is_null
|| (lhs_is_null == rhs_is_null)
&& offset_value_equal(
lhs_values,
rhs_values,
lhs_offsets,
rhs_offsets,
lhs_pos,
rhs_pos,
1,
)
})
}
}