Skip to content

Commit f54ac76

Browse files
committed
Fill out a few small pieces in Variant
1 parent 2258dd3 commit f54ac76

3 files changed

Lines changed: 51 additions & 9 deletions

File tree

vortex-array/src/arrays/dict/execute.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
66
use vortex_error::VortexExpect;
77
use vortex_error::VortexResult;
8-
use vortex_error::vortex_bail;
98

109
use crate::Canonical;
1110
use crate::ExecutionCtx;
@@ -27,6 +26,7 @@ use crate::arrays::Struct;
2726
use crate::arrays::StructArray;
2827
use crate::arrays::VarBinView;
2928
use crate::arrays::VarBinViewArray;
29+
use crate::arrays::VariantArray;
3030
use crate::arrays::dict::TakeExecute;
3131
use crate::arrays::dict::TakeReduce;
3232

@@ -51,8 +51,12 @@ pub fn take_canonical(
5151
}
5252
Canonical::Struct(a) => Canonical::Struct(take_struct(&a, codes)),
5353
Canonical::Extension(a) => Canonical::Extension(take_extension(&a, codes, ctx)),
54-
Canonical::Variant(_) => {
55-
vortex_bail!("Variant arrays don't support Take")
54+
Canonical::Variant(a) => {
55+
let taken_child = a
56+
.child()
57+
.take(codes.clone().into_array())
58+
.vortex_expect("VariantArray child could not be taken");
59+
Canonical::Variant(VariantArray::new(taken_child))
5660
}
5761
})
5862
}

vortex-array/src/arrays/filter/execute/mod.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use std::sync::Arc;
99

1010
use vortex_error::VortexExpect;
1111
use vortex_error::VortexResult;
12-
use vortex_error::vortex_panic;
1312
use vortex_mask::Mask;
1413
use vortex_mask::MaskValues;
1514

@@ -21,6 +20,7 @@ use crate::arrays::ConstantArray;
2120
use crate::arrays::ExtensionArray;
2221
use crate::arrays::FilterArray;
2322
use crate::arrays::NullArray;
23+
use crate::arrays::VariantArray;
2424
use crate::scalar::Scalar;
2525
use crate::validity::Validity;
2626

@@ -95,8 +95,12 @@ pub(super) fn execute_filter(canonical: Canonical, mask: &Arc<MaskValues>) -> Ca
9595
.vortex_expect("ExtensionArray storage type somehow could not be filtered");
9696
Canonical::Extension(ExtensionArray::new(a.ext_dtype().clone(), filtered_storage))
9797
}
98-
Canonical::Variant(_) => {
99-
vortex_panic!("Variant arrays don't support filtering")
98+
Canonical::Variant(a) => {
99+
let filtered_child = a
100+
.child()
101+
.filter(values_to_mask(mask))
102+
.vortex_expect("VariantArray child could not be filtered");
103+
Canonical::Variant(VariantArray::new(filtered_child))
100104
}
101105
}
102106
}

vortex-array/src/arrays/masked/execute.rs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,22 @@
66
use std::ops::BitAnd;
77

88
use vortex_error::VortexResult;
9-
use vortex_error::vortex_bail;
109
use vortex_mask::Mask;
1110

1211
use crate::Canonical;
1312
use crate::IntoArray;
13+
use crate::ArrayVisitor;
1414
use crate::arrays::BoolArray;
1515
use crate::arrays::DecimalArray;
1616
use crate::arrays::ExtensionArray;
1717
use crate::arrays::FixedSizeListArray;
1818
use crate::arrays::ListViewArray;
19+
use crate::arrays::MaskedArray;
1920
use crate::arrays::NullArray;
2021
use crate::arrays::PrimitiveArray;
2122
use crate::arrays::StructArray;
2223
use crate::arrays::VarBinViewArray;
24+
use crate::arrays::VariantArray;
2325
use crate::dtype::Nullability;
2426
use crate::executor::ExecutionCtx;
2527
use crate::match_each_decimal_value_type;
@@ -54,8 +56,8 @@ pub fn mask_validity_canonical(
5456
Canonical::Extension(a) => {
5557
Canonical::Extension(mask_validity_extension(a, validity_mask, ctx)?)
5658
}
57-
Canonical::Variant(_) => {
58-
vortex_bail!("Variant arrays don't masking validity")
59+
Canonical::Variant(a) => {
60+
Canonical::Variant(mask_validity_variant(a, validity_mask, ctx)?)
5961
}
6062
})
6163
}
@@ -200,3 +202,35 @@ fn mask_validity_extension(
200202
masked_storage,
201203
))
202204
}
205+
206+
fn mask_validity_variant(
207+
array: VariantArray,
208+
mask: &Mask,
209+
ctx: &mut ExecutionCtx,
210+
) -> VortexResult<VariantArray> {
211+
let child = array.child().clone();
212+
let len = child.len();
213+
let child_validity = child.validity()?;
214+
215+
match child_validity {
216+
Validity::NonNullable | Validity::AllValid => {
217+
// Child has no nulls — wrap in MaskedArray to apply the mask.
218+
let new_validity = Validity::from_mask(mask.clone(), Nullability::Nullable);
219+
let masked_child = MaskedArray::try_new(child, new_validity)?;
220+
Ok(VariantArray::new(masked_child.into_array()))
221+
}
222+
Validity::AllInvalid => {
223+
// Already all-null, ANDing with any mask is still all-null.
224+
Ok(array)
225+
}
226+
Validity::Array(_) => {
227+
// Child has an array-backed validity stored as its first child.
228+
// Combine with the mask and replace that child via with_children.
229+
let combined = combine_validity(&child_validity, mask, len, ctx)?;
230+
let mut children = child.children();
231+
children[0] = combined.to_array(len);
232+
let new_child = child.with_children(children)?;
233+
Ok(VariantArray::new(new_child))
234+
}
235+
}
236+
}

0 commit comments

Comments
 (0)