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
use crate::{
array::{Array, Offset},
bitmap::{Bitmap, MutableBitmap},
buffer::MutableBuffer,
};
pub(super) fn extend_offsets<T: Offset>(
buffer: &mut MutableBuffer<T>,
last_offset: &mut T,
offsets: &[T],
) {
buffer.reserve(offsets.len() - 1);
offsets.windows(2).for_each(|offsets| {
let length = offsets[1] - offsets[0];
*last_offset += length;
buffer.push(*last_offset);
});
}
pub(super) type ExtendNullBits<'a> = Box<dyn Fn(&mut MutableBitmap, usize, usize) + 'a>;
pub(super) fn build_extend_null_bits(array: &dyn Array, use_validity: bool) -> ExtendNullBits {
if let Some(bitmap) = array.validity() {
Box::new(move |validity, start, len| {
assert!(start + len <= bitmap.len());
let (slice, offset, _) = bitmap.as_slice();
validity.extend_from_slice(slice, start + offset, len);
})
} else if use_validity {
Box::new(|validity, _, len| {
validity.extend_constant(len, true);
})
} else {
Box::new(|_, _, _| {})
}
}
#[inline]
pub(super) fn extend_validity(
mutable_validity: &mut MutableBitmap,
validity: &Option<Bitmap>,
start: usize,
len: usize,
use_validity: bool,
) {
if let Some(bitmap) = validity {
assert!(start + len <= bitmap.len());
let (slice, offset, _) = bitmap.as_slice();
mutable_validity.extend_from_slice(slice, start + offset, len);
} else if use_validity {
mutable_validity.extend_constant(len, true);
};
}
#[inline]
pub(super) fn extend_offset_values<O: Offset>(
buffer: &mut MutableBuffer<u8>,
offsets: &[O],
values: &[u8],
start: usize,
len: usize,
) {
let start_values = offsets[start].to_usize();
let end_values = offsets[start + len].to_usize();
let new_values = &values[start_values..end_values];
buffer.extend_from_slice(new_values);
}