vortex_array/arrays/bool/
ops.rs

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