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