use vortex_error::VortexResult;
use crate::Array;
use crate::ArrayRef;
use crate::ExecutionCtx;
use crate::IntoArray;
use crate::arrays::StructArray;
use crate::arrays::StructVTable;
use crate::arrays::TakeExecute;
use crate::builtins::ArrayBuiltins;
use crate::scalar::Scalar;
use crate::validity::Validity;
use crate::vtable::ValidityHelper;
impl TakeExecute for StructVTable {
fn take(
array: &StructArray,
indices: &dyn Array,
_ctx: &mut ExecutionCtx,
) -> 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.to_array()))
.collect::<Result<Vec<_>, _>>()?,
array.struct_fields().clone(),
indices.len(),
array.validity().take(indices)?,
)
.map(|a| a.into_array())
.map(Some)
}
}