diff --git a/src/compute/boolean.rs b/src/compute/boolean.rs index 4ef5b46b4b0..e8e8c32dcd0 100644 --- a/src/compute/boolean.rs +++ b/src/compute/boolean.rs @@ -185,3 +185,25 @@ pub fn or_scalar(array: &BooleanArray, scalar: &BooleanScalar) -> BooleanArray { None => BooleanArray::new_null(DataType::Boolean, array.len()), } } + +/// Check if any of the values in the array is `true` +pub fn any(array: &BooleanArray) -> bool { + if array.is_empty() { + false + } else if array.validity().is_some() { + array.into_iter().any(|v| v == Some(true)) + } else { + let vals = array.values(); + vals.null_count() != 0 + } +} + +/// Check if all of the values in the array are `true` +pub fn all(array: &BooleanArray) -> bool { + if array.is_empty() || array.null_count() > 0 { + false + } else { + let vals = array.values(); + vals.null_count() == 0 + } +} diff --git a/tests/it/compute/boolean.rs b/tests/it/compute/boolean.rs index af77d98ed5b..822c8e432de 100644 --- a/tests/it/compute/boolean.rs +++ b/tests/it/compute/boolean.rs @@ -1,6 +1,7 @@ use arrow2::array::*; use arrow2::compute::boolean::*; use arrow2::scalar::BooleanScalar; +use std::iter::FromIterator; #[test] fn array_and() { @@ -418,3 +419,25 @@ fn array_or_scalar_validity() { let expected = BooleanArray::from(&[None; 3]); assert_eq!(real, expected); } + +#[test] +fn test_any_all() { + let array = BooleanArray::from(&[None, Some(false), Some(true)]); + assert!(any(&array)); + assert!(!all(&array)); + let array = BooleanArray::from(&[None, Some(false), Some(false)]); + assert!(!any(&array)); + assert!(!all(&array)); + let array = BooleanArray::from(&[None, Some(true), Some(true)]); + assert!(!all(&array)); + assert!(any(&array)); + let array = BooleanArray::from_iter(std::iter::repeat(false).take(10).map(Some)); + assert!(!any(&array)); + assert!(!all(&array)); + let array = BooleanArray::from_iter(std::iter::repeat(true).take(10).map(Some)); + assert!(all(&array)); + assert!(any(&array)); + let array = BooleanArray::from_iter([true, false, true, true].map(Some)); + assert!(!all(&array)); + assert!(any(&array)); +}