use vortex_array::ArrayRef;
use vortex_array::ArrayView;
use vortex_array::ExecutionCtx;
use vortex_array::IntoArray;
use vortex_array::arrays::List;
use vortex_array::arrays::ListArray;
use vortex_array::arrays::filter::FilterKernel;
use vortex_array::arrays::list::ListArrayExt;
use vortex_array::validity::Validity;
use vortex_error::VortexExpect;
use vortex_error::VortexResult;
use vortex_mask::Mask;
use crate::OnPair;
use crate::OnPairArrayExt;
use crate::OnPairArraySlotsExt;
impl FilterKernel for OnPair {
fn filter(
array: ArrayView<'_, Self>,
mask: &Mask,
ctx: &mut ExecutionCtx,
) -> VortexResult<Option<ArrayRef>> {
let codes = unsafe {
ListArray::new_unchecked(
array.codes().clone(),
array.codes_offsets().clone(),
Validity::NonNullable,
)
};
let filtered_codes_ref = <List as FilterKernel>::filter(codes.as_view(), mask, ctx)?
.vortex_expect("List filter kernel always returns Some");
let filtered_codes = filtered_codes_ref
.try_downcast::<List>()
.ok()
.vortex_expect("must be List");
let uncompressed_lengths = array.uncompressed_lengths().clone().filter(mask.clone())?;
let validity = array.array_validity().filter(mask)?;
Ok(Some(
unsafe {
OnPair::new_unchecked(
array.dtype().clone(),
array.dict_bytes_handle().clone(),
array.dict_offsets().clone(),
filtered_codes.elements().clone(),
filtered_codes.offsets().clone(),
uncompressed_lengths,
validity,
array.bits(),
)
}
.into_array(),
))
}
}