vortex_array/arrays/bool/compute/
slice.rs

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