vortex_array/arrays/bool/
ops.rs

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