Skip to main content

vortex_array/arrays/listview/compute/
mask.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_error::VortexResult;
5
6use crate::ArrayRef;
7use crate::IntoArray;
8use crate::array::ArrayParts;
9use crate::array::ArrayView;
10use crate::arrays::ListView;
11use crate::arrays::ListViewArray;
12use crate::arrays::listview::ListViewArraySlotsExt;
13use crate::arrays::listview::ListViewData;
14use crate::scalar_fn::fns::mask::MaskReduce;
15use crate::validity::Validity;
16
17impl MaskReduce for ListView {
18    const VALIDITY_IS_METADATA_ONLY: bool = true;
19
20    fn mask(array: ArrayView<'_, ListView>, mask: &ArrayRef) -> VortexResult<Option<ArrayRef>> {
21        let validity = array.validity()?.and(Validity::Array(mask.clone()))?;
22        let slots = ListViewData::make_slots(
23            array.elements(),
24            array.offsets(),
25            array.sizes(),
26            &validity,
27            array.len(),
28        );
29        let parts = ArrayParts::new(
30            ListView,
31            array.dtype().as_nullable(),
32            array.len(),
33            array.data().clone(),
34            slots,
35        );
36
37        // SAFETY: elements, offsets, sizes, and their metadata are unchanged. Masking only removes
38        // valid rows, so the existing zero-copy-to-list guarantee still holds.
39        Ok(Some(
40            unsafe { ListViewArray::from_parts_unchecked(parts) }.into_array(),
41        ))
42    }
43}