1use std::any::Any;
16use std::sync::Arc;
17
18use arrow::array::{Array, ArrayBuilder, ArrayIter, ArrayRef, BooleanArray, BooleanBuilder};
19use snafu::ResultExt;
20
21use crate::data_type::ConcreteDataType;
22use crate::error::Result;
23use crate::scalars::{ScalarVector, ScalarVectorBuilder};
24use crate::serialize::Serializable;
25use crate::value::{Value, ValueRef};
26use crate::vectors::{self, MutableVector, Validity, Vector, VectorRef};
27
28#[derive(Debug, PartialEq)]
30pub struct BooleanVector {
31 array: BooleanArray,
32}
33
34impl BooleanVector {
35 pub(crate) fn as_arrow(&self) -> &dyn Array {
36 &self.array
37 }
38
39 pub fn as_boolean_array(&self) -> &BooleanArray {
41 &self.array
42 }
43}
44
45impl From<Vec<bool>> for BooleanVector {
46 fn from(data: Vec<bool>) -> Self {
47 BooleanVector {
48 array: BooleanArray::from(data),
49 }
50 }
51}
52
53impl From<BooleanArray> for BooleanVector {
54 fn from(array: BooleanArray) -> Self {
55 Self { array }
56 }
57}
58
59impl From<Vec<Option<bool>>> for BooleanVector {
60 fn from(data: Vec<Option<bool>>) -> Self {
61 BooleanVector {
62 array: BooleanArray::from(data),
63 }
64 }
65}
66
67impl FromIterator<Option<bool>> for BooleanVector {
68 fn from_iter<T: IntoIterator<Item = Option<bool>>>(iter: T) -> Self {
69 BooleanVector {
70 array: BooleanArray::from_iter(iter),
71 }
72 }
73}
74
75impl Vector for BooleanVector {
76 fn data_type(&self) -> ConcreteDataType {
77 ConcreteDataType::boolean_datatype()
78 }
79
80 fn vector_type_name(&self) -> String {
81 "BooleanVector".to_string()
82 }
83
84 fn as_any(&self) -> &dyn Any {
85 self
86 }
87
88 fn len(&self) -> usize {
89 self.array.len()
90 }
91
92 fn to_arrow_array(&self) -> ArrayRef {
93 Arc::new(self.array.clone())
94 }
95
96 fn to_boxed_arrow_array(&self) -> Box<dyn Array> {
97 Box::new(self.array.clone())
98 }
99
100 fn validity(&self) -> Validity {
101 vectors::impl_validity_for_vector!(self.array)
102 }
103
104 fn memory_size(&self) -> usize {
105 self.array.get_buffer_memory_size()
106 }
107
108 fn null_count(&self) -> usize {
109 self.array.null_count()
110 }
111
112 fn is_null(&self, row: usize) -> bool {
113 self.array.is_null(row)
114 }
115
116 fn slice(&self, offset: usize, length: usize) -> VectorRef {
117 Arc::new(Self::from(self.array.slice(offset, length)))
118 }
119
120 fn get(&self, index: usize) -> Value {
121 vectors::impl_get_for_vector!(self.array, index)
122 }
123
124 fn get_ref(&self, index: usize) -> ValueRef<'_> {
125 vectors::impl_get_ref_for_vector!(self.array, index)
126 }
127}
128
129impl ScalarVector for BooleanVector {
130 type OwnedItem = bool;
131 type RefItem<'a> = bool;
132 type Iter<'a> = ArrayIter<&'a BooleanArray>;
133 type Builder = BooleanVectorBuilder;
134
135 fn get_data(&self, idx: usize) -> Option<Self::RefItem<'_>> {
136 if self.array.is_valid(idx) {
137 Some(self.array.value(idx))
138 } else {
139 None
140 }
141 }
142
143 fn iter_data(&self) -> Self::Iter<'_> {
144 self.array.iter()
145 }
146}
147
148pub struct BooleanVectorBuilder {
149 mutable_array: BooleanBuilder,
150}
151
152impl MutableVector for BooleanVectorBuilder {
153 fn data_type(&self) -> ConcreteDataType {
154 ConcreteDataType::boolean_datatype()
155 }
156
157 fn len(&self) -> usize {
158 self.mutable_array.len()
159 }
160
161 fn as_any(&self) -> &dyn Any {
162 self
163 }
164
165 fn as_mut_any(&mut self) -> &mut dyn Any {
166 self
167 }
168
169 fn to_vector(&mut self) -> VectorRef {
170 Arc::new(self.finish())
171 }
172
173 fn to_vector_cloned(&self) -> VectorRef {
174 Arc::new(self.finish_cloned())
175 }
176
177 fn try_push_value_ref(&mut self, value: &ValueRef) -> Result<()> {
178 match value.try_into_boolean()? {
179 Some(v) => self.mutable_array.append_value(v),
180 None => self.mutable_array.append_null(),
181 }
182 Ok(())
183 }
184
185 fn extend_slice_of(&mut self, vector: &dyn Vector, offset: usize, length: usize) -> Result<()> {
186 vectors::impl_extend_for_builder!(self, vector, BooleanVector, offset, length)
187 }
188
189 fn push_null(&mut self) {
190 self.mutable_array.append_null()
191 }
192}
193
194impl ScalarVectorBuilder for BooleanVectorBuilder {
195 type VectorType = BooleanVector;
196
197 fn with_capacity(capacity: usize) -> Self {
198 Self {
199 mutable_array: BooleanBuilder::with_capacity(capacity),
200 }
201 }
202
203 fn push(&mut self, value: Option<<Self::VectorType as ScalarVector>::RefItem<'_>>) {
204 match value {
205 Some(v) => self.mutable_array.append_value(v),
206 None => self.mutable_array.append_null(),
207 }
208 }
209
210 fn finish(&mut self) -> Self::VectorType {
211 BooleanVector {
212 array: self.mutable_array.finish(),
213 }
214 }
215
216 fn finish_cloned(&self) -> Self::VectorType {
217 BooleanVector {
218 array: self.mutable_array.finish_cloned(),
219 }
220 }
221}
222
223impl Serializable for BooleanVector {
224 fn serialize_to_json(&self) -> Result<Vec<serde_json::Value>> {
225 self.iter_data()
226 .map(serde_json::to_value)
227 .collect::<serde_json::Result<_>>()
228 .context(crate::error::SerializeSnafu)
229 }
230}
231
232vectors::impl_try_from_arrow_array_for_vector!(BooleanArray, BooleanVector);
233
234#[cfg(test)]
235mod tests {
236 use arrow::datatypes::DataType as ArrowDataType;
237 use serde_json;
238
239 use super::*;
240 use crate::data_type::DataType;
241 use crate::serialize::Serializable;
242 use crate::types::BooleanType;
243
244 #[test]
245 fn test_boolean_vector_misc() {
246 let bools = vec![true, false, true, true, false, false, true, true, false];
247 let v = BooleanVector::from(bools.clone());
248 assert_eq!(9, v.len());
249 assert_eq!("BooleanVector", v.vector_type_name());
250 assert!(v.validity().is_all_valid());
251 assert!(!v.only_null());
252 assert_eq!(2, v.memory_size());
253
254 for (i, b) in bools.iter().enumerate() {
255 assert!(!v.is_null(i));
256 assert_eq!(Value::Boolean(*b), v.get(i));
257 assert_eq!(ValueRef::Boolean(*b), v.get_ref(i));
258 }
259
260 let arrow_arr = v.to_arrow_array();
261 assert_eq!(9, arrow_arr.len());
262 assert_eq!(&ArrowDataType::Boolean, arrow_arr.data_type());
263 }
264
265 #[test]
266 fn test_serialize_boolean_vector_to_json() {
267 let vector = BooleanVector::from(vec![true, false, true, true, false, false]);
268
269 let json_value = vector.serialize_to_json().unwrap();
270 assert_eq!(
271 "[true,false,true,true,false,false]",
272 serde_json::to_string(&json_value).unwrap(),
273 );
274 }
275
276 #[test]
277 fn test_serialize_boolean_vector_with_null_to_json() {
278 let vector = BooleanVector::from(vec![Some(true), None, Some(false)]);
279
280 let json_value = vector.serialize_to_json().unwrap();
281 assert_eq!(
282 "[true,null,false]",
283 serde_json::to_string(&json_value).unwrap(),
284 );
285 }
286
287 #[test]
288 fn test_boolean_vector_from_vec() {
289 let input = vec![false, true, false, true];
290 let vec = BooleanVector::from(input.clone());
291 assert_eq!(4, vec.len());
292 for (i, v) in input.into_iter().enumerate() {
293 assert_eq!(Some(v), vec.get_data(i), "Failed at {i}")
294 }
295 }
296
297 #[test]
298 fn test_boolean_vector_from_iter() {
299 let input = vec![Some(false), Some(true), Some(false), Some(true)];
300 let vec = input.iter().cloned().collect::<BooleanVector>();
301 assert_eq!(4, vec.len());
302 for (i, v) in input.into_iter().enumerate() {
303 assert_eq!(v, vec.get_data(i), "Failed at {i}")
304 }
305 }
306
307 #[test]
308 fn test_boolean_vector_from_vec_option() {
309 let input = vec![Some(false), Some(true), None, Some(true)];
310 let vec = BooleanVector::from(input.clone());
311 assert_eq!(4, vec.len());
312 for (i, v) in input.into_iter().enumerate() {
313 assert_eq!(v, vec.get_data(i), "failed at {i}")
314 }
315 }
316
317 #[test]
318 fn test_boolean_vector_build_get() {
319 let input = [Some(true), None, Some(false)];
320 let mut builder = BooleanVectorBuilder::with_capacity(3);
321 for v in input {
322 builder.push(v);
323 }
324 let vector = builder.finish();
325 assert_eq!(input.len(), vector.len());
326
327 let res: Vec<_> = vector.iter_data().collect();
328 assert_eq!(input, &res[..]);
329
330 for (i, v) in input.into_iter().enumerate() {
331 assert_eq!(v, vector.get_data(i));
332 assert_eq!(Value::from(v), vector.get(i));
333 }
334 }
335
336 #[test]
337 fn test_boolean_vector_validity() {
338 let vector = BooleanVector::from(vec![Some(true), None, Some(false)]);
339 assert_eq!(1, vector.null_count());
340 let validity = vector.validity();
341 assert_eq!(1, validity.null_count());
342 assert!(!validity.is_set(1));
343
344 let vector = BooleanVector::from(vec![true, false, false]);
345 assert_eq!(0, vector.null_count());
346 assert!(vector.validity().is_all_valid());
347 }
348
349 #[test]
350 fn test_boolean_vector_builder() {
351 let input = BooleanVector::from_slice(&[true, false, true]);
352
353 let mut builder = BooleanType.create_mutable_vector(3);
354 builder.push_value_ref(&ValueRef::Boolean(true));
355 assert!(builder.try_push_value_ref(&ValueRef::Int32(123)).is_err());
356 builder.extend_slice_of(&input, 1, 2).unwrap();
357 assert!(
358 builder
359 .extend_slice_of(&crate::vectors::Int32Vector::from_slice([13]), 0, 1)
360 .is_err()
361 );
362 let vector = builder.to_vector();
363
364 let expect: VectorRef = Arc::new(BooleanVector::from_slice(&[true, false, true]));
365 assert_eq!(expect, vector);
366 }
367
368 #[test]
369 fn test_boolean_vector_builder_finish_cloned() {
370 let mut builder = BooleanVectorBuilder::with_capacity(1024);
371 builder.push(Some(true));
372 builder.push(Some(false));
373 builder.push(Some(true));
374 let vector = builder.finish_cloned();
375 assert!(vector.get_data(0).unwrap());
376 assert_eq!(vector.len(), 3);
377 assert_eq!(builder.len(), 3);
378
379 builder.push(Some(false));
380 let vector = builder.finish_cloned();
381 assert!(!vector.get_data(3).unwrap());
382 assert_eq!(builder.len(), 4);
383 }
384}