Path: blob/main/crates/polars-compute/src/if_then_else/array.rs
6939 views
use arrow::array::builder::{ShareStrategy, StaticArrayBuilder, make_builder};1use arrow::array::{Array, ArrayCollectIterExt, FixedSizeListArray, FixedSizeListArrayBuilder};2use arrow::bitmap::Bitmap;34use super::{IfThenElseKernel, if_then_else_extend};56impl IfThenElseKernel for FixedSizeListArray {7type Scalar<'a> = Box<dyn Array>;89fn if_then_else(mask: &Bitmap, if_true: &Self, if_false: &Self) -> Self {10let inner_dt = if_true.dtype().inner_dtype().unwrap();11let mut builder =12FixedSizeListArrayBuilder::new(if_true.dtype().clone(), make_builder(inner_dt));13builder.reserve(mask.len());14if_then_else_extend(15&mut builder,16mask,17|b, off, len| b.subslice_extend(if_true, off, len, ShareStrategy::Always),18|b, off, len| b.subslice_extend(if_false, off, len, ShareStrategy::Always),19);20builder.freeze()21}2223fn if_then_else_broadcast_true(24mask: &Bitmap,25if_true: Self::Scalar<'_>,26if_false: &Self,27) -> Self {28let if_true_list: FixedSizeListArray =29std::iter::once(if_true).collect_arr_trusted_with_dtype(if_false.dtype().clone());30let inner_dt = if_false.dtype().inner_dtype().unwrap();31let mut builder =32FixedSizeListArrayBuilder::new(if_false.dtype().clone(), make_builder(inner_dt));33builder.reserve(mask.len());34if_then_else_extend(35&mut builder,36mask,37|b, _, len| b.subslice_extend_repeated(&if_true_list, 0, 1, len, ShareStrategy::Always),38|b, off, len| b.subslice_extend(if_false, off, len, ShareStrategy::Always),39);40builder.freeze()41}4243fn if_then_else_broadcast_false(44mask: &Bitmap,45if_true: &Self,46if_false: Self::Scalar<'_>,47) -> Self {48let if_false_list: FixedSizeListArray =49std::iter::once(if_false).collect_arr_trusted_with_dtype(if_true.dtype().clone());50let inner_dt = if_true.dtype().inner_dtype().unwrap();51let mut builder =52FixedSizeListArrayBuilder::new(if_true.dtype().clone(), make_builder(inner_dt));53builder.reserve(mask.len());54if_then_else_extend(55&mut builder,56mask,57|b, off, len| b.subslice_extend(if_true, off, len, ShareStrategy::Always),58|b, _, len| {59b.subslice_extend_repeated(&if_false_list, 0, 1, len, ShareStrategy::Always)60},61);62builder.freeze()63}6465fn if_then_else_broadcast_both(66dtype: arrow::datatypes::ArrowDataType,67mask: &Bitmap,68if_true: Self::Scalar<'_>,69if_false: Self::Scalar<'_>,70) -> Self {71let if_true_list: FixedSizeListArray =72std::iter::once(if_true).collect_arr_trusted_with_dtype(dtype.clone());73let if_false_list: FixedSizeListArray =74std::iter::once(if_false).collect_arr_trusted_with_dtype(dtype.clone());75let inner_dt = dtype.inner_dtype().unwrap();76let mut builder = FixedSizeListArrayBuilder::new(dtype.clone(), make_builder(inner_dt));77builder.reserve(mask.len());78if_then_else_extend(79&mut builder,80mask,81|b, _, len| b.subslice_extend_repeated(&if_true_list, 0, 1, len, ShareStrategy::Always),82|b, _, len| {83b.subslice_extend_repeated(&if_false_list, 0, 1, len, ShareStrategy::Always)84},85);86builder.freeze()87}88}899091