1use crate::array::print_long_array;
19use crate::builder::BooleanBuilder;
20use crate::iterator::BooleanIter;
21use crate::{Array, ArrayAccessor, ArrayRef, Scalar};
22use arrow_buffer::{BooleanBuffer, Buffer, MutableBuffer, NullBuffer, bit_util};
23use arrow_data::{ArrayData, ArrayDataBuilder};
24use arrow_schema::DataType;
25use std::any::Any;
26use std::sync::Arc;
27
28#[derive(Clone)]
68pub struct BooleanArray {
69 values: BooleanBuffer,
70 nulls: Option<NullBuffer>,
71}
72
73impl std::fmt::Debug for BooleanArray {
74 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
75 write!(f, "BooleanArray\n[\n")?;
76 print_long_array(self, f, |array, index, f| {
77 std::fmt::Debug::fmt(&array.value(index), f)
78 })?;
79 write!(f, "]")
80 }
81}
82
83impl BooleanArray {
84 pub fn new(values: BooleanBuffer, nulls: Option<NullBuffer>) -> Self {
90 if let Some(n) = nulls.as_ref() {
91 assert_eq!(values.len(), n.len());
92 }
93 Self { values, nulls }
94 }
95
96 pub fn new_null(len: usize) -> Self {
98 Self {
99 values: BooleanBuffer::new_unset(len),
100 nulls: Some(NullBuffer::new_null(len)),
101 }
102 }
103
104 pub fn new_scalar(value: bool) -> Scalar<Self> {
106 let values = match value {
107 true => BooleanBuffer::new_set(1),
108 false => BooleanBuffer::new_unset(1),
109 };
110 Scalar::new(Self::new(values, None))
111 }
112
113 pub fn new_from_packed(buffer: impl Into<Buffer>, offset: usize, len: usize) -> Self {
119 BooleanBuffer::new(buffer.into(), offset, len).into()
120 }
121
122 pub fn new_from_u8(value: &[u8]) -> Self {
128 BooleanBuffer::new(Buffer::from(value), 0, value.len() * 8).into()
129 }
130
131 pub fn len(&self) -> usize {
133 self.values.len()
134 }
135
136 pub fn is_empty(&self) -> bool {
138 self.values.is_empty()
139 }
140
141 pub fn slice(&self, offset: usize, length: usize) -> Self {
143 Self {
144 values: self.values.slice(offset, length),
145 nulls: self.nulls.as_ref().map(|n| n.slice(offset, length)),
146 }
147 }
148
149 pub fn builder(capacity: usize) -> BooleanBuilder {
151 BooleanBuilder::with_capacity(capacity)
152 }
153
154 pub fn values(&self) -> &BooleanBuffer {
156 &self.values
157 }
158
159 pub fn true_count(&self) -> usize {
162 match self.nulls() {
163 Some(nulls) => {
164 let null_chunks = nulls.inner().bit_chunks().iter_padded();
165 let value_chunks = self.values().bit_chunks().iter_padded();
166 null_chunks
167 .zip(value_chunks)
168 .map(|(a, b)| (a & b).count_ones() as usize)
169 .sum()
170 }
171 None => self.values().count_set_bits(),
172 }
173 }
174
175 pub fn false_count(&self) -> usize {
178 self.len() - self.null_count() - self.true_count()
179 }
180
181 pub fn has_true(&self) -> bool {
188 match self.nulls() {
189 Some(nulls) => {
190 let null_chunks = nulls.inner().bit_chunks().iter_padded();
191 let value_chunks = self.values().bit_chunks().iter_padded();
192 null_chunks.zip(value_chunks).any(|(n, v)| (n & v) != 0)
193 }
194 None => self.values().has_true(),
195 }
196 }
197
198 pub fn has_false(&self) -> bool {
205 match self.nulls() {
206 Some(nulls) => {
207 let null_chunks = nulls.inner().bit_chunks().iter_padded();
208 let value_chunks = self.values().bit_chunks().iter_padded();
209 null_chunks.zip(value_chunks).any(|(n, v)| (n & !v) != 0)
210 }
211 None => self.values().has_false(),
212 }
213 }
214
215 pub unsafe fn value_unchecked(&self, i: usize) -> bool {
223 unsafe { self.values.value_unchecked(i) }
224 }
225
226 pub fn value(&self, i: usize) -> bool {
234 assert!(
235 i < self.len(),
236 "Trying to access an element at index {} from a BooleanArray of length {}",
237 i,
238 self.len()
239 );
240 unsafe { self.value_unchecked(i) }
243 }
244
245 pub fn take_iter<'a>(
247 &'a self,
248 indexes: impl Iterator<Item = Option<usize>> + 'a,
249 ) -> impl Iterator<Item = Option<bool>> + 'a {
250 indexes.map(|opt_index| opt_index.map(|index| self.value(index)))
251 }
252
253 pub unsafe fn take_iter_unchecked<'a>(
258 &'a self,
259 indexes: impl Iterator<Item = Option<usize>> + 'a,
260 ) -> impl Iterator<Item = Option<bool>> + 'a {
261 indexes.map(|opt_index| opt_index.map(|index| unsafe { self.value_unchecked(index) }))
262 }
263
264 pub fn from_unary<T: ArrayAccessor, F>(left: T, mut op: F) -> Self
275 where
276 F: FnMut(T::Item) -> bool,
277 {
278 let nulls = left.logical_nulls();
279 let values = BooleanBuffer::collect_bool(left.len(), |i| unsafe {
280 op(left.value_unchecked(i))
282 });
283 Self::new(values, nulls)
284 }
285
286 pub fn from_binary<T: ArrayAccessor, S: ArrayAccessor, F>(left: T, right: S, mut op: F) -> Self
303 where
304 F: FnMut(T::Item, S::Item) -> bool,
305 {
306 assert_eq!(left.len(), right.len());
307
308 let nulls = NullBuffer::union(
309 left.logical_nulls().as_ref(),
310 right.logical_nulls().as_ref(),
311 );
312 let values = BooleanBuffer::collect_bool(left.len(), |i| unsafe {
313 op(left.value_unchecked(i), right.value_unchecked(i))
315 });
316 Self::new(values, nulls)
317 }
318
319 pub fn bitwise_unary<F>(&self, op: F) -> BooleanArray
335 where
336 F: FnMut(u64) -> u64,
337 {
338 let values = BooleanBuffer::from_bitwise_unary_op(
339 self.values.values(),
340 self.values.offset(),
341 self.values.len(),
342 op,
343 );
344 BooleanArray::new(values, self.nulls.clone())
345 }
346
347 pub fn bitwise_unary_mut<F>(self, op: F) -> Result<BooleanArray, BooleanArray>
365 where
366 F: FnMut(u64) -> u64,
367 {
368 self.try_bitwise_unary_in_place(op)
369 .map_err(|(array, _op)| array)
370 }
371
372 pub fn bitwise_unary_mut_or_clone<F>(self, op: F) -> BooleanArray
389 where
390 F: FnMut(u64) -> u64,
391 {
392 match self.try_bitwise_unary_in_place(op) {
393 Ok(array) => array,
394 Err((array, op)) => array.bitwise_unary(op),
395 }
396 }
397
398 fn try_bitwise_unary_in_place<F>(self, op: F) -> Result<BooleanArray, (BooleanArray, F)>
401 where
402 F: FnMut(u64) -> u64,
403 {
404 let (values, nulls) = self.into_parts();
405 let offset = values.offset();
406 let len = values.len();
407 let buffer = values.into_inner();
408 match buffer.into_mutable() {
409 Ok(mut buf) => {
410 bit_util::apply_bitwise_unary_op(buf.as_slice_mut(), offset, len, op);
411 let values = BooleanBuffer::new(buf.into(), offset, len);
412 Ok(BooleanArray::new(values, nulls))
413 }
414 Err(buffer) => {
415 let values = BooleanBuffer::new(buffer, offset, len);
416 Err((BooleanArray::new(values, nulls), op))
417 }
418 }
419 }
420
421 pub fn bitwise_bin_op<F>(&self, rhs: &BooleanArray, op: F) -> BooleanArray
442 where
443 F: FnMut(u64, u64) -> u64,
444 {
445 assert_eq!(self.len(), rhs.len());
446 let nulls = NullBuffer::union(self.nulls(), rhs.nulls());
447 let values = BooleanBuffer::from_bitwise_binary_op(
448 self.values.values(),
449 self.values.offset(),
450 rhs.values.values(),
451 rhs.values.offset(),
452 self.values.len(),
453 op,
454 );
455 BooleanArray::new(values, nulls)
456 }
457
458 pub fn bitwise_bin_op_mut<F>(
482 self,
483 rhs: &BooleanArray,
484 op: F,
485 ) -> Result<BooleanArray, BooleanArray>
486 where
487 F: FnMut(u64, u64) -> u64,
488 {
489 self.try_bitwise_bin_op_in_place(rhs, op)
490 .map_err(|(array, _op)| array)
491 }
492
493 pub fn bitwise_bin_op_mut_or_clone<F>(self, rhs: &BooleanArray, op: F) -> BooleanArray
515 where
516 F: FnMut(u64, u64) -> u64,
517 {
518 match self.try_bitwise_bin_op_in_place(rhs, op) {
519 Ok(array) => array,
520 Err((array, op)) => array.bitwise_bin_op(rhs, op),
521 }
522 }
523
524 fn try_bitwise_bin_op_in_place<F>(
527 self,
528 rhs: &BooleanArray,
529 op: F,
530 ) -> Result<BooleanArray, (BooleanArray, F)>
531 where
532 F: FnMut(u64, u64) -> u64,
533 {
534 assert_eq!(self.len(), rhs.len());
535 let (values, nulls) = self.into_parts();
536 let offset = values.offset();
537 let len = values.len();
538 let buffer = values.into_inner();
539 match buffer.into_mutable() {
540 Ok(mut buf) => {
541 bit_util::apply_bitwise_binary_op(
542 buf.as_slice_mut(),
543 offset,
544 rhs.values.inner(),
545 rhs.values.offset(),
546 len,
547 op,
548 );
549 let nulls = NullBuffer::union(nulls.as_ref(), rhs.nulls());
553 let values = BooleanBuffer::new(buf.into(), offset, len);
554 Ok(BooleanArray::new(values, nulls))
555 }
556 Err(buffer) => {
557 let values = BooleanBuffer::new(buffer, offset, len);
558 Err((BooleanArray::new(values, nulls), op))
559 }
560 }
561 }
562
563 pub fn into_parts(self) -> (BooleanBuffer, Option<NullBuffer>) {
565 (self.values, self.nulls)
566 }
567}
568
569unsafe impl Array for BooleanArray {
571 fn as_any(&self) -> &dyn Any {
572 self
573 }
574
575 fn to_data(&self) -> ArrayData {
576 self.clone().into()
577 }
578
579 fn into_data(self) -> ArrayData {
580 self.into()
581 }
582
583 fn data_type(&self) -> &DataType {
584 &DataType::Boolean
585 }
586
587 fn slice(&self, offset: usize, length: usize) -> ArrayRef {
588 Arc::new(self.slice(offset, length))
589 }
590
591 fn len(&self) -> usize {
592 self.values.len()
593 }
594
595 fn is_empty(&self) -> bool {
596 self.values.is_empty()
597 }
598
599 fn shrink_to_fit(&mut self) {
600 self.values.shrink_to_fit();
601 if let Some(nulls) = &mut self.nulls {
602 nulls.shrink_to_fit();
603 }
604 }
605
606 fn offset(&self) -> usize {
607 self.values.offset()
608 }
609
610 fn nulls(&self) -> Option<&NullBuffer> {
611 self.nulls.as_ref()
612 }
613
614 fn logical_null_count(&self) -> usize {
615 self.null_count()
616 }
617
618 fn get_buffer_memory_size(&self) -> usize {
619 let mut sum = self.values.inner().capacity();
620 if let Some(x) = &self.nulls {
621 sum += x.buffer().capacity()
622 }
623 sum
624 }
625
626 fn get_array_memory_size(&self) -> usize {
627 std::mem::size_of::<Self>() + self.get_buffer_memory_size()
628 }
629
630 #[cfg(feature = "pool")]
631 fn claim(&self, pool: &dyn arrow_buffer::MemoryPool) {
632 self.values.claim(pool);
633 if let Some(nulls) = &self.nulls {
634 nulls.claim(pool);
635 }
636 }
637}
638
639impl ArrayAccessor for &BooleanArray {
640 type Item = bool;
641
642 fn value(&self, index: usize) -> Self::Item {
643 BooleanArray::value(self, index)
644 }
645
646 unsafe fn value_unchecked(&self, index: usize) -> Self::Item {
647 unsafe { BooleanArray::value_unchecked(self, index) }
648 }
649}
650
651impl From<Vec<bool>> for BooleanArray {
652 fn from(data: Vec<bool>) -> Self {
653 let mut mut_buf = MutableBuffer::new_null(data.len());
654 {
655 let mut_slice = mut_buf.as_slice_mut();
656 for (i, b) in data.iter().enumerate() {
657 if *b {
658 bit_util::set_bit(mut_slice, i);
659 }
660 }
661 }
662 let array_data = ArrayData::builder(DataType::Boolean)
663 .len(data.len())
664 .add_buffer(mut_buf.into());
665
666 let array_data = unsafe { array_data.build_unchecked() };
667 BooleanArray::from(array_data)
668 }
669}
670
671impl From<Vec<Option<bool>>> for BooleanArray {
672 fn from(data: Vec<Option<bool>>) -> Self {
673 data.iter().collect()
674 }
675}
676
677impl From<ArrayData> for BooleanArray {
678 fn from(data: ArrayData) -> Self {
679 let (data_type, len, nulls, offset, mut buffers, _child_data) = data.into_parts();
680 assert_eq!(
681 data_type,
682 DataType::Boolean,
683 "BooleanArray expected ArrayData with type Boolean got {data_type:?}",
684 );
685 assert_eq!(
686 buffers.len(),
687 1,
688 "BooleanArray data should contain a single buffer only (values buffer)"
689 );
690 let buffer = buffers.pop().expect("checked above");
691 let values = BooleanBuffer::new(buffer, offset, len);
692
693 Self { values, nulls }
694 }
695}
696
697impl From<BooleanArray> for ArrayData {
698 fn from(array: BooleanArray) -> Self {
699 let builder = ArrayDataBuilder::new(DataType::Boolean)
700 .len(array.values.len())
701 .offset(array.values.offset())
702 .nulls(array.nulls)
703 .buffers(vec![array.values.into_inner()]);
704
705 unsafe { builder.build_unchecked() }
706 }
707}
708
709impl<'a> IntoIterator for &'a BooleanArray {
710 type Item = Option<bool>;
711 type IntoIter = BooleanIter<'a>;
712
713 fn into_iter(self) -> Self::IntoIter {
714 BooleanIter::<'a>::new(self)
715 }
716}
717
718impl<'a> BooleanArray {
719 pub fn iter(&'a self) -> BooleanIter<'a> {
721 BooleanIter::<'a>::new(self)
722 }
723}
724
725#[derive(Debug)]
734struct BooleanAdapter {
735 pub native: Option<bool>,
737}
738
739impl From<bool> for BooleanAdapter {
740 fn from(value: bool) -> Self {
741 BooleanAdapter {
742 native: Some(value),
743 }
744 }
745}
746
747impl From<&bool> for BooleanAdapter {
748 fn from(value: &bool) -> Self {
749 BooleanAdapter {
750 native: Some(*value),
751 }
752 }
753}
754
755impl From<Option<bool>> for BooleanAdapter {
756 fn from(value: Option<bool>) -> Self {
757 BooleanAdapter { native: value }
758 }
759}
760
761impl From<&Option<bool>> for BooleanAdapter {
762 fn from(value: &Option<bool>) -> Self {
763 BooleanAdapter { native: *value }
764 }
765}
766
767impl<Ptr: Into<BooleanAdapter>> FromIterator<Ptr> for BooleanArray {
768 fn from_iter<I: IntoIterator<Item = Ptr>>(iter: I) -> Self {
769 let iter = iter.into_iter();
770 let capacity = match iter.size_hint() {
771 (lower, Some(upper)) if lower == upper => lower,
772 _ => 0,
773 };
774 let mut builder = BooleanBuilder::with_capacity(capacity);
775 builder.extend(iter.map(|item| item.into().native));
776 builder.finish()
777 }
778}
779
780impl BooleanArray {
781 #[inline]
793 #[allow(
794 private_bounds,
795 reason = "We will expose BooleanAdapter if there is a need"
796 )]
797 pub unsafe fn from_trusted_len_iter<I, P>(iter: I) -> Self
798 where
799 P: Into<BooleanAdapter>,
800 I: ExactSizeIterator<Item = P>,
801 {
802 let data_len = iter.len();
803
804 let num_bytes = bit_util::ceil(data_len, 8);
805 let mut null_builder = MutableBuffer::from_len_zeroed(num_bytes);
806 let mut val_builder = MutableBuffer::from_len_zeroed(num_bytes);
807
808 let data = val_builder.as_slice_mut();
809
810 let null_slice = null_builder.as_slice_mut();
811 iter.enumerate().for_each(|(i, item)| {
812 if let Some(a) = item.into().native {
813 unsafe {
814 bit_util::set_bit_raw(null_slice.as_mut_ptr(), i);
817 if a {
818 bit_util::set_bit_raw(data.as_mut_ptr(), i);
819 }
820 }
821 }
822 });
823
824 let values = BooleanBuffer::new(val_builder.into(), 0, data_len);
825 let nulls = NullBuffer::from_unsliced_buffer(null_builder, data_len);
826 BooleanArray::new(values, nulls)
827 }
828}
829
830impl From<BooleanBuffer> for BooleanArray {
831 fn from(values: BooleanBuffer) -> Self {
832 Self {
833 values,
834 nulls: None,
835 }
836 }
837}
838
839#[cfg(test)]
840mod tests {
841 use super::*;
842
843 struct PointerInfo {
846 ptr: *const u8,
847 offset: usize,
848 len: usize,
849 }
850
851 impl PointerInfo {
852 fn new(array: &BooleanArray) -> Self {
856 Self {
857 ptr: array.values().inner().as_ptr(),
858 offset: array.values().offset(),
859 len: array.values().len(),
860 }
861 }
862
863 fn assert_same(&self, array: &BooleanArray) {
866 assert_eq!(array.values().inner().as_ptr(), self.ptr);
867 assert_eq!(array.values().offset(), self.offset);
868 assert_eq!(array.values().len(), self.len);
869 }
870
871 fn assert_different(&self, array: &BooleanArray) {
874 assert_ne!(array.values().inner().as_ptr(), self.ptr);
875 }
876 }
877 use arrow_buffer::Buffer;
878 use rand::{Rng, rng};
879
880 #[test]
881 fn test_boolean_fmt_debug() {
882 let arr = BooleanArray::from(vec![true, false, false]);
883 assert_eq!(
884 "BooleanArray\n[\n true,\n false,\n false,\n]",
885 format!("{arr:?}")
886 );
887 }
888
889 #[test]
890 fn test_boolean_with_null_fmt_debug() {
891 let mut builder = BooleanArray::builder(3);
892 builder.append_value(true);
893 builder.append_null();
894 builder.append_value(false);
895 let arr = builder.finish();
896 assert_eq!(
897 "BooleanArray\n[\n true,\n null,\n false,\n]",
898 format!("{arr:?}")
899 );
900 }
901
902 #[test]
903 fn test_boolean_array_from_vec() {
904 let buf = Buffer::from([10_u8]);
905 let arr = BooleanArray::from(vec![false, true, false, true]);
906 assert_eq!(&buf, arr.values().inner());
907 assert_eq!(4, arr.len());
908 assert_eq!(0, arr.offset());
909 assert_eq!(0, arr.null_count());
910 for i in 0..4 {
911 assert!(!arr.is_null(i));
912 assert!(arr.is_valid(i));
913 assert_eq!(i == 1 || i == 3, arr.value(i), "failed at {i}")
914 }
915 }
916
917 #[test]
918 fn test_boolean_array_from_vec_option() {
919 let buf = Buffer::from([10_u8]);
920 let arr = BooleanArray::from(vec![Some(false), Some(true), None, Some(true)]);
921 assert_eq!(&buf, arr.values().inner());
922 assert_eq!(4, arr.len());
923 assert_eq!(0, arr.offset());
924 assert_eq!(1, arr.null_count());
925 for i in 0..4 {
926 if i == 2 {
927 assert!(arr.is_null(i));
928 assert!(!arr.is_valid(i));
929 } else {
930 assert!(!arr.is_null(i));
931 assert!(arr.is_valid(i));
932 assert_eq!(i == 1 || i == 3, arr.value(i), "failed at {i}")
933 }
934 }
935 }
936
937 #[test]
938 fn test_boolean_array_from_packed() {
939 let v = [1_u8, 2_u8, 3_u8];
940 let arr = BooleanArray::new_from_packed(v, 0, 24);
941 assert_eq!(24, arr.len());
942 assert_eq!(0, arr.offset());
943 assert_eq!(0, arr.null_count());
944 assert!(arr.nulls.is_none());
945 for i in 0..24 {
946 assert!(!arr.is_null(i));
947 assert!(arr.is_valid(i));
948 assert_eq!(
949 i == 0 || i == 9 || i == 16 || i == 17,
950 arr.value(i),
951 "failed t {i}"
952 )
953 }
954 }
955
956 #[test]
957 fn test_boolean_array_from_slice_u8() {
958 let v: Vec<u8> = vec![1, 2, 3];
959 let slice = &v[..];
960 let arr = BooleanArray::new_from_u8(slice);
961 assert_eq!(24, arr.len());
962 assert_eq!(0, arr.offset());
963 assert_eq!(0, arr.null_count());
964 assert!(arr.nulls().is_none());
965 for i in 0..24 {
966 assert!(!arr.is_null(i));
967 assert!(arr.is_valid(i));
968 assert_eq!(
969 i == 0 || i == 9 || i == 16 || i == 17,
970 arr.value(i),
971 "failed t {i}"
972 )
973 }
974 }
975
976 #[test]
977 fn test_boolean_array_from_iter() {
978 let v = vec![Some(false), Some(true), Some(false), Some(true)];
979 let arr = v.into_iter().collect::<BooleanArray>();
980 assert_eq!(4, arr.len());
981 assert_eq!(0, arr.offset());
982 assert_eq!(0, arr.null_count());
983 assert!(arr.nulls().is_none());
984 for i in 0..3 {
985 assert!(!arr.is_null(i));
986 assert!(arr.is_valid(i));
987 assert_eq!(i == 1 || i == 3, arr.value(i), "failed at {i}")
988 }
989 }
990
991 #[test]
992 fn test_boolean_array_from_non_nullable_iter() {
993 let v = vec![true, false, true];
994 let arr = v.into_iter().collect::<BooleanArray>();
995 assert_eq!(3, arr.len());
996 assert_eq!(0, arr.offset());
997 assert_eq!(0, arr.null_count());
998 assert!(arr.nulls().is_none());
999
1000 assert!(arr.value(0));
1001 assert!(!arr.value(1));
1002 assert!(arr.value(2));
1003 }
1004
1005 #[test]
1006 fn test_boolean_array_from_nullable_iter() {
1007 let v = vec![Some(true), None, Some(false), None];
1008 let arr = v.into_iter().collect::<BooleanArray>();
1009 assert_eq!(4, arr.len());
1010 assert_eq!(0, arr.offset());
1011 assert_eq!(2, arr.null_count());
1012 assert!(arr.nulls().is_some());
1013
1014 assert!(arr.is_valid(0));
1015 assert!(arr.is_null(1));
1016 assert!(arr.is_valid(2));
1017 assert!(arr.is_null(3));
1018
1019 assert!(arr.value(0));
1020 assert!(!arr.value(2));
1021 }
1022
1023 #[test]
1024 fn test_boolean_array_from_nullable_trusted_len_iter() {
1025 let v = vec![Some(true), None, Some(false), None];
1027 let expected = v.clone().into_iter().collect::<BooleanArray>();
1028 let actual = unsafe {
1029 BooleanArray::from_trusted_len_iter(v.into_iter())
1031 };
1032 assert_eq!(expected, actual);
1033 }
1034
1035 #[test]
1036 fn test_boolean_array_from_iter_with_larger_upper_bound() {
1037 let iterator = vec![Some(true), None, Some(false), None]
1040 .into_iter()
1041 .filter(Option::is_some);
1042 let arr = iterator.collect::<BooleanArray>();
1043 assert_eq!(2, arr.len());
1044 }
1045
1046 #[test]
1047 fn test_boolean_array_builder() {
1048 let buf = Buffer::from([27_u8]);
1051 let buf2 = buf.clone();
1052 let data = ArrayData::builder(DataType::Boolean)
1053 .len(5)
1054 .offset(2)
1055 .add_buffer(buf)
1056 .build()
1057 .unwrap();
1058 let arr = BooleanArray::from(data);
1059 assert_eq!(&buf2, arr.values().inner());
1060 assert_eq!(5, arr.len());
1061 assert_eq!(2, arr.offset());
1062 assert_eq!(0, arr.null_count());
1063 for i in 0..3 {
1064 assert_eq!(i != 0, arr.value(i), "failed at {i}");
1065 }
1066 }
1067
1068 #[test]
1069 #[should_panic(
1070 expected = "Trying to access an element at index 4 from a BooleanArray of length 3"
1071 )]
1072 fn test_fixed_size_binary_array_get_value_index_out_of_bound() {
1073 let v = vec![Some(true), None, Some(false)];
1074 let array = v.into_iter().collect::<BooleanArray>();
1075
1076 array.value(4);
1077 }
1078
1079 #[test]
1080 #[should_panic(expected = "BooleanArray data should contain a single buffer only \
1081 (values buffer)")]
1082 #[cfg(not(feature = "force_validate"))]
1085 fn test_boolean_array_invalid_buffer_len() {
1086 let data = unsafe {
1087 ArrayData::builder(DataType::Boolean)
1088 .len(5)
1089 .build_unchecked()
1090 };
1091 drop(BooleanArray::from(data));
1092 }
1093
1094 #[test]
1095 #[should_panic(expected = "BooleanArray expected ArrayData with type Boolean got Int32")]
1096 fn test_from_array_data_validation() {
1097 let _ = BooleanArray::from(ArrayData::new_empty(&DataType::Int32));
1098 }
1099
1100 #[test]
1101 #[cfg_attr(miri, ignore)] fn test_true_false_count() {
1103 let mut rng = rng();
1104
1105 for _ in 0..10 {
1106 let d: Vec<_> = (0..2000).map(|_| rng.random_bool(0.5)).collect();
1108 let b = BooleanArray::from(d.clone());
1109
1110 let expected_true = d.iter().filter(|x| **x).count();
1111 assert_eq!(b.true_count(), expected_true);
1112 assert_eq!(b.false_count(), d.len() - expected_true);
1113
1114 let d: Vec<_> = (0..2000)
1116 .map(|_| rng.random_bool(0.5).then(|| rng.random_bool(0.5)))
1117 .collect();
1118 let b = BooleanArray::from(d.clone());
1119
1120 let expected_true = d.iter().filter(|x| matches!(x, Some(true))).count();
1121 assert_eq!(b.true_count(), expected_true);
1122
1123 let expected_false = d.iter().filter(|x| matches!(x, Some(false))).count();
1124 assert_eq!(b.false_count(), expected_false);
1125 }
1126 }
1127
1128 #[test]
1129 fn test_into_parts() {
1130 let boolean_array = [Some(true), None, Some(false)]
1131 .into_iter()
1132 .collect::<BooleanArray>();
1133 let (values, nulls) = boolean_array.into_parts();
1134 assert_eq!(values.values(), &[0b0000_0001]);
1135 assert!(nulls.is_some());
1136 assert_eq!(nulls.unwrap().buffer().as_slice(), &[0b0000_0101]);
1137
1138 let boolean_array =
1139 BooleanArray::from(vec![false, false, false, false, false, false, false, true]);
1140 let (values, nulls) = boolean_array.into_parts();
1141 assert_eq!(values.values(), &[0b1000_0000]);
1142 assert!(nulls.is_none());
1143 }
1144
1145 #[test]
1146 fn test_new_null_array() {
1147 let arr = BooleanArray::new_null(5);
1148
1149 assert_eq!(arr.len(), 5);
1150 assert_eq!(arr.null_count(), 5);
1151 assert_eq!(arr.true_count(), 0);
1152 assert_eq!(arr.false_count(), 0);
1153
1154 for i in 0..5 {
1155 assert!(arr.is_null(i));
1156 assert!(!arr.is_valid(i));
1157 }
1158 }
1159
1160 #[test]
1161 fn test_slice_with_nulls() {
1162 let arr = BooleanArray::from(vec![Some(true), None, Some(false)]);
1163 let sliced = arr.slice(1, 2);
1164
1165 assert_eq!(sliced.len(), 2);
1166 assert_eq!(sliced.null_count(), 1);
1167
1168 assert!(sliced.is_null(0));
1169 assert!(sliced.is_valid(1));
1170 assert!(!sliced.value(1));
1171 }
1172
1173 #[test]
1174 fn test_has_true_has_false_all_true() {
1175 let arr = BooleanArray::from(vec![true, true, true]);
1176 assert!(arr.has_true());
1177 assert!(!arr.has_false());
1178 }
1179
1180 #[test]
1181 fn test_has_true_has_false_all_false() {
1182 let arr = BooleanArray::from(vec![false, false, false]);
1183 assert!(!arr.has_true());
1184 assert!(arr.has_false());
1185 }
1186
1187 #[test]
1188 fn test_has_true_has_false_mixed() {
1189 let arr = BooleanArray::from(vec![true, false, true]);
1190 assert!(arr.has_true());
1191 assert!(arr.has_false());
1192 }
1193
1194 #[test]
1195 fn test_has_true_has_false_empty() {
1196 let arr = BooleanArray::from(Vec::<bool>::new());
1197 assert!(!arr.has_true());
1198 assert!(!arr.has_false());
1199 }
1200
1201 #[test]
1202 fn test_has_true_has_false_nulls_all_valid_true() {
1203 let arr = BooleanArray::from(vec![Some(true), None, Some(true)]);
1204 assert!(arr.has_true());
1205 assert!(!arr.has_false());
1206 }
1207
1208 #[test]
1209 fn test_has_true_has_false_nulls_all_valid_false() {
1210 let arr = BooleanArray::from(vec![Some(false), None, Some(false)]);
1211 assert!(!arr.has_true());
1212 assert!(arr.has_false());
1213 }
1214
1215 #[test]
1216 fn test_has_true_has_false_all_null() {
1217 let arr = BooleanArray::new_null(5);
1218 assert!(!arr.has_true());
1219 assert!(!arr.has_false());
1220 }
1221
1222 #[test]
1223 fn test_has_false_aligned_suffix_all_true() {
1224 let arr = BooleanArray::from(vec![true; 129]);
1225 assert!(arr.has_true());
1226 assert!(!arr.has_false());
1227 }
1228
1229 #[test]
1230 fn test_has_false_non_aligned_all_true() {
1231 let arr = BooleanArray::from(vec![true; 65]);
1233 assert!(arr.has_true());
1234 assert!(!arr.has_false());
1235 }
1236
1237 #[test]
1238 fn test_has_false_non_aligned_last_false() {
1239 let mut values = vec![true; 64];
1241 values.push(false);
1242 let arr = BooleanArray::from(values);
1243 assert!(arr.has_true());
1244 assert!(arr.has_false());
1245 }
1246
1247 #[test]
1248 fn test_has_false_exact_64_all_true() {
1249 let arr = BooleanArray::from(vec![true; 64]);
1251 assert!(arr.has_true());
1252 assert!(!arr.has_false());
1253 }
1254
1255 #[test]
1256 fn test_has_true_has_false_unaligned_slices() {
1257 let cases = [
1258 (1, 129, true, false),
1259 (3, 130, true, false),
1260 (5, 65, true, false),
1261 (7, 64, true, false),
1262 ];
1263
1264 let base = BooleanArray::from(vec![true; 300]);
1265
1266 for (offset, len, expected_has_true, expected_has_false) in cases {
1267 let arr = base.slice(offset, len);
1268 assert_eq!(
1269 arr.has_true(),
1270 expected_has_true,
1271 "offset={offset} len={len}"
1272 );
1273 assert_eq!(
1274 arr.has_false(),
1275 expected_has_false,
1276 "offset={offset} len={len}"
1277 );
1278 }
1279 }
1280
1281 #[test]
1282 fn test_has_true_has_false_exact_multiples_of_64() {
1283 let cases = [
1284 (64, true, false),
1285 (128, true, false),
1286 (192, true, false),
1287 (256, true, false),
1288 ];
1289
1290 for (len, expected_has_true, expected_has_false) in cases {
1291 let arr = BooleanArray::from(vec![true; len]);
1292 assert_eq!(arr.has_true(), expected_has_true, "len={len}");
1293 assert_eq!(arr.has_false(), expected_has_false, "len={len}");
1294 }
1295 }
1296
1297 #[test]
1298 fn test_bitwise_unary_not() {
1299 let arr = BooleanArray::from(vec![true, false, true, false]);
1300 let result = arr.bitwise_unary(|x| !x);
1301 let expected = BooleanArray::from(vec![false, true, false, true]);
1302 assert_eq!(result, expected);
1303 }
1304
1305 #[test]
1306 fn test_bitwise_unary_preserves_nulls() {
1307 let arr = BooleanArray::from(vec![Some(true), None, Some(false), Some(true)]);
1308 let result = arr.bitwise_unary(|x| !x);
1309
1310 assert_eq!(result.null_count(), 1);
1311 assert!(result.is_null(1));
1312 assert!(!result.value(0));
1313 assert!(result.value(2));
1314 assert!(!result.value(3));
1315 }
1316
1317 #[test]
1318 fn test_bitwise_unary_mut_unshared() {
1319 let arr = BooleanArray::from(vec![true, false, true, false]);
1320 let info = PointerInfo::new(&arr);
1321 let result = arr.bitwise_unary_mut(|x| !x).unwrap();
1322 let expected = BooleanArray::from(vec![false, true, false, true]);
1323 assert_eq!(result, expected);
1324 info.assert_same(&result);
1325 }
1326
1327 #[test]
1328 fn test_bitwise_unary_mut_shared() {
1329 let arr = BooleanArray::from(vec![true, false, true, false]);
1330 let info = PointerInfo::new(&arr);
1331 let _shared = arr.clone();
1332 let result = arr.bitwise_unary_mut(|x| !x);
1333 assert!(result.is_err());
1334
1335 let returned = result.unwrap_err();
1336 assert_eq!(returned, BooleanArray::from(vec![true, false, true, false]));
1337 info.assert_same(&returned);
1338 }
1339
1340 #[test]
1341 fn test_bitwise_unary_mut_with_nulls() {
1342 let arr = BooleanArray::from(vec![Some(true), None, Some(false)]);
1343 let result = arr.bitwise_unary_mut(|x| !x).unwrap();
1344
1345 assert_eq!(result.null_count(), 1);
1346 assert!(result.is_null(1));
1347 assert!(!result.value(0));
1348 assert!(result.value(2));
1349 }
1350
1351 #[test]
1352 fn test_bitwise_unary_mut_or_clone_shared() {
1353 let arr = BooleanArray::from(vec![true, false, true]);
1354 let info = PointerInfo::new(&arr);
1355 let _shared = arr.clone();
1356 let result = arr.bitwise_unary_mut_or_clone(|x| !x);
1357 assert_eq!(result, BooleanArray::from(vec![false, true, false]));
1358 info.assert_different(&result);
1359 }
1360
1361 #[test]
1362 fn test_bitwise_unary_mut_or_clone_unshared() {
1363 let arr = BooleanArray::from(vec![true, false, true]);
1365 let info = PointerInfo::new(&arr);
1366 let result = arr.bitwise_unary_mut_or_clone(|x| !x);
1367 assert_eq!(result, BooleanArray::from(vec![false, true, false]));
1368 info.assert_same(&result);
1369 }
1370
1371 #[test]
1372 fn test_bitwise_bin_op_and() {
1373 let a = BooleanArray::from(vec![true, false, true, true]);
1374 let b = BooleanArray::from(vec![true, true, false, true]);
1375 let result = a.bitwise_bin_op(&b, |a, b| a & b);
1376 assert_eq!(result, BooleanArray::from(vec![true, false, false, true]));
1377 }
1378
1379 #[test]
1380 fn test_bitwise_bin_op_or() {
1381 let a = BooleanArray::from(vec![true, false, true, false]);
1382 let b = BooleanArray::from(vec![false, true, false, false]);
1383 let result = a.bitwise_bin_op(&b, |a, b| a | b);
1384 assert_eq!(result, BooleanArray::from(vec![true, true, true, false]));
1385 }
1386
1387 #[test]
1388 fn test_bitwise_bin_op_null_union() {
1389 let a = BooleanArray::from(vec![Some(true), None, Some(true), Some(false)]);
1390 let b = BooleanArray::from(vec![Some(true), Some(true), None, Some(true)]);
1391 let result = a.bitwise_bin_op(&b, |a, b| a & b);
1392
1393 assert_eq!(result.null_count(), 2);
1394 assert!(result.is_null(1));
1395 assert!(result.is_null(2));
1396 assert!(result.value(0));
1397 assert!(!result.value(3));
1398 }
1399
1400 #[test]
1401 fn test_bitwise_bin_op_one_nullable() {
1402 let a = BooleanArray::from(vec![Some(true), None, Some(true)]);
1403 let b = BooleanArray::from(vec![false, true, true]);
1404 let result = a.bitwise_bin_op(&b, |a, b| a & b);
1405
1406 assert_eq!(result.null_count(), 1);
1407 assert!(result.is_null(1));
1408 assert!(!result.value(0));
1409 assert!(result.value(2));
1410 }
1411
1412 #[test]
1413 fn test_bitwise_bin_op_no_nulls() {
1414 let a = BooleanArray::from(vec![true, false, true]);
1415 let b = BooleanArray::from(vec![false, true, true]);
1416 let result = a.bitwise_bin_op(&b, |a, b| a | b);
1417
1418 assert!(result.nulls().is_none());
1419 assert_eq!(result, BooleanArray::from(vec![true, true, true]));
1420 }
1421
1422 #[test]
1423 fn test_bitwise_bin_op_mut_unshared() {
1424 let a = BooleanArray::from(vec![true, false, true, true]);
1425 let info = PointerInfo::new(&a);
1426 let b = BooleanArray::from(vec![true, true, false, true]);
1427 let result = a.bitwise_bin_op_mut(&b, |a, b| a & b).unwrap();
1428 assert_eq!(result, BooleanArray::from(vec![true, false, false, true]));
1429 info.assert_same(&result);
1430 }
1431
1432 #[test]
1433 fn test_bitwise_bin_op_mut_shared() {
1434 let a = BooleanArray::from(vec![true, false, true, true]);
1435 let info = PointerInfo::new(&a);
1436 let _shared = a.clone();
1437 let result = a.bitwise_bin_op_mut(
1438 &BooleanArray::from(vec![true, true, false, true]),
1439 |a, b| a & b,
1440 );
1441 assert!(result.is_err());
1442 let returned = result.unwrap_err();
1443 info.assert_same(&returned);
1444 }
1445
1446 #[test]
1447 fn test_bitwise_bin_op_mut_with_nulls() {
1448 let a = BooleanArray::from(vec![Some(true), None, Some(true), Some(false)]);
1449 let b = BooleanArray::from(vec![Some(true), Some(true), None, Some(true)]);
1450 let result = a.bitwise_bin_op_mut(&b, |a, b| a & b).unwrap();
1451
1452 assert_eq!(result.null_count(), 2);
1453 assert!(result.is_null(1));
1454 assert!(result.is_null(2));
1455 assert!(result.value(0));
1456 assert!(!result.value(3));
1457 }
1458
1459 #[test]
1460 fn test_bitwise_bin_op_mut_or_clone_shared() {
1461 let a = BooleanArray::from(vec![true, false, true, true]);
1462 let info = PointerInfo::new(&a);
1463 let _shared = a.clone();
1464 let b = BooleanArray::from(vec![true, true, false, true]);
1465 let result = a.bitwise_bin_op_mut_or_clone(&b, |a, b| a & b);
1466 assert_eq!(result, BooleanArray::from(vec![true, false, false, true]));
1467 info.assert_different(&result);
1468 }
1469
1470 #[test]
1471 fn test_bitwise_bin_op_mut_or_clone_shared_with_nulls() {
1472 let a = BooleanArray::from(vec![Some(true), None, Some(true), Some(false)]);
1475 let info = PointerInfo::new(&a);
1476 let _shared = a.clone();
1477 let b = BooleanArray::from(vec![Some(true), Some(true), None, Some(true)]);
1478
1479 let expected = a.bitwise_bin_op(&b, |a, b| a & b);
1480 let result = a.bitwise_bin_op_mut_or_clone(&b, |a, b| a & b);
1481
1482 assert_eq!(result, expected);
1483 assert_eq!(result.null_count(), 2);
1484 assert!(result.is_null(1));
1485 assert!(result.is_null(2));
1486 info.assert_different(&result);
1487 }
1488
1489 #[test]
1490 fn test_bitwise_bin_op_mut_or_clone_unshared_with_nulls() {
1491 let a = BooleanArray::from(vec![Some(true), None, Some(true), Some(false)]);
1494 let info = PointerInfo::new(&a);
1495 let b = BooleanArray::from(vec![Some(true), Some(true), None, Some(true)]);
1496 let result = a.bitwise_bin_op_mut_or_clone(&b, |a, b| a & b);
1497
1498 assert_eq!(result.null_count(), 2);
1499 assert!(result.is_null(1));
1500 assert!(result.is_null(2));
1501 assert!(result.value(0));
1502 assert!(!result.value(3));
1503 info.assert_same(&result);
1504 }
1505
1506 #[test]
1507 fn test_bitwise_unary_empty() {
1508 let arr = BooleanArray::from(Vec::<bool>::new());
1509 let result = arr.bitwise_unary(|x| !x);
1510 assert_eq!(result.len(), 0);
1511 }
1512
1513 #[test]
1514 fn test_bitwise_bin_op_empty() {
1515 let a = BooleanArray::from(Vec::<bool>::new());
1516 let b = BooleanArray::from(Vec::<bool>::new());
1517 let result = a.bitwise_bin_op(&b, |a, b| a & b);
1518 assert_eq!(result.len(), 0);
1519 }
1520
1521 #[test]
1522 fn test_bitwise_unary_sliced() {
1523 let arr = BooleanArray::from(vec![true, false, true, true, false]);
1525 let sliced = arr.slice(1, 3); let result = sliced.bitwise_unary(|x| !x);
1528 assert_eq!(result.len(), 3);
1529 assert!(result.value(0));
1530 assert!(!result.value(1));
1531 assert!(!result.value(2));
1532 }
1533
1534 #[test]
1535 fn test_bitwise_unary_mut_sliced() {
1536 let arr = BooleanArray::from(vec![true, false, true, true, false]);
1538 let sliced = arr.slice(1, 3);
1539 assert!(sliced.bitwise_unary_mut(|x| !x).is_err());
1540 }
1541
1542 #[test]
1543 fn test_bitwise_unary_mut_or_clone_sliced() {
1544 let arr = BooleanArray::from(vec![true, false, true, true, false]);
1546 let sliced = arr.slice(1, 3); let result = sliced.bitwise_unary_mut_or_clone(|x| !x);
1549 assert_eq!(result.len(), 3);
1550 assert!(result.value(0));
1551 assert!(!result.value(1));
1552 assert!(!result.value(2));
1553 }
1554
1555 #[test]
1556 fn test_bitwise_bin_op_different_offsets() {
1557 let left_full = BooleanArray::from(vec![false, true, false, true, true]);
1560 let right_full = BooleanArray::from(vec![true, true, true, false, true, false]);
1561
1562 let left = left_full.slice(1, 3); let right = right_full.slice(2, 3); let result = left.bitwise_bin_op(&right, |a, b| a & b);
1566 assert_eq!(result.len(), 3);
1567 assert!(result.value(0));
1568 assert!(!result.value(1));
1569 assert!(result.value(2));
1570 }
1571
1572 #[test]
1573 fn test_bitwise_bin_op_mut_or_clone_different_offsets() {
1574 let left_full = BooleanArray::from(vec![false, true, true, false, true]);
1576 let right_full = BooleanArray::from(vec![true, true, false, false, true, false]);
1577
1578 let left = left_full.slice(1, 3); let right = right_full.slice(2, 3); let expected = left.bitwise_bin_op(&right, |a, b| a & b);
1582 let result = left.bitwise_bin_op_mut_or_clone(&right, |a, b| a & b);
1583 assert_eq!(result, expected);
1584 }
1585}