vortex_array/arrays/bool/
ops.rs1use 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::new(
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 super::*;
32 use crate::ToCanonical;
33
34 #[test]
35 fn test_slice_large() {
36 let arr = BoolArray::from_iter(std::iter::repeat_n(Some(true), 100));
37 let sliced_arr = arr.slice(8..16).to_bool().unwrap();
38 assert_eq!(sliced_arr.len(), 8);
39 assert_eq!(sliced_arr.boolean_buffer().len(), 8);
40 assert_eq!(sliced_arr.boolean_buffer().offset(), 0);
41 }
42
43 #[test]
44 fn test_slice() {
45 let arr = BoolArray::from_iter([Some(true), Some(true), None, Some(false), None]);
46 let sliced_arr = arr.slice(1..4).to_bool().unwrap();
47
48 assert_eq!(sliced_arr.len(), 3);
49
50 let s = sliced_arr.scalar_at(0);
51 assert_eq!(s.as_bool().value(), Some(true));
52
53 let s = sliced_arr.scalar_at(1);
54 assert!(!sliced_arr.is_valid(1));
55 assert!(s.is_null());
56
57 let s = sliced_arr.scalar_at(2);
58 assert_eq!(s.as_bool().value(), Some(false));
59 }
60}