Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-parquet/src/arrow/read/deserialize/primitive/plain/predicate.rs
8485 views
1
use arrow::bitmap::BitmapBuilder;
2
use arrow::types::AlignedBytes;
3
4
use super::ArrayChunks;
5
6
#[inline(never)]
7
pub fn decode_equals<B: AlignedBytes>(
8
values: ArrayChunks<'_, B>,
9
needle: B,
10
pred_true_mask: &mut BitmapBuilder,
11
) {
12
pred_true_mask.reserve(values.len());
13
for &v in values {
14
let is_pred_true = B::from_unaligned(v) == needle;
15
16
// SAFETY: We reserved enough before the loop.
17
unsafe {
18
pred_true_mask.push_unchecked(is_pred_true);
19
}
20
}
21
}
22
23
#[inline(never)]
24
pub fn decode_between<B: AlignedBytes>(
25
values: ArrayChunks<'_, B>,
26
low1: B,
27
high1: B,
28
low2: B,
29
high2: B,
30
pred_true_mask: &mut BitmapBuilder,
31
) {
32
pred_true_mask.reserve(values.len());
33
for &v in values {
34
let v = B::from_unaligned(v);
35
let in_interval1 = (low1.unsigned_leq(v)) & (v.unsigned_leq(high1));
36
let in_interval2 = (low2.unsigned_leq(v)) & (v.unsigned_leq(high2));
37
38
let is_pred_true = in_interval1 | in_interval2;
39
40
// SAFETY: We reserved enough before the loop.
41
unsafe {
42
pred_true_mask.push_unchecked(is_pred_true);
43
}
44
}
45
}
46
47
#[inline(never)]
48
pub fn decode_is_in<B: AlignedBytes>(
49
values: ArrayChunks<'_, B>,
50
needle: &[B; 8],
51
pred_true_mask: &mut BitmapBuilder,
52
) {
53
pred_true_mask.reserve(values.len());
54
for &v in values {
55
let is_pred_true = needle.contains(&B::from_unaligned(v));
56
57
// SAFETY: We reserved enough before the loop.
58
unsafe {
59
pred_true_mask.push_unchecked(is_pred_true);
60
}
61
}
62
}
63
64