vortex_array/arrays/bool/vtable/
operations.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use std::ops::Range;
5
6use vortex_scalar::Scalar;
7
8use crate::arrays::{BoolArray, BoolVTable};
9use crate::vtable::{OperationsVTable, ValidityHelper};
10use crate::{ArrayRef, IntoArray};
11
12impl OperationsVTable<BoolVTable> for BoolVTable {
13    fn slice(array: &BoolArray, range: Range<usize>) -> ArrayRef {
14        BoolArray::from_bool_buffer(
15            array.boolean_buffer().slice(range.start, range.len()),
16            array.validity().slice(range),
17        )
18        .into_array()
19    }
20
21    fn scalar_at(array: &BoolArray, index: usize) -> Scalar {
22        Scalar::bool(
23            array.boolean_buffer().value(index),
24            array.dtype().nullability(),
25        )
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use std::iter;
32
33    use super::*;
34    use crate::ToCanonical;
35
36    #[test]
37    fn test_slice_hundred_elements() {
38        let arr = BoolArray::from_iter(iter::repeat_n(Some(true), 100));
39        let sliced_arr = arr.slice(8..16).to_bool();
40        assert_eq!(sliced_arr.len(), 8);
41        assert_eq!(sliced_arr.boolean_buffer().len(), 8);
42        assert_eq!(sliced_arr.boolean_buffer().offset(), 0);
43    }
44
45    #[test]
46    fn test_slice() {
47        let arr = BoolArray::from_iter([Some(true), Some(true), None, Some(false), None]);
48        let sliced_arr = arr.slice(1..4).to_bool();
49
50        assert_eq!(sliced_arr.len(), 3);
51
52        let s = sliced_arr.scalar_at(0);
53        assert_eq!(s.as_bool().value(), Some(true));
54
55        let s = sliced_arr.scalar_at(1);
56        assert!(!sliced_arr.is_valid(1));
57        assert!(s.is_null());
58
59        let s = sliced_arr.scalar_at(2);
60        assert_eq!(s.as_bool().value(), Some(false));
61    }
62}