use num_traits::Zero;
use vortex_dtype::{Nullability, match_each_integer_ptype};
use vortex_error::VortexResult;
use vortex_scalar::Scalar;
use crate::arrays::{ListViewArray, ListViewRebuildMode, ListViewVTable};
use crate::compute::{self, TakeKernel, TakeKernelAdapter};
use crate::vtable::ValidityHelper;
use crate::{Array, ArrayRef, IntoArray, register_kernel};
#[allow(unused)]
const REBUILD_DENSITY_THRESHOLD: f64 = 0.1;
impl TakeKernel for ListViewVTable {
fn take(&self, array: &ListViewArray, indices: &dyn Array) -> VortexResult<ArrayRef> {
let elements = array.elements();
let offsets = array.offsets();
let sizes = array.sizes();
let new_validity = array.validity().take(indices)?;
let nullable_new_offsets = compute::take(offsets.as_ref(), indices)?;
let nullable_new_sizes = compute::take(sizes.as_ref(), indices)?;
let new_offsets = match_each_integer_ptype!(nullable_new_offsets.dtype().as_ptype(), |O| {
compute::fill_null(
&nullable_new_offsets,
&Scalar::primitive(O::zero(), Nullability::NonNullable),
)?
});
let new_sizes = match_each_integer_ptype!(nullable_new_sizes.dtype().as_ptype(), |S| {
compute::fill_null(
&nullable_new_sizes,
&Scalar::primitive(S::zero(), Nullability::NonNullable),
)?
});
let new_array = unsafe {
ListViewArray::new_unchecked(elements.clone(), new_offsets, new_sizes, new_validity)
};
Ok(new_array
.rebuild(ListViewRebuildMode::MakeZeroCopyToList)
.into_array())
}
}
register_kernel!(TakeKernelAdapter(ListViewVTable).lift());