vortex_array/arrays/bool/
ops.rs

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