use itertools::Itertools;
use vortex_error::VortexResult;
use crate::ArrayRef;
use crate::IntoArray;
use crate::array::ArrayView;
use crate::arrays::Union;
use crate::arrays::UnionArray;
use crate::arrays::dict::TakeReduce;
use crate::arrays::union::UnionArrayExt;
use crate::arrays::union::UnionArraySlotsExt;
use crate::builtins::ArrayBuiltins;
use crate::scalar::Scalar;
impl TakeReduce for Union {
fn take(array: ArrayView<'_, Union>, indices: &ArrayRef) -> VortexResult<Option<ArrayRef>> {
if array.is_empty() {
return UnionArray::constant(&Scalar::null(array.dtype().as_nullable()), indices.len())
.map(UnionArray::into_array)
.map(Some);
}
let type_ids = array.type_ids().take(indices.clone())?;
let fill_scalar = Scalar::zero_value(&indices.dtype().as_nonnullable());
let child_indices = indices.clone().fill_null(fill_scalar)?;
let children: Vec<ArrayRef> = array
.iter_children()
.map(|child| child.take(child_indices.clone()))
.try_collect()?;
UnionArray::try_new(type_ids, array.variants().clone(), children)
.map(UnionArray::into_array)
.map(Some)
}
}