vortex_array/arrays/bool/
mod.rs1mod array;
2pub mod compute;
3mod patch;
4mod serde;
5
6pub use array::*;
7pub use arrow_buffer::{BooleanBuffer, BooleanBufferBuilder};
9
10#[cfg(test)]
11mod tests {
12 use arrow_buffer::{BooleanBuffer, BooleanBufferBuilder};
13 use vortex_buffer::buffer;
14
15 use crate::ToCanonical;
16 use crate::array::Array;
17 use crate::arrays::{BoolArray, PrimitiveArray};
18 use crate::compute::conformance::mask::test_mask;
19 use crate::compute::{scalar_at, slice};
20 use crate::patches::Patches;
21 use crate::validity::Validity;
22
23 #[test]
24 fn bool_array() {
25 let arr = BoolArray::from_iter([true, false, true]);
26 let scalar = bool::try_from(&scalar_at(&arr, 0).unwrap()).unwrap();
27 assert!(scalar);
28 }
29
30 #[test]
31 fn test_all_some_iter() {
32 let arr = BoolArray::from_iter([Some(true), Some(false)]);
33
34 assert!(matches!(arr.validity(), Validity::AllValid));
35
36 let scalar = bool::try_from(&scalar_at(&arr, 0).unwrap()).unwrap();
37 assert!(scalar);
38 let scalar = bool::try_from(&scalar_at(&arr, 1).unwrap()).unwrap();
39 assert!(!scalar);
40 }
41
42 #[test]
43 fn test_bool_from_iter() {
44 let arr = BoolArray::from_iter([Some(true), Some(true), None, Some(false), None]);
45
46 let scalar = bool::try_from(&scalar_at(&arr, 0).unwrap()).unwrap();
47 assert!(scalar);
48
49 let scalar = bool::try_from(&scalar_at(&arr, 1).unwrap()).unwrap();
50 assert!(scalar);
51
52 let scalar = scalar_at(&arr, 2).unwrap();
53 assert!(scalar.is_null());
54
55 let scalar = bool::try_from(&scalar_at(&arr, 3).unwrap()).unwrap();
56 assert!(!scalar);
57
58 let scalar = scalar_at(&arr, 4).unwrap();
59 assert!(scalar.is_null());
60 }
61
62 #[test]
63 fn patch_sliced_bools() {
64 let arr = {
65 let mut builder = BooleanBufferBuilder::new(12);
66 builder.append(false);
67 builder.append_n(11, true);
68 BoolArray::from(builder.finish())
69 };
70 let sliced = slice(&arr, 4, 12).unwrap();
71 let sliced_len = sliced.len();
72 let (values, offset) = sliced.to_bool().unwrap().into_boolean_builder();
73 assert_eq!(offset, 4);
74 assert_eq!(values.as_slice(), &[254, 15]);
75
76 let patches = Patches::new(
78 arr.len(),
79 0,
80 PrimitiveArray::new(buffer![4u32], Validity::AllValid).into_array(),
81 BoolArray::from(BooleanBuffer::new_unset(1)).into_array(),
82 );
83 let arr = arr.patch(&patches).unwrap();
84 let arr_len = arr.len();
85 let (values, offset) = arr.to_bool().unwrap().into_boolean_builder();
86 assert_eq!(offset, 0);
87 assert_eq!(values.len(), arr_len + offset);
88 assert_eq!(values.as_slice(), &[238, 15]);
89
90 let (values, offset) = sliced.to_bool().unwrap().into_boolean_builder();
92 assert_eq!(offset, 4);
93 assert_eq!(values.len(), sliced_len + offset);
94 assert_eq!(values.as_slice(), &[254, 15]); }
96
97 #[test]
98 fn slice_array_in_middle() {
99 let arr = BoolArray::from(BooleanBuffer::new_set(16));
100 let sliced = slice(&arr, 4, 12).unwrap();
101 let sliced_len = sliced.len();
102 let (values, offset) = sliced.to_bool().unwrap().into_boolean_builder();
103 assert_eq!(offset, 4);
104 assert_eq!(values.len(), sliced_len + offset);
105 assert_eq!(values.as_slice(), &[255, 15]);
106 }
107
108 #[test]
109 #[should_panic]
110 fn patch_bools_owned() {
111 let buffer = buffer![255u8; 2];
112 let buf = BooleanBuffer::new(buffer.into_arrow_buffer(), 0, 15);
113 let arr = BoolArray::new(buf, Validity::NonNullable);
114 let buf_ptr = arr.boolean_buffer().sliced().as_ptr();
115
116 let patches = Patches::new(
117 arr.len(),
118 0,
119 PrimitiveArray::new(buffer![0u32], Validity::AllValid).into_array(),
120 BoolArray::from(BooleanBuffer::new_unset(1)).into_array(),
121 );
122 let arr = arr.patch(&patches).unwrap();
123 assert_eq!(arr.boolean_buffer().sliced().as_ptr(), buf_ptr);
124
125 let (values, _byte_bit_offset) = arr.to_bool().unwrap().into_boolean_builder();
126 assert_eq!(values.as_slice(), &[254, 127]);
127 }
128
129 #[test]
130 fn test_mask_primitive_array() {
131 test_mask(&BoolArray::from_iter([true, false, true, true, false]));
132 }
133}