use vortex_error::VortexResult;
use crate::ArrayRef;
use crate::DynArray;
use crate::IntoArray;
use crate::arrays::StructArray;
use crate::arrays::StructVTable;
use crate::arrays::dict::TakeReduce;
use crate::builtins::ArrayBuiltins;
use crate::scalar::Scalar;
use crate::validity::Validity;
use crate::vtable::ValidityHelper;
impl TakeReduce for StructVTable {
fn take(array: &StructArray, indices: &ArrayRef) -> VortexResult<Option<ArrayRef>> {
if array.is_empty() {
return StructArray::try_new_with_dtype(
array.unmasked_fields().clone(),
array.struct_fields().clone(),
indices.len(),
Validity::AllInvalid,
)
.map(StructArray::into_array)
.map(Some);
}
let fill_scalar = Scalar::zero_value(&indices.dtype().as_nonnullable());
let inner_indices = indices.to_array().fill_null(fill_scalar)?;
StructArray::try_new_with_dtype(
array
.unmasked_fields()
.iter()
.map(|field| field.take(inner_indices.clone()))
.collect::<Result<Vec<_>, _>>()?,
array.struct_fields().clone(),
indices.len(),
array.validity().take(indices)?,
)
.map(|a| a.into_array())
.map(Some)
}
}