Path: blob/main/crates/polars-compute/src/if_then_else/boolean.rs
6939 views
use arrow::array::BooleanArray;1use arrow::bitmap::{self, Bitmap};2use arrow::datatypes::ArrowDataType;34use super::{IfThenElseKernel, if_then_else_validity};56impl IfThenElseKernel for BooleanArray {7type Scalar<'a> = bool;89fn if_then_else(mask: &Bitmap, if_true: &Self, if_false: &Self) -> Self {10let values = bitmap::ternary(mask, if_true.values(), if_false.values(), |m, t, f| {11(m & t) | (!m & f)12});13let validity = if_then_else_validity(mask, if_true.validity(), if_false.validity());14BooleanArray::from(values).with_validity(validity)15}1617fn if_then_else_broadcast_true(18mask: &Bitmap,19if_true: Self::Scalar<'_>,20if_false: &Self,21) -> Self {22let values = if if_true {23bitmap::or(if_false.values(), mask) // (m & true) | (!m & f) -> f | m24} else {25bitmap::and_not(if_false.values(), mask) // (m & false) | (!m & f) -> f & !m26};27let validity = if_then_else_validity(mask, None, if_false.validity());28BooleanArray::from(values).with_validity(validity)29}3031fn if_then_else_broadcast_false(32mask: &Bitmap,33if_true: &Self,34if_false: Self::Scalar<'_>,35) -> Self {36let values = if if_false {37bitmap::or_not(if_true.values(), mask) // (m & t) | (!m & true) -> t | !m38} else {39bitmap::and(if_true.values(), mask) // (m & t) | (!m & false) -> t & m40};41let validity = if_then_else_validity(mask, if_true.validity(), None);42BooleanArray::from(values).with_validity(validity)43}4445fn if_then_else_broadcast_both(46_dtype: ArrowDataType,47mask: &Bitmap,48if_true: Self::Scalar<'_>,49if_false: Self::Scalar<'_>,50) -> Self {51let values = match (if_true, if_false) {52(false, false) => Bitmap::new_with_value(false, mask.len()),53(false, true) => !mask,54(true, false) => mask.clone(),55(true, true) => Bitmap::new_with_value(true, mask.len()),56};57BooleanArray::from(values)58}59}606162