From 1e6416273c059764ed2f1a5fe7ca38a9081039ec Mon Sep 17 00:00:00 2001 From: Adam Gutglick Date: Wed, 18 Mar 2026 19:24:59 +0000 Subject: [PATCH 1/5] Canonical variant array Signed-off-by: Adam Gutglick --- vortex-array/public-api.lock | 452 ++++++++++++++++++ vortex-array/src/arrays/mod.rs | 4 + vortex-array/src/arrays/variant/mod.rs | 42 ++ vortex-array/src/arrays/variant/vtable/mod.rs | 167 +++++++ .../src/arrays/variant/vtable/operations.rs | 17 + .../src/arrays/variant/vtable/rules.rs | 38 ++ .../src/arrays/variant/vtable/validity.rs | 15 + vortex-array/src/arrow/executor/mod.rs | 18 + vortex-array/src/arrow/executor/variant.rs | 113 +++++ vortex-array/src/builtins.rs | 23 + vortex-array/src/expr/exprs.rs | 10 + vortex-array/src/scalar_fn/fns/mod.rs | 1 + vortex-array/src/scalar_fn/fns/variant_get.rs | 145 ++++++ vortex-array/src/scalar_fn/session.rs | 2 + vortex-proto/proto/expr.proto | 5 + vortex-proto/public-api.lock | 28 ++ vortex-proto/src/generated/vortex.expr.rs | 6 + 17 files changed, 1086 insertions(+) create mode 100644 vortex-array/src/arrays/variant/mod.rs create mode 100644 vortex-array/src/arrays/variant/vtable/mod.rs create mode 100644 vortex-array/src/arrays/variant/vtable/operations.rs create mode 100644 vortex-array/src/arrays/variant/vtable/rules.rs create mode 100644 vortex-array/src/arrays/variant/vtable/validity.rs create mode 100644 vortex-array/src/arrow/executor/variant.rs create mode 100644 vortex-array/src/scalar_fn/fns/variant_get.rs diff --git a/vortex-array/public-api.lock b/vortex-array/public-api.lock index ea2e3619b1e..c0de93de956 100644 --- a/vortex-array/public-api.lock +++ b/vortex-array/public-api.lock @@ -4708,6 +4708,120 @@ pub vortex_array::arrays::varbinview::VarBinViewArrayParts::validity: vortex_arr pub vortex_array::arrays::varbinview::VarBinViewArrayParts::views: vortex_array::buffer::BufferHandle +pub mod vortex_array::arrays::variant + +pub struct vortex_array::arrays::variant::Variant + +impl vortex_array::arrays::Variant + +pub const vortex_array::arrays::Variant::ID: vortex_array::vtable::ArrayId + +impl core::fmt::Debug for vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result + +impl vortex_array::vtable::OperationsVTable for vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::scalar_at(array: &::Array, index: usize) -> vortex_error::VortexResult + +impl vortex_array::vtable::VTable for vortex_array::arrays::Variant + +pub type vortex_array::arrays::Variant::Array = vortex_array::arrays::variant::VariantArray + +pub type vortex_array::arrays::Variant::Metadata = vortex_array::EmptyMetadata + +pub type vortex_array::arrays::Variant::OperationsVTable = vortex_array::arrays::Variant + +pub type vortex_array::arrays::Variant::ValidityVTable = vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::append_to_builder(array: &Self::Array, builder: &mut dyn vortex_array::builders::ArrayBuilder, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult<()> + +pub fn vortex_array::arrays::Variant::array_eq(array: &Self::Array, other: &Self::Array, precision: vortex_array::Precision) -> bool + +pub fn vortex_array::arrays::Variant::array_hash(array: &Self::Array, state: &mut H, precision: vortex_array::Precision) + +pub fn vortex_array::arrays::Variant::buffer(_array: &Self::Array, idx: usize) -> vortex_array::buffer::BufferHandle + +pub fn vortex_array::arrays::Variant::buffer_name(_array: &Self::Array, _idx: usize) -> core::option::Option + +pub fn vortex_array::arrays::Variant::build(dtype: &vortex_array::dtype::DType, len: usize, _metadata: &Self::Metadata, _buffers: &[vortex_array::buffer::BufferHandle], children: &dyn vortex_array::serde::ArrayChildren) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::child(array: &Self::Array, idx: usize) -> vortex_array::ArrayRef + +pub fn vortex_array::arrays::Variant::child_name(_array: &Self::Array, idx: usize) -> alloc::string::String + +pub fn vortex_array::arrays::Variant::deserialize(_bytes: &[u8], _dtype: &vortex_array::dtype::DType, _len: usize, _buffers: &[vortex_array::buffer::BufferHandle], _session: &vortex_session::VortexSession) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::dtype(array: &Self::Array) -> &vortex_array::dtype::DType + +pub fn vortex_array::arrays::Variant::execute(array: &Self::Array, _ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::execute_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::id(_array: &Self::Array) -> vortex_array::vtable::ArrayId + +pub fn vortex_array::arrays::Variant::len(array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::metadata(_array: &Self::Array) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::nbuffers(_array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::nchildren(_array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::reduce(array: &Self::Array) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::reduce_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::serialize(_metadata: Self::Metadata) -> vortex_error::VortexResult>> + +pub fn vortex_array::arrays::Variant::stats(array: &Self::Array) -> vortex_array::stats::StatsSetRef<'_> + +pub fn vortex_array::arrays::Variant::with_children(array: &mut Self::Array, children: alloc::vec::Vec) -> vortex_error::VortexResult<()> + +impl vortex_array::vtable::ValidityVTable for vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::validity(array: &::Array) -> vortex_error::VortexResult + +pub struct vortex_array::arrays::variant::VariantArray + +impl vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::child(&self) -> &vortex_array::ArrayRef + +pub fn vortex_array::arrays::variant::VariantArray::new(child: vortex_array::ArrayRef) -> Self + +pub fn vortex_array::arrays::variant::VariantArray::new_nullable(child: vortex_array::ArrayRef, nullability: vortex_array::dtype::Nullability) -> Self + +impl vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::to_array(&self) -> vortex_array::ArrayRef + +impl core::clone::Clone for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::clone(&self) -> vortex_array::arrays::variant::VariantArray + +impl core::convert::AsRef for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::as_ref(&self) -> &dyn vortex_array::DynArray + +impl core::convert::From for vortex_array::ArrayRef + +pub fn vortex_array::ArrayRef::from(value: vortex_array::arrays::variant::VariantArray) -> vortex_array::ArrayRef + +impl core::fmt::Debug for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result + +impl core::ops::deref::Deref for vortex_array::arrays::variant::VariantArray + +pub type vortex_array::arrays::variant::VariantArray::Target = dyn vortex_array::DynArray + +pub fn vortex_array::arrays::variant::VariantArray::deref(&self) -> &Self::Target + +impl vortex_array::IntoArray for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::into_array(self) -> vortex_array::ArrayRef + pub struct vortex_array::arrays::Bool impl vortex_array::arrays::Bool @@ -7852,6 +7966,118 @@ impl<'a> core::iter::traits::collect::FromIterator pub fn vortex_array::arrays::VarBinViewArray::from_iter>>(iter: T) -> Self +pub struct vortex_array::arrays::Variant + +impl vortex_array::arrays::Variant + +pub const vortex_array::arrays::Variant::ID: vortex_array::vtable::ArrayId + +impl core::fmt::Debug for vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result + +impl vortex_array::vtable::OperationsVTable for vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::scalar_at(array: &::Array, index: usize) -> vortex_error::VortexResult + +impl vortex_array::vtable::VTable for vortex_array::arrays::Variant + +pub type vortex_array::arrays::Variant::Array = vortex_array::arrays::variant::VariantArray + +pub type vortex_array::arrays::Variant::Metadata = vortex_array::EmptyMetadata + +pub type vortex_array::arrays::Variant::OperationsVTable = vortex_array::arrays::Variant + +pub type vortex_array::arrays::Variant::ValidityVTable = vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::append_to_builder(array: &Self::Array, builder: &mut dyn vortex_array::builders::ArrayBuilder, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult<()> + +pub fn vortex_array::arrays::Variant::array_eq(array: &Self::Array, other: &Self::Array, precision: vortex_array::Precision) -> bool + +pub fn vortex_array::arrays::Variant::array_hash(array: &Self::Array, state: &mut H, precision: vortex_array::Precision) + +pub fn vortex_array::arrays::Variant::buffer(_array: &Self::Array, idx: usize) -> vortex_array::buffer::BufferHandle + +pub fn vortex_array::arrays::Variant::buffer_name(_array: &Self::Array, _idx: usize) -> core::option::Option + +pub fn vortex_array::arrays::Variant::build(dtype: &vortex_array::dtype::DType, len: usize, _metadata: &Self::Metadata, _buffers: &[vortex_array::buffer::BufferHandle], children: &dyn vortex_array::serde::ArrayChildren) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::child(array: &Self::Array, idx: usize) -> vortex_array::ArrayRef + +pub fn vortex_array::arrays::Variant::child_name(_array: &Self::Array, idx: usize) -> alloc::string::String + +pub fn vortex_array::arrays::Variant::deserialize(_bytes: &[u8], _dtype: &vortex_array::dtype::DType, _len: usize, _buffers: &[vortex_array::buffer::BufferHandle], _session: &vortex_session::VortexSession) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::dtype(array: &Self::Array) -> &vortex_array::dtype::DType + +pub fn vortex_array::arrays::Variant::execute(array: &Self::Array, _ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::execute_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::id(_array: &Self::Array) -> vortex_array::vtable::ArrayId + +pub fn vortex_array::arrays::Variant::len(array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::metadata(_array: &Self::Array) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::nbuffers(_array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::nchildren(_array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::reduce(array: &Self::Array) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::reduce_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::serialize(_metadata: Self::Metadata) -> vortex_error::VortexResult>> + +pub fn vortex_array::arrays::Variant::stats(array: &Self::Array) -> vortex_array::stats::StatsSetRef<'_> + +pub fn vortex_array::arrays::Variant::with_children(array: &mut Self::Array, children: alloc::vec::Vec) -> vortex_error::VortexResult<()> + +impl vortex_array::vtable::ValidityVTable for vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::validity(array: &::Array) -> vortex_error::VortexResult + +pub struct vortex_array::arrays::VariantArray + +impl vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::child(&self) -> &vortex_array::ArrayRef + +pub fn vortex_array::arrays::variant::VariantArray::new(child: vortex_array::ArrayRef) -> Self + +pub fn vortex_array::arrays::variant::VariantArray::new_nullable(child: vortex_array::ArrayRef, nullability: vortex_array::dtype::Nullability) -> Self + +impl vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::to_array(&self) -> vortex_array::ArrayRef + +impl core::clone::Clone for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::clone(&self) -> vortex_array::arrays::variant::VariantArray + +impl core::convert::AsRef for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::as_ref(&self) -> &dyn vortex_array::DynArray + +impl core::convert::From for vortex_array::ArrayRef + +pub fn vortex_array::ArrayRef::from(value: vortex_array::arrays::variant::VariantArray) -> vortex_array::ArrayRef + +impl core::fmt::Debug for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result + +impl core::ops::deref::Deref for vortex_array::arrays::variant::VariantArray + +pub type vortex_array::arrays::variant::VariantArray::Target = dyn vortex_array::DynArray + +pub fn vortex_array::arrays::variant::VariantArray::deref(&self) -> &Self::Target + +impl vortex_array::IntoArray for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::into_array(self) -> vortex_array::ArrayRef + pub mod vortex_array::arrow pub mod vortex_array::arrow::bool @@ -9360,6 +9586,8 @@ pub fn vortex_array::builtins::ArrayBuiltins::mask(self, mask: vortex_array::Arr pub fn vortex_array::builtins::ArrayBuiltins::not(&self) -> vortex_error::VortexResult +pub fn vortex_array::builtins::ArrayBuiltins::variant_get(&self, path: core::option::Option, dtype: vortex_array::dtype::DType) -> vortex_error::VortexResult + pub fn vortex_array::builtins::ArrayBuiltins::zip(&self, if_true: vortex_array::ArrayRef, if_false: vortex_array::ArrayRef) -> vortex_error::VortexResult impl vortex_array::builtins::ArrayBuiltins for vortex_array::ArrayRef @@ -9382,6 +9610,8 @@ pub fn vortex_array::ArrayRef::mask(self, mask: vortex_array::ArrayRef) -> vorte pub fn vortex_array::ArrayRef::not(&self) -> vortex_error::VortexResult +pub fn vortex_array::ArrayRef::variant_get(&self, path: core::option::Option, dtype: vortex_array::dtype::DType) -> vortex_error::VortexResult + pub fn vortex_array::ArrayRef::zip(&self, if_true: vortex_array::ArrayRef, if_false: vortex_array::ArrayRef) -> vortex_error::VortexResult pub trait vortex_array::builtins::ExprBuiltins: core::marker::Sized @@ -9402,6 +9632,8 @@ pub fn vortex_array::builtins::ExprBuiltins::mask(&self, mask: vortex_array::exp pub fn vortex_array::builtins::ExprBuiltins::not(&self) -> vortex_error::VortexResult +pub fn vortex_array::builtins::ExprBuiltins::variant_get(&self, path: core::option::Option, dtype: vortex_array::dtype::DType) -> vortex_error::VortexResult + pub fn vortex_array::builtins::ExprBuiltins::zip(&self, if_true: vortex_array::expr::Expression, if_false: vortex_array::expr::Expression) -> vortex_error::VortexResult impl vortex_array::builtins::ExprBuiltins for vortex_array::expr::Expression @@ -9422,6 +9654,8 @@ pub fn vortex_array::expr::Expression::mask(&self, mask: vortex_array::expr::Exp pub fn vortex_array::expr::Expression::not(&self) -> vortex_error::VortexResult +pub fn vortex_array::expr::Expression::variant_get(&self, path: core::option::Option, dtype: vortex_array::dtype::DType) -> vortex_error::VortexResult + pub fn vortex_array::expr::Expression::zip(&self, if_true: vortex_array::expr::Expression, if_false: vortex_array::expr::Expression) -> vortex_error::VortexResult pub mod vortex_array::compute @@ -13676,6 +13910,8 @@ pub fn vortex_array::expr::Expression::mask(&self, mask: vortex_array::expr::Exp pub fn vortex_array::expr::Expression::not(&self) -> vortex_error::VortexResult +pub fn vortex_array::expr::Expression::variant_get(&self, path: core::option::Option, dtype: vortex_array::dtype::DType) -> vortex_error::VortexResult + pub fn vortex_array::expr::Expression::zip(&self, if_true: vortex_array::expr::Expression, if_false: vortex_array::expr::Expression) -> vortex_error::VortexResult impl vortex_array::expr::VortexExprExt for vortex_array::expr::Expression @@ -13814,6 +14050,8 @@ pub fn vortex_array::expr::select_exclude(fields: impl core::convert::Into alloc::vec::Vec +pub fn vortex_array::expr::variant_get(path: core::option::Option, dtype: vortex_array::dtype::DType, child: vortex_array::expr::Expression) -> vortex_array::expr::Expression + pub fn vortex_array::expr::zip_expr(mask: vortex_array::expr::Expression, if_true: vortex_array::expr::Expression, if_false: vortex_array::expr::Expression) -> vortex_array::expr::Expression pub type vortex_array::expr::Annotations<'a, A> = vortex_utils::aliases::hash_map::HashMap<&'a vortex_array::expr::Expression, vortex_utils::aliases::hash_set::HashSet> @@ -18440,6 +18678,116 @@ pub fn vortex_array::scalar_fn::fns::select::Select::stat_falsification(&self, o pub fn vortex_array::scalar_fn::fns::select::Select::validity(&self, options: &Self::Options, expression: &vortex_array::expr::Expression) -> vortex_error::VortexResult> +pub mod vortex_array::scalar_fn::fns::variant_get + +pub struct vortex_array::scalar_fn::fns::variant_get::VariantGet + +impl core::clone::Clone for vortex_array::scalar_fn::fns::variant_get::VariantGet + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::clone(&self) -> vortex_array::scalar_fn::fns::variant_get::VariantGet + +impl vortex_array::scalar_fn::ScalarFnVTable for vortex_array::scalar_fn::fns::variant_get::VariantGet + +pub type vortex_array::scalar_fn::fns::variant_get::VariantGet::Options = vortex_array::scalar_fn::fns::variant_get::VariantGetOptions + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::arity(&self, _options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions) -> vortex_array::scalar_fn::Arity + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::child_name(&self, _options: &Self::Options, child_idx: usize) -> vortex_array::scalar_fn::ChildName + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::coerce_args(&self, options: &Self::Options, args: &[vortex_array::dtype::DType]) -> vortex_error::VortexResult> + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::deserialize(&self, metadata: &[u8], session: &vortex_session::VortexSession) -> vortex_error::VortexResult + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::execute(&self, _options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions, _args: &dyn vortex_array::scalar_fn::ExecutionArgs, _ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::fmt_sql(&self, options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions, expr: &vortex_array::expr::Expression, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::id(&self) -> vortex_array::scalar_fn::ScalarFnId + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::is_fallible(&self, _options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions) -> bool + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::is_null_sensitive(&self, _options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions) -> bool + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::reduce(&self, options: &Self::Options, node: &dyn vortex_array::scalar_fn::ReduceNode, ctx: &dyn vortex_array::scalar_fn::ReduceCtx) -> vortex_error::VortexResult> + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::return_dtype(&self, options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions, _arg_dtypes: &[vortex_array::dtype::DType]) -> vortex_error::VortexResult + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::serialize(&self, instance: &Self::Options) -> vortex_error::VortexResult>> + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::simplify(&self, options: &Self::Options, expr: &vortex_array::expr::Expression, ctx: &dyn vortex_array::scalar_fn::SimplifyCtx) -> vortex_error::VortexResult> + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::simplify_untyped(&self, options: &Self::Options, expr: &vortex_array::expr::Expression) -> vortex_error::VortexResult> + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::stat_expression(&self, options: &Self::Options, expr: &vortex_array::expr::Expression, stat: vortex_array::expr::stats::Stat, catalog: &dyn vortex_array::expr::pruning::StatsCatalog) -> core::option::Option + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::stat_falsification(&self, options: &Self::Options, expr: &vortex_array::expr::Expression, catalog: &dyn vortex_array::expr::pruning::StatsCatalog) -> core::option::Option + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::validity(&self, options: &Self::Options, expression: &vortex_array::expr::Expression) -> vortex_error::VortexResult> + +pub struct vortex_array::scalar_fn::fns::variant_get::VariantGetOptions + +impl vortex_array::scalar_fn::fns::variant_get::VariantGetOptions + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGetOptions::dtype(&self) -> &vortex_array::dtype::DType + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGetOptions::new(path: core::option::Option, dtype: vortex_array::dtype::DType) -> Self + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGetOptions::path(&self) -> core::option::Option<&vortex_array::scalar_fn::fns::variant_get::VariantPath> + +impl core::clone::Clone for vortex_array::scalar_fn::fns::variant_get::VariantGetOptions + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGetOptions::clone(&self) -> vortex_array::scalar_fn::fns::variant_get::VariantGetOptions + +impl core::cmp::Eq for vortex_array::scalar_fn::fns::variant_get::VariantGetOptions + +impl core::cmp::PartialEq for vortex_array::scalar_fn::fns::variant_get::VariantGetOptions + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGetOptions::eq(&self, other: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions) -> bool + +impl core::fmt::Debug for vortex_array::scalar_fn::fns::variant_get::VariantGetOptions + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGetOptions::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result + +impl core::fmt::Display for vortex_array::scalar_fn::fns::variant_get::VariantGetOptions + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGetOptions::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result + +impl core::hash::Hash for vortex_array::scalar_fn::fns::variant_get::VariantGetOptions + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGetOptions::hash<__H: core::hash::Hasher>(&self, state: &mut __H) + +impl core::marker::StructuralPartialEq for vortex_array::scalar_fn::fns::variant_get::VariantGetOptions + +pub struct vortex_array::scalar_fn::fns::variant_get::VariantPath + +impl vortex_array::scalar_fn::fns::variant_get::VariantPath + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantPath::is_empty(&self) -> bool + +impl core::clone::Clone for vortex_array::scalar_fn::fns::variant_get::VariantPath + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantPath::clone(&self) -> vortex_array::scalar_fn::fns::variant_get::VariantPath + +impl core::cmp::Eq for vortex_array::scalar_fn::fns::variant_get::VariantPath + +impl core::cmp::PartialEq for vortex_array::scalar_fn::fns::variant_get::VariantPath + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantPath::eq(&self, other: &vortex_array::scalar_fn::fns::variant_get::VariantPath) -> bool + +impl core::default::Default for vortex_array::scalar_fn::fns::variant_get::VariantPath + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantPath::default() -> vortex_array::scalar_fn::fns::variant_get::VariantPath + +impl core::fmt::Debug for vortex_array::scalar_fn::fns::variant_get::VariantPath + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantPath::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result + +impl core::hash::Hash for vortex_array::scalar_fn::fns::variant_get::VariantPath + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantPath::hash<__H: core::hash::Hasher>(&self, state: &mut __H) + +impl core::marker::StructuralPartialEq for vortex_array::scalar_fn::fns::variant_get::VariantPath + pub mod vortex_array::scalar_fn::fns::zip pub struct vortex_array::scalar_fn::fns::zip::Zip @@ -19512,6 +19860,44 @@ pub fn vortex_array::scalar_fn::fns::select::Select::stat_falsification(&self, o pub fn vortex_array::scalar_fn::fns::select::Select::validity(&self, options: &Self::Options, expression: &vortex_array::expr::Expression) -> vortex_error::VortexResult> +impl vortex_array::scalar_fn::ScalarFnVTable for vortex_array::scalar_fn::fns::variant_get::VariantGet + +pub type vortex_array::scalar_fn::fns::variant_get::VariantGet::Options = vortex_array::scalar_fn::fns::variant_get::VariantGetOptions + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::arity(&self, _options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions) -> vortex_array::scalar_fn::Arity + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::child_name(&self, _options: &Self::Options, child_idx: usize) -> vortex_array::scalar_fn::ChildName + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::coerce_args(&self, options: &Self::Options, args: &[vortex_array::dtype::DType]) -> vortex_error::VortexResult> + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::deserialize(&self, metadata: &[u8], session: &vortex_session::VortexSession) -> vortex_error::VortexResult + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::execute(&self, _options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions, _args: &dyn vortex_array::scalar_fn::ExecutionArgs, _ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::fmt_sql(&self, options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions, expr: &vortex_array::expr::Expression, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::id(&self) -> vortex_array::scalar_fn::ScalarFnId + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::is_fallible(&self, _options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions) -> bool + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::is_null_sensitive(&self, _options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions) -> bool + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::reduce(&self, options: &Self::Options, node: &dyn vortex_array::scalar_fn::ReduceNode, ctx: &dyn vortex_array::scalar_fn::ReduceCtx) -> vortex_error::VortexResult> + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::return_dtype(&self, options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions, _arg_dtypes: &[vortex_array::dtype::DType]) -> vortex_error::VortexResult + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::serialize(&self, instance: &Self::Options) -> vortex_error::VortexResult>> + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::simplify(&self, options: &Self::Options, expr: &vortex_array::expr::Expression, ctx: &dyn vortex_array::scalar_fn::SimplifyCtx) -> vortex_error::VortexResult> + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::simplify_untyped(&self, options: &Self::Options, expr: &vortex_array::expr::Expression) -> vortex_error::VortexResult> + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::stat_expression(&self, options: &Self::Options, expr: &vortex_array::expr::Expression, stat: vortex_array::expr::stats::Stat, catalog: &dyn vortex_array::expr::pruning::StatsCatalog) -> core::option::Option + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::stat_falsification(&self, options: &Self::Options, expr: &vortex_array::expr::Expression, catalog: &dyn vortex_array::expr::pruning::StatsCatalog) -> core::option::Option + +pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::validity(&self, options: &Self::Options, expression: &vortex_array::expr::Expression) -> vortex_error::VortexResult> + impl vortex_array::scalar_fn::ScalarFnVTable for vortex_array::scalar_fn::fns::zip::Zip pub type vortex_array::scalar_fn::fns::zip::Zip::Options = vortex_array::scalar_fn::EmptyOptions @@ -20420,6 +20806,10 @@ impl vortex_array::vtable::OperationsVTable fo pub fn vortex_array::arrays::VarBinView::scalar_at(array: &vortex_array::arrays::VarBinViewArray, index: usize) -> vortex_error::VortexResult +impl vortex_array::vtable::OperationsVTable for vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::scalar_at(array: &::Array, index: usize) -> vortex_error::VortexResult + impl vortex_array::vtable::OperationsVTable for vortex_array::arrays::dict::Dict pub fn vortex_array::arrays::dict::Dict::scalar_at(array: &vortex_array::arrays::dict::DictArray, index: usize) -> vortex_error::VortexResult @@ -21304,6 +21694,60 @@ pub fn vortex_array::arrays::VarBinView::stats(array: &vortex_array::arrays::Var pub fn vortex_array::arrays::VarBinView::with_children(array: &mut Self::Array, children: alloc::vec::Vec) -> vortex_error::VortexResult<()> +impl vortex_array::vtable::VTable for vortex_array::arrays::Variant + +pub type vortex_array::arrays::Variant::Array = vortex_array::arrays::variant::VariantArray + +pub type vortex_array::arrays::Variant::Metadata = vortex_array::EmptyMetadata + +pub type vortex_array::arrays::Variant::OperationsVTable = vortex_array::arrays::Variant + +pub type vortex_array::arrays::Variant::ValidityVTable = vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::append_to_builder(array: &Self::Array, builder: &mut dyn vortex_array::builders::ArrayBuilder, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult<()> + +pub fn vortex_array::arrays::Variant::array_eq(array: &Self::Array, other: &Self::Array, precision: vortex_array::Precision) -> bool + +pub fn vortex_array::arrays::Variant::array_hash(array: &Self::Array, state: &mut H, precision: vortex_array::Precision) + +pub fn vortex_array::arrays::Variant::buffer(_array: &Self::Array, idx: usize) -> vortex_array::buffer::BufferHandle + +pub fn vortex_array::arrays::Variant::buffer_name(_array: &Self::Array, _idx: usize) -> core::option::Option + +pub fn vortex_array::arrays::Variant::build(dtype: &vortex_array::dtype::DType, len: usize, _metadata: &Self::Metadata, _buffers: &[vortex_array::buffer::BufferHandle], children: &dyn vortex_array::serde::ArrayChildren) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::child(array: &Self::Array, idx: usize) -> vortex_array::ArrayRef + +pub fn vortex_array::arrays::Variant::child_name(_array: &Self::Array, idx: usize) -> alloc::string::String + +pub fn vortex_array::arrays::Variant::deserialize(_bytes: &[u8], _dtype: &vortex_array::dtype::DType, _len: usize, _buffers: &[vortex_array::buffer::BufferHandle], _session: &vortex_session::VortexSession) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::dtype(array: &Self::Array) -> &vortex_array::dtype::DType + +pub fn vortex_array::arrays::Variant::execute(array: &Self::Array, _ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::execute_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::id(_array: &Self::Array) -> vortex_array::vtable::ArrayId + +pub fn vortex_array::arrays::Variant::len(array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::metadata(_array: &Self::Array) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::nbuffers(_array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::nchildren(_array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::reduce(array: &Self::Array) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::reduce_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::serialize(_metadata: Self::Metadata) -> vortex_error::VortexResult>> + +pub fn vortex_array::arrays::Variant::stats(array: &Self::Array) -> vortex_array::stats::StatsSetRef<'_> + +pub fn vortex_array::arrays::Variant::with_children(array: &mut Self::Array, children: alloc::vec::Vec) -> vortex_error::VortexResult<()> + impl vortex_array::vtable::VTable for vortex_array::arrays::dict::Dict pub type vortex_array::arrays::dict::Dict::Array = vortex_array::arrays::dict::DictArray @@ -21604,6 +22048,10 @@ impl vortex_array::vtable::ValidityVTable for vort pub fn vortex_array::arrays::Shared::validity(array: &vortex_array::arrays::SharedArray) -> vortex_error::VortexResult +impl vortex_array::vtable::ValidityVTable for vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::validity(array: &::Array) -> vortex_error::VortexResult + impl vortex_array::vtable::ValidityVTable for vortex_array::arrays::dict::Dict pub fn vortex_array::arrays::dict::Dict::validity(array: &vortex_array::arrays::dict::DictArray) -> vortex_error::VortexResult @@ -22672,6 +23120,10 @@ impl vortex_array::IntoArray for vortex_array::arrays::slice::SliceArray pub fn vortex_array::arrays::slice::SliceArray::into_array(self) -> vortex_array::ArrayRef +impl vortex_array::IntoArray for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::into_array(self) -> vortex_array::ArrayRef + impl vortex_array::IntoArray for vortex_buffer::bit::buf::BitBuffer pub fn vortex_buffer::bit::buf::BitBuffer::into_array(self) -> vortex_array::ArrayRef diff --git a/vortex-array/src/arrays/mod.rs b/vortex-array/src/arrays/mod.rs index 62325b69eb5..43f8a84d49e 100644 --- a/vortex-array/src/arrays/mod.rs +++ b/vortex-array/src/arrays/mod.rs @@ -94,5 +94,9 @@ pub mod varbinview; pub use varbinview::VarBinView; pub use varbinview::VarBinViewArray; +pub mod variant; +pub use variant::Variant; +pub use variant::VariantArray; + #[cfg(feature = "arbitrary")] pub mod arbitrary; diff --git a/vortex-array/src/arrays/variant/mod.rs b/vortex-array/src/arrays/variant/mod.rs new file mode 100644 index 00000000000..63c1fb2e3e8 --- /dev/null +++ b/vortex-array/src/arrays/variant/mod.rs @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: Copyright the Vortex contributors + +mod vtable; + +pub use self::vtable::Variant; +use crate::ArrayRef; +use crate::dtype::DType; +use crate::dtype::Nullability; +use crate::stats::ArrayStats; + +/// The canonical in-memory representation of variant (semi-structured) data. +/// +/// Wraps a single child array that contains the actual variant-encoded data +/// (e.g. a `ParquetVariantArray` or any other variant encoding). +#[derive(Clone, Debug)] +pub struct VariantArray { + dtype: DType, + child: ArrayRef, + pub(super) stats_set: ArrayStats, +} + +impl VariantArray { + /// Creates a new non-nullable VariantArray wrapping the given child. + pub fn new(child: ArrayRef) -> Self { + Self::new_nullable(child, Nullability::NonNullable) + } + + /// Creates a new VariantArray with the given nullability. + pub fn new_nullable(child: ArrayRef, nullability: Nullability) -> Self { + Self { + dtype: DType::Variant(nullability), + child, + stats_set: ArrayStats::default(), + } + } + + /// Returns a reference to the underlying child array. + pub fn child(&self) -> &ArrayRef { + &self.child + } +} diff --git a/vortex-array/src/arrays/variant/vtable/mod.rs b/vortex-array/src/arrays/variant/vtable/mod.rs new file mode 100644 index 00000000000..590c3b74e9f --- /dev/null +++ b/vortex-array/src/arrays/variant/vtable/mod.rs @@ -0,0 +1,167 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: Copyright the Vortex contributors + +mod operations; +mod rules; +mod validity; + +use std::hash::Hasher; + +use vortex_error::VortexExpect; +use vortex_error::VortexResult; +use vortex_error::vortex_ensure; +use vortex_error::vortex_panic; + +use self::rules::PARENT_RULES; +use crate::ArrayEq; +use crate::ArrayHash; +use crate::ArrayRef; +use crate::EmptyMetadata; +use crate::ExecutionCtx; +use crate::ExecutionStep; +use crate::IntoArray; +use crate::Precision; +use crate::arrays::VariantArray; +use crate::buffer::BufferHandle; +use crate::dtype::DType; +use crate::serde::ArrayChildren; +use crate::stats::StatsSetRef; +use crate::vtable; +use crate::vtable::ArrayId; +use crate::vtable::VTable; + +vtable!(Variant); + +#[derive(Debug)] +pub struct Variant; + +impl Variant { + pub const ID: ArrayId = ArrayId::new_ref("vortex.variant"); +} + +impl VTable for Variant { + type Array = VariantArray; + + type Metadata = EmptyMetadata; + + type OperationsVTable = Self; + + type ValidityVTable = Self; + + fn id(_array: &Self::Array) -> ArrayId { + Self::ID + } + + fn len(array: &Self::Array) -> usize { + array.child.len() + } + + fn dtype(array: &Self::Array) -> &DType { + &array.dtype + } + + fn stats(array: &Self::Array) -> StatsSetRef<'_> { + array.stats_set.to_ref(array.as_ref()) + } + + fn array_hash(array: &Self::Array, state: &mut H, precision: Precision) { + array.child.array_hash(state, precision); + } + + fn array_eq(array: &Self::Array, other: &Self::Array, precision: Precision) -> bool { + array.child.array_eq(&other.child, precision) + } + + fn nbuffers(_array: &Self::Array) -> usize { + 0 + } + + fn buffer(_array: &Self::Array, idx: usize) -> BufferHandle { + vortex_panic!("VariantArray buffer index {idx} out of bounds") + } + + fn buffer_name(_array: &Self::Array, _idx: usize) -> Option { + None + } + + fn nchildren(_array: &Self::Array) -> usize { + 1 + } + + fn child(array: &Self::Array, idx: usize) -> ArrayRef { + match idx { + 0 => array.child.clone(), + _ => vortex_panic!("VariantArray child index {idx} out of bounds"), + } + } + + fn child_name(_array: &Self::Array, idx: usize) -> String { + match idx { + 0 => "child".to_string(), + _ => vortex_panic!("VariantArray child_name index {idx} out of bounds"), + } + } + + fn metadata(_array: &Self::Array) -> VortexResult { + Ok(EmptyMetadata) + } + + fn serialize(_metadata: Self::Metadata) -> VortexResult>> { + Ok(Some(vec![])) + } + + fn deserialize( + _bytes: &[u8], + _dtype: &DType, + _len: usize, + _buffers: &[BufferHandle], + _session: &vortex_session::VortexSession, + ) -> VortexResult { + Ok(EmptyMetadata) + } + + fn build( + dtype: &DType, + len: usize, + _metadata: &Self::Metadata, + _buffers: &[BufferHandle], + children: &dyn ArrayChildren, + ) -> VortexResult { + vortex_ensure!(matches!(dtype, DType::Variant(_)), "Expected Variant DType"); + vortex_ensure!( + children.len() == 1, + "Expected 1 child, got {}", + children.len() + ); + // The child can be any variant encoding, so we use DType::Variant. + let child = children.get( + 0, + &DType::Variant(crate::dtype::Nullability::NonNullable), + len, + )?; + Ok(VariantArray::new_nullable(child, dtype.nullability())) + } + + fn with_children(array: &mut Self::Array, children: Vec) -> VortexResult<()> { + vortex_ensure!( + children.len() == 1, + "VariantArray expects exactly 1 child, got {}", + children.len() + ); + array.child = children.into_iter().next().vortex_expect("must exist"); + Ok(()) + } + + fn execute(array: &Self::Array, _ctx: &mut ExecutionCtx) -> VortexResult { + // VariantArray is the canonical variant representation. + Ok(ExecutionStep::done(array.clone().into_array())) + } + + fn reduce_parent( + array: &Self::Array, + parent: &ArrayRef, + child_idx: usize, + ) -> VortexResult> { + PARENT_RULES.evaluate(array, parent, child_idx) + } +} diff --git a/vortex-array/src/arrays/variant/vtable/operations.rs b/vortex-array/src/arrays/variant/vtable/operations.rs new file mode 100644 index 00000000000..5884b43319d --- /dev/null +++ b/vortex-array/src/arrays/variant/vtable/operations.rs @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: Copyright the Vortex contributors + +use vortex_error::VortexResult; + +use crate::arrays::Variant; +use crate::scalar::Scalar; +use crate::vtable::OperationsVTable; + +impl OperationsVTable for Variant { + fn scalar_at( + array: &::Array, + index: usize, + ) -> VortexResult { + array.child().scalar_at(index) + } +} diff --git a/vortex-array/src/arrays/variant/vtable/rules.rs b/vortex-array/src/arrays/variant/vtable/rules.rs new file mode 100644 index 00000000000..d0786ec8b81 --- /dev/null +++ b/vortex-array/src/arrays/variant/vtable/rules.rs @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: Copyright the Vortex contributors + +use vortex_error::VortexResult; + +use crate::ArrayRef; +use crate::arrays::VariantArray; +use crate::arrays::scalar_fn::ExactScalarFn; +use crate::arrays::scalar_fn::ScalarFnArrayView; +use crate::arrays::variant::vtable::Variant; +use crate::builtins::ArrayBuiltins; +use crate::optimizer::rules::ArrayParentReduceRule; +use crate::optimizer::rules::ParentRuleSet; +use crate::scalar_fn::fns::variant_get::VariantGet; + +pub(crate) const PARENT_RULES: ParentRuleSet = + ParentRuleSet::new(&[ParentRuleSet::lift(&VariantGetPushDownRule)]); + +/// Rule to push VariantGet through VariantArray to its child encoding. +#[derive(Debug)] +struct VariantGetPushDownRule; + +impl ArrayParentReduceRule for VariantGetPushDownRule { + type Parent = ExactScalarFn; + + fn reduce_parent( + &self, + array: &VariantArray, + parent: ScalarFnArrayView<'_, VariantGet>, + _child_idx: usize, + ) -> VortexResult> { + let options = parent.options; + Ok(Some(array.child().variant_get( + options.path().cloned(), + options.dtype().clone(), + )?)) + } +} diff --git a/vortex-array/src/arrays/variant/vtable/validity.rs b/vortex-array/src/arrays/variant/vtable/validity.rs new file mode 100644 index 00000000000..8e1b1d804ad --- /dev/null +++ b/vortex-array/src/arrays/variant/vtable/validity.rs @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: Copyright the Vortex contributors + +use vortex_error::VortexResult; + +use crate::arrays::Variant; +use crate::validity::Validity; +use crate::vtable::VTable; +use crate::vtable::ValidityVTable; + +impl ValidityVTable for Variant { + fn validity(array: &::Array) -> VortexResult { + array.child().validity() + } +} diff --git a/vortex-array/src/arrow/executor/mod.rs b/vortex-array/src/arrow/executor/mod.rs index edaa244d967..1582081dbcb 100644 --- a/vortex-array/src/arrow/executor/mod.rs +++ b/vortex-array/src/arrow/executor/mod.rs @@ -15,6 +15,7 @@ mod run_end; mod struct_; mod temporal; mod validity; +mod variant; use arrow_array::ArrayRef as ArrowArrayRef; use arrow_array::RecordBatch; @@ -46,6 +47,7 @@ use crate::arrow::executor::primitive::to_arrow_primitive; use crate::arrow::executor::run_end::to_arrow_run_end; use crate::arrow::executor::struct_::to_arrow_struct; use crate::arrow::executor::temporal::to_arrow_temporal; +use crate::arrow::executor::variant::to_arrow_variant; use crate::dtype::DType; use crate::dtype::PType; use crate::executor::ExecutionCtx; @@ -88,6 +90,22 @@ impl ArrowArrayExecutor for ArrayRef { ) -> VortexResult { let len = self.len(); + if self.dtype().is_variant() { + let target_fields = match data_type { + Some(DataType::Struct(fields)) => Some(fields), + Some(_) => { + vortex_bail!("Variant can only be converted to Arrow Struct storage type"); + } + None => None, + }; + let arrow = to_arrow_variant(self, target_fields, ctx)?; + vortex_ensure!( + arrow.len() == len, + "Arrow array length does not match Vortex array length after conversion to Variant" + ); + return Ok(arrow); + } + // Resolve the DataType if it is a leaf type // we should likely make this extensible. let resolved_type: DataType = match data_type { diff --git a/vortex-array/src/arrow/executor/variant.rs b/vortex-array/src/arrow/executor/variant.rs new file mode 100644 index 00000000000..a02f7cfe593 --- /dev/null +++ b/vortex-array/src/arrow/executor/variant.rs @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: Copyright the Vortex contributors + +use std::sync::Arc; + +use arrow_array::ArrayRef as ArrowArrayRef; +use arrow_array::StructArray as ArrowStructArray; +use arrow_schema::Field; +use arrow_schema::Fields; +use vortex_error::VortexResult; +use vortex_error::vortex_bail; +use vortex_error::vortex_ensure; + +use crate::ArrayRef; +use crate::ExecutionCtx; +use crate::array::ArrayVisitor; +use crate::arrays::Variant; +use crate::arrow::ArrowArrayExecutor; +use crate::arrow::executor::validity::to_arrow_null_buffer; + +pub(super) fn to_arrow_variant( + array: ArrayRef, + target_fields: Option<&Fields>, + ctx: &mut ExecutionCtx, +) -> VortexResult { + let len = array.len(); + let nulls = to_arrow_null_buffer(array.validity()?, len, ctx)?; + let inner = match array.try_into::() { + Ok(variant) => variant.child().clone(), + Err(array) => array, + }; + + let named_children = inner.named_children(); + if named_children.is_empty() { + vortex_bail!("Variant array has no children"); + } + + let mut metadata: Option = None; + let mut value: Option = None; + let mut typed_value: Option = None; + + for (name, child) in named_children { + match name.as_str() { + "validity" => {} + "metadata" => metadata = Some(child), + "value" => value = Some(child), + "typed_value" => typed_value = Some(child), + _ => { + vortex_bail!("Unsupported variant child {name}"); + } + } + } + + let metadata = match metadata { + Some(metadata) => metadata, + None => vortex_bail!("Variant array missing metadata child"), + }; + + let mut ordered: Vec<(String, ArrayRef)> = vec![("metadata".to_string(), metadata.clone())]; + if let Some(value) = value.clone() { + ordered.push(("value".to_string(), value)); + } + if let Some(typed_value) = typed_value.clone() { + ordered.push(("typed_value".to_string(), typed_value)); + } + + let (fields, arrays) = if let Some(fields) = target_fields { + let mut arrays = Vec::with_capacity(fields.len()); + for field in fields.iter() { + let child = match field.name().as_str() { + "metadata" => Some(&metadata), + "value" => value.as_ref(), + "typed_value" => typed_value.as_ref(), + other => { + vortex_bail!("Unsupported variant field {other}"); + } + }; + + let Some(child) = child else { + vortex_bail!("Variant array missing child for field {}", field.name()); + }; + + arrays.push(child.clone().execute_arrow(Some(field.data_type()), ctx)?); + } + + // Ensure we didn't silently drop any children + vortex_ensure!( + fields.len() == ordered.len(), + "Variant array has {} children but target Arrow type has {} fields", + ordered.len(), + fields.len() + ); + + (fields.clone(), arrays) + } else { + let mut fields = Vec::with_capacity(ordered.len()); + let mut arrays = Vec::with_capacity(ordered.len()); + + for (name, child) in ordered { + let arrow = child.clone().execute_arrow(None, ctx)?; + fields.push(Field::new( + name, + arrow.data_type().clone(), + child.dtype().is_nullable(), + )); + arrays.push(arrow); + } + + (Fields::from(fields), arrays) + }; + + Ok(Arc::new(ArrowStructArray::try_new(fields, arrays, nulls)?)) +} diff --git a/vortex-array/src/builtins.rs b/vortex-array/src/builtins.rs index ba3b8542eb7..9a9315cc805 100644 --- a/vortex-array/src/builtins.rs +++ b/vortex-array/src/builtins.rs @@ -33,6 +33,9 @@ use crate::scalar_fn::fns::list_contains::ListContains; use crate::scalar_fn::fns::mask::Mask; use crate::scalar_fn::fns::not::Not; use crate::scalar_fn::fns::operators::Operator; +use crate::scalar_fn::fns::variant_get::VariantGet; +use crate::scalar_fn::fns::variant_get::VariantGetOptions; +use crate::scalar_fn::fns::variant_get::VariantPath; use crate::scalar_fn::fns::zip::Zip; /// A collection of built-in scalar functions that can be applied to expressions or arrays. @@ -63,6 +66,9 @@ pub trait ExprBuiltins: Sized { /// Conditional selection: `result[i] = if mask[i] then if_true[i] else if_false[i]`. fn zip(&self, if_true: Expression, if_false: Expression) -> VortexResult; + /// Extract data by path and dtype from a variant expression. + fn variant_get(&self, path: Option, dtype: DType) -> VortexResult; + /// Apply a binary operator to this expression and another. fn binary(&self, rhs: Expression, op: Operator) -> VortexResult; } @@ -100,6 +106,10 @@ impl ExprBuiltins for Expression { Zip.try_new_expr(EmptyOptions, [if_true, if_false, self.clone()]) } + fn variant_get(&self, path: Option, dtype: DType) -> VortexResult { + VariantGet.try_new_expr(VariantGetOptions::new(path, dtype), [self.clone()]) + } + fn binary(&self, rhs: Expression, op: Operator) -> VortexResult { Binary.try_new_expr(op, [self.clone(), rhs]) } @@ -132,6 +142,9 @@ pub trait ArrayBuiltins: Sized { /// Check if a list contains a value. fn list_contains(&self, value: ArrayRef) -> VortexResult; + /// Extract data by path and dtype from a variant array. + fn variant_get(&self, path: Option, dtype: DType) -> VortexResult; + /// Apply a binary operator to this array and another. fn binary(&self, rhs: ArrayRef, op: Operator) -> VortexResult; @@ -202,6 +215,16 @@ impl ArrayBuiltins for ArrayRef { .optimize() } + fn variant_get(&self, path: Option, dtype: DType) -> VortexResult { + VariantGet + .try_new_array( + self.len(), + VariantGetOptions::new(path, dtype), + [self.clone()], + )? + .optimize() + } + fn binary(&self, rhs: ArrayRef, op: Operator) -> VortexResult { Binary .try_new_array(self.len(), op, [self.clone(), rhs])? diff --git a/vortex-array/src/expr/exprs.rs b/vortex-array/src/expr/exprs.rs index bc30ba86ec4..7a5c91f2100 100644 --- a/vortex-array/src/expr/exprs.rs +++ b/vortex-array/src/expr/exprs.rs @@ -45,6 +45,9 @@ use crate::scalar_fn::fns::pack::PackOptions; use crate::scalar_fn::fns::root::Root; use crate::scalar_fn::fns::select::FieldSelection; use crate::scalar_fn::fns::select::Select; +use crate::scalar_fn::fns::variant_get::VariantGet; +use crate::scalar_fn::fns::variant_get::VariantGetOptions; +use crate::scalar_fn::fns::variant_get::VariantPath; use crate::scalar_fn::fns::zip::Zip; // ---- Root ---- @@ -663,6 +666,13 @@ pub fn dynamic( ) } +// ---- VariantGet ---- + +/// Creates an expression that extracts data by path and dtype from a variant expression. +pub fn variant_get(path: Option, dtype: DType, child: Expression) -> Expression { + VariantGet.new_expr(VariantGetOptions::new(path, dtype), vec![child]) +} + // ---- ListContains ---- /// Creates an expression that checks if a value is contained in a list. diff --git a/vortex-array/src/scalar_fn/fns/mod.rs b/vortex-array/src/scalar_fn/fns/mod.rs index 94fc8fb0384..b0c7e7547e5 100644 --- a/vortex-array/src/scalar_fn/fns/mod.rs +++ b/vortex-array/src/scalar_fn/fns/mod.rs @@ -19,4 +19,5 @@ pub mod operators; pub mod pack; pub mod root; pub mod select; +pub mod variant_get; pub mod zip; diff --git a/vortex-array/src/scalar_fn/fns/variant_get.rs b/vortex-array/src/scalar_fn/fns/variant_get.rs new file mode 100644 index 00000000000..e89ceeddb35 --- /dev/null +++ b/vortex-array/src/scalar_fn/fns/variant_get.rs @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: Copyright the Vortex contributors + +use std::fmt; +use std::fmt::Formatter; + +use prost::Message; +use vortex_error::VortexResult; +use vortex_error::vortex_bail; +use vortex_error::vortex_err; +use vortex_proto::expr as pb; +use vortex_session::VortexSession; + +use crate::ArrayRef; +use crate::ExecutionCtx; +use crate::dtype::DType; +use crate::dtype::Nullability; +use crate::scalar_fn::Arity; +use crate::scalar_fn::ChildName; +use crate::scalar_fn::ExecutionArgs; +use crate::scalar_fn::ScalarFnId; +use crate::scalar_fn::ScalarFnVTable; + +#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)] +pub struct VariantPath {} + +impl VariantPath { + pub fn is_empty(&self) -> bool { + true + } +} + +/// Options for the `VariantGet` scalar function. +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct VariantGetOptions { + /// The variant field path to extract. + path: Option, + /// The expected return type. + dtype: DType, +} + +impl VariantGetOptions { + pub fn new(path: Option, dtype: DType) -> Self { + Self { path, dtype } + } + + pub fn path(&self) -> Option<&VariantPath> { + self.path.as_ref() + } + + pub fn dtype(&self) -> &DType { + &self.dtype + } +} + +impl fmt::Display for VariantGetOptions { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "variant_get({})", self.dtype) + } +} + +/// Scalar function that extracts data by path and dtype from variant arrays. +#[derive(Clone)] +pub struct VariantGet; + +impl ScalarFnVTable for VariantGet { + type Options = VariantGetOptions; + + fn id(&self) -> ScalarFnId { + ScalarFnId::from("vortex.variant_get") + } + + fn serialize(&self, instance: &Self::Options) -> VortexResult>> { + Ok(Some( + pb::VariantGetOpts { + dtype: Some(instance.dtype().try_into()?), + } + .encode_to_vec(), + )) + } + + fn deserialize(&self, metadata: &[u8], session: &VortexSession) -> VortexResult { + let opts = pb::VariantGetOpts::decode(metadata)?; + let dtype = DType::from_proto( + opts.dtype + .as_ref() + .ok_or_else(|| vortex_err!("VariantGetOpts missing dtype"))?, + session, + )?; + Ok(VariantGetOptions::new(None, dtype)) + } + + fn arity(&self, _options: &VariantGetOptions) -> Arity { + Arity::Exact(1) + } + + fn child_name(&self, _options: &Self::Options, child_idx: usize) -> ChildName { + match child_idx { + 0 => ChildName::from("input"), + _ => unreachable!( + "Invalid child index {} for VariantGet expression", + child_idx + ), + } + } + + fn fmt_sql( + &self, + options: &VariantGetOptions, + expr: &crate::expr::Expression, + f: &mut Formatter<'_>, + ) -> fmt::Result { + expr.children()[0].fmt_sql(f)?; + let _ = options; + Ok(()) + } + + fn return_dtype( + &self, + options: &VariantGetOptions, + _arg_dtypes: &[DType], + ) -> VortexResult { + // Always return nullable since Variant data is always nullable + Ok(options.dtype().with_nullability(Nullability::Nullable)) + } + + fn execute( + &self, + _options: &VariantGetOptions, + _args: &dyn ExecutionArgs, + _ctx: &mut ExecutionCtx, + ) -> VortexResult { + vortex_bail!( + "VariantGet should be pushed down via parent reduction rules, not executed directly" + ) + } + + fn is_null_sensitive(&self, _options: &VariantGetOptions) -> bool { + true + } + + fn is_fallible(&self, _options: &VariantGetOptions) -> bool { + false + } +} diff --git a/vortex-array/src/scalar_fn/session.rs b/vortex-array/src/scalar_fn/session.rs index eef759bf8e3..6553cbd29e3 100644 --- a/vortex-array/src/scalar_fn/session.rs +++ b/vortex-array/src/scalar_fn/session.rs @@ -23,6 +23,7 @@ use crate::scalar_fn::fns::not::Not; use crate::scalar_fn::fns::pack::Pack; use crate::scalar_fn::fns::root::Root; use crate::scalar_fn::fns::select::Select; +use crate::scalar_fn::fns::variant_get::VariantGet; /// Registry of scalar function vtables. /// Registry of scalar function vtables. @@ -67,6 +68,7 @@ impl Default for ScalarFnSession { this.register(Pack); this.register(Root); this.register(Select); + this.register(VariantGet); this } diff --git a/vortex-proto/proto/expr.proto b/vortex-proto/proto/expr.proto index 3b47db2a756..cae11d23e9a 100644 --- a/vortex-proto/proto/expr.proto +++ b/vortex-proto/proto/expr.proto @@ -89,3 +89,8 @@ message SelectOpts { message CaseWhenOpts { uint32 num_children = 1; } + +// Options for `vortex.variant_get` +message VariantGetOpts { + vortex.dtype.DType dtype = 1; +} diff --git a/vortex-proto/public-api.lock b/vortex-proto/public-api.lock index 3282170a2bf..1a1752a01c6 100644 --- a/vortex-proto/public-api.lock +++ b/vortex-proto/public-api.lock @@ -1152,6 +1152,34 @@ pub fn vortex_proto::expr::SelectOpts::clear(&mut self) pub fn vortex_proto::expr::SelectOpts::encoded_len(&self) -> usize +pub struct vortex_proto::expr::VariantGetOpts + +pub vortex_proto::expr::VariantGetOpts::dtype: core::option::Option + +impl core::clone::Clone for vortex_proto::expr::VariantGetOpts + +pub fn vortex_proto::expr::VariantGetOpts::clone(&self) -> vortex_proto::expr::VariantGetOpts + +impl core::cmp::PartialEq for vortex_proto::expr::VariantGetOpts + +pub fn vortex_proto::expr::VariantGetOpts::eq(&self, other: &vortex_proto::expr::VariantGetOpts) -> bool + +impl core::default::Default for vortex_proto::expr::VariantGetOpts + +pub fn vortex_proto::expr::VariantGetOpts::default() -> Self + +impl core::fmt::Debug for vortex_proto::expr::VariantGetOpts + +pub fn vortex_proto::expr::VariantGetOpts::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result + +impl core::marker::StructuralPartialEq for vortex_proto::expr::VariantGetOpts + +impl prost::message::Message for vortex_proto::expr::VariantGetOpts + +pub fn vortex_proto::expr::VariantGetOpts::clear(&mut self) + +pub fn vortex_proto::expr::VariantGetOpts::encoded_len(&self) -> usize + pub mod vortex_proto::scalar pub mod vortex_proto::scalar::scalar_value diff --git a/vortex-proto/src/generated/vortex.expr.rs b/vortex-proto/src/generated/vortex.expr.rs index 9bc61475e59..6bdf43eb3d8 100644 --- a/vortex-proto/src/generated/vortex.expr.rs +++ b/vortex-proto/src/generated/vortex.expr.rs @@ -155,3 +155,9 @@ pub struct CaseWhenOpts { #[prost(uint32, tag = "1")] pub num_children: u32, } +/// Options for `vortex.variant_get` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct VariantGetOpts { + #[prost(message, optional, tag = "1")] + pub dtype: ::core::option::Option, +} From 19a5bef1f668e469719f415c611241b10133ff56 Mon Sep 17 00:00:00 2001 From: Adam Gutglick Date: Wed, 18 Mar 2026 19:56:12 +0000 Subject: [PATCH 2/5] No expr for now Signed-off-by: Adam Gutglick --- vortex-array/public-api.lock | 452 ------------------ vortex-array/src/arrays/variant/vtable/mod.rs | 10 - .../src/arrays/variant/vtable/rules.rs | 38 -- vortex-array/src/builtins.rs | 23 - vortex-array/src/expr/exprs.rs | 10 - vortex-array/src/scalar_fn/fns/mod.rs | 1 - vortex-array/src/scalar_fn/fns/variant_get.rs | 145 ------ vortex-array/src/scalar_fn/session.rs | 2 - vortex-proto/proto/expr.proto | 5 - vortex-proto/public-api.lock | 28 -- vortex-proto/src/generated/vortex.expr.rs | 6 - 11 files changed, 720 deletions(-) delete mode 100644 vortex-array/src/arrays/variant/vtable/rules.rs delete mode 100644 vortex-array/src/scalar_fn/fns/variant_get.rs diff --git a/vortex-array/public-api.lock b/vortex-array/public-api.lock index c0de93de956..ea2e3619b1e 100644 --- a/vortex-array/public-api.lock +++ b/vortex-array/public-api.lock @@ -4708,120 +4708,6 @@ pub vortex_array::arrays::varbinview::VarBinViewArrayParts::validity: vortex_arr pub vortex_array::arrays::varbinview::VarBinViewArrayParts::views: vortex_array::buffer::BufferHandle -pub mod vortex_array::arrays::variant - -pub struct vortex_array::arrays::variant::Variant - -impl vortex_array::arrays::Variant - -pub const vortex_array::arrays::Variant::ID: vortex_array::vtable::ArrayId - -impl core::fmt::Debug for vortex_array::arrays::Variant - -pub fn vortex_array::arrays::Variant::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result - -impl vortex_array::vtable::OperationsVTable for vortex_array::arrays::Variant - -pub fn vortex_array::arrays::Variant::scalar_at(array: &::Array, index: usize) -> vortex_error::VortexResult - -impl vortex_array::vtable::VTable for vortex_array::arrays::Variant - -pub type vortex_array::arrays::Variant::Array = vortex_array::arrays::variant::VariantArray - -pub type vortex_array::arrays::Variant::Metadata = vortex_array::EmptyMetadata - -pub type vortex_array::arrays::Variant::OperationsVTable = vortex_array::arrays::Variant - -pub type vortex_array::arrays::Variant::ValidityVTable = vortex_array::arrays::Variant - -pub fn vortex_array::arrays::Variant::append_to_builder(array: &Self::Array, builder: &mut dyn vortex_array::builders::ArrayBuilder, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult<()> - -pub fn vortex_array::arrays::Variant::array_eq(array: &Self::Array, other: &Self::Array, precision: vortex_array::Precision) -> bool - -pub fn vortex_array::arrays::Variant::array_hash(array: &Self::Array, state: &mut H, precision: vortex_array::Precision) - -pub fn vortex_array::arrays::Variant::buffer(_array: &Self::Array, idx: usize) -> vortex_array::buffer::BufferHandle - -pub fn vortex_array::arrays::Variant::buffer_name(_array: &Self::Array, _idx: usize) -> core::option::Option - -pub fn vortex_array::arrays::Variant::build(dtype: &vortex_array::dtype::DType, len: usize, _metadata: &Self::Metadata, _buffers: &[vortex_array::buffer::BufferHandle], children: &dyn vortex_array::serde::ArrayChildren) -> vortex_error::VortexResult - -pub fn vortex_array::arrays::Variant::child(array: &Self::Array, idx: usize) -> vortex_array::ArrayRef - -pub fn vortex_array::arrays::Variant::child_name(_array: &Self::Array, idx: usize) -> alloc::string::String - -pub fn vortex_array::arrays::Variant::deserialize(_bytes: &[u8], _dtype: &vortex_array::dtype::DType, _len: usize, _buffers: &[vortex_array::buffer::BufferHandle], _session: &vortex_session::VortexSession) -> vortex_error::VortexResult - -pub fn vortex_array::arrays::Variant::dtype(array: &Self::Array) -> &vortex_array::dtype::DType - -pub fn vortex_array::arrays::Variant::execute(array: &Self::Array, _ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult - -pub fn vortex_array::arrays::Variant::execute_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult> - -pub fn vortex_array::arrays::Variant::id(_array: &Self::Array) -> vortex_array::vtable::ArrayId - -pub fn vortex_array::arrays::Variant::len(array: &Self::Array) -> usize - -pub fn vortex_array::arrays::Variant::metadata(_array: &Self::Array) -> vortex_error::VortexResult - -pub fn vortex_array::arrays::Variant::nbuffers(_array: &Self::Array) -> usize - -pub fn vortex_array::arrays::Variant::nchildren(_array: &Self::Array) -> usize - -pub fn vortex_array::arrays::Variant::reduce(array: &Self::Array) -> vortex_error::VortexResult> - -pub fn vortex_array::arrays::Variant::reduce_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize) -> vortex_error::VortexResult> - -pub fn vortex_array::arrays::Variant::serialize(_metadata: Self::Metadata) -> vortex_error::VortexResult>> - -pub fn vortex_array::arrays::Variant::stats(array: &Self::Array) -> vortex_array::stats::StatsSetRef<'_> - -pub fn vortex_array::arrays::Variant::with_children(array: &mut Self::Array, children: alloc::vec::Vec) -> vortex_error::VortexResult<()> - -impl vortex_array::vtable::ValidityVTable for vortex_array::arrays::Variant - -pub fn vortex_array::arrays::Variant::validity(array: &::Array) -> vortex_error::VortexResult - -pub struct vortex_array::arrays::variant::VariantArray - -impl vortex_array::arrays::variant::VariantArray - -pub fn vortex_array::arrays::variant::VariantArray::child(&self) -> &vortex_array::ArrayRef - -pub fn vortex_array::arrays::variant::VariantArray::new(child: vortex_array::ArrayRef) -> Self - -pub fn vortex_array::arrays::variant::VariantArray::new_nullable(child: vortex_array::ArrayRef, nullability: vortex_array::dtype::Nullability) -> Self - -impl vortex_array::arrays::variant::VariantArray - -pub fn vortex_array::arrays::variant::VariantArray::to_array(&self) -> vortex_array::ArrayRef - -impl core::clone::Clone for vortex_array::arrays::variant::VariantArray - -pub fn vortex_array::arrays::variant::VariantArray::clone(&self) -> vortex_array::arrays::variant::VariantArray - -impl core::convert::AsRef for vortex_array::arrays::variant::VariantArray - -pub fn vortex_array::arrays::variant::VariantArray::as_ref(&self) -> &dyn vortex_array::DynArray - -impl core::convert::From for vortex_array::ArrayRef - -pub fn vortex_array::ArrayRef::from(value: vortex_array::arrays::variant::VariantArray) -> vortex_array::ArrayRef - -impl core::fmt::Debug for vortex_array::arrays::variant::VariantArray - -pub fn vortex_array::arrays::variant::VariantArray::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result - -impl core::ops::deref::Deref for vortex_array::arrays::variant::VariantArray - -pub type vortex_array::arrays::variant::VariantArray::Target = dyn vortex_array::DynArray - -pub fn vortex_array::arrays::variant::VariantArray::deref(&self) -> &Self::Target - -impl vortex_array::IntoArray for vortex_array::arrays::variant::VariantArray - -pub fn vortex_array::arrays::variant::VariantArray::into_array(self) -> vortex_array::ArrayRef - pub struct vortex_array::arrays::Bool impl vortex_array::arrays::Bool @@ -7966,118 +7852,6 @@ impl<'a> core::iter::traits::collect::FromIterator pub fn vortex_array::arrays::VarBinViewArray::from_iter>>(iter: T) -> Self -pub struct vortex_array::arrays::Variant - -impl vortex_array::arrays::Variant - -pub const vortex_array::arrays::Variant::ID: vortex_array::vtable::ArrayId - -impl core::fmt::Debug for vortex_array::arrays::Variant - -pub fn vortex_array::arrays::Variant::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result - -impl vortex_array::vtable::OperationsVTable for vortex_array::arrays::Variant - -pub fn vortex_array::arrays::Variant::scalar_at(array: &::Array, index: usize) -> vortex_error::VortexResult - -impl vortex_array::vtable::VTable for vortex_array::arrays::Variant - -pub type vortex_array::arrays::Variant::Array = vortex_array::arrays::variant::VariantArray - -pub type vortex_array::arrays::Variant::Metadata = vortex_array::EmptyMetadata - -pub type vortex_array::arrays::Variant::OperationsVTable = vortex_array::arrays::Variant - -pub type vortex_array::arrays::Variant::ValidityVTable = vortex_array::arrays::Variant - -pub fn vortex_array::arrays::Variant::append_to_builder(array: &Self::Array, builder: &mut dyn vortex_array::builders::ArrayBuilder, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult<()> - -pub fn vortex_array::arrays::Variant::array_eq(array: &Self::Array, other: &Self::Array, precision: vortex_array::Precision) -> bool - -pub fn vortex_array::arrays::Variant::array_hash(array: &Self::Array, state: &mut H, precision: vortex_array::Precision) - -pub fn vortex_array::arrays::Variant::buffer(_array: &Self::Array, idx: usize) -> vortex_array::buffer::BufferHandle - -pub fn vortex_array::arrays::Variant::buffer_name(_array: &Self::Array, _idx: usize) -> core::option::Option - -pub fn vortex_array::arrays::Variant::build(dtype: &vortex_array::dtype::DType, len: usize, _metadata: &Self::Metadata, _buffers: &[vortex_array::buffer::BufferHandle], children: &dyn vortex_array::serde::ArrayChildren) -> vortex_error::VortexResult - -pub fn vortex_array::arrays::Variant::child(array: &Self::Array, idx: usize) -> vortex_array::ArrayRef - -pub fn vortex_array::arrays::Variant::child_name(_array: &Self::Array, idx: usize) -> alloc::string::String - -pub fn vortex_array::arrays::Variant::deserialize(_bytes: &[u8], _dtype: &vortex_array::dtype::DType, _len: usize, _buffers: &[vortex_array::buffer::BufferHandle], _session: &vortex_session::VortexSession) -> vortex_error::VortexResult - -pub fn vortex_array::arrays::Variant::dtype(array: &Self::Array) -> &vortex_array::dtype::DType - -pub fn vortex_array::arrays::Variant::execute(array: &Self::Array, _ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult - -pub fn vortex_array::arrays::Variant::execute_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult> - -pub fn vortex_array::arrays::Variant::id(_array: &Self::Array) -> vortex_array::vtable::ArrayId - -pub fn vortex_array::arrays::Variant::len(array: &Self::Array) -> usize - -pub fn vortex_array::arrays::Variant::metadata(_array: &Self::Array) -> vortex_error::VortexResult - -pub fn vortex_array::arrays::Variant::nbuffers(_array: &Self::Array) -> usize - -pub fn vortex_array::arrays::Variant::nchildren(_array: &Self::Array) -> usize - -pub fn vortex_array::arrays::Variant::reduce(array: &Self::Array) -> vortex_error::VortexResult> - -pub fn vortex_array::arrays::Variant::reduce_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize) -> vortex_error::VortexResult> - -pub fn vortex_array::arrays::Variant::serialize(_metadata: Self::Metadata) -> vortex_error::VortexResult>> - -pub fn vortex_array::arrays::Variant::stats(array: &Self::Array) -> vortex_array::stats::StatsSetRef<'_> - -pub fn vortex_array::arrays::Variant::with_children(array: &mut Self::Array, children: alloc::vec::Vec) -> vortex_error::VortexResult<()> - -impl vortex_array::vtable::ValidityVTable for vortex_array::arrays::Variant - -pub fn vortex_array::arrays::Variant::validity(array: &::Array) -> vortex_error::VortexResult - -pub struct vortex_array::arrays::VariantArray - -impl vortex_array::arrays::variant::VariantArray - -pub fn vortex_array::arrays::variant::VariantArray::child(&self) -> &vortex_array::ArrayRef - -pub fn vortex_array::arrays::variant::VariantArray::new(child: vortex_array::ArrayRef) -> Self - -pub fn vortex_array::arrays::variant::VariantArray::new_nullable(child: vortex_array::ArrayRef, nullability: vortex_array::dtype::Nullability) -> Self - -impl vortex_array::arrays::variant::VariantArray - -pub fn vortex_array::arrays::variant::VariantArray::to_array(&self) -> vortex_array::ArrayRef - -impl core::clone::Clone for vortex_array::arrays::variant::VariantArray - -pub fn vortex_array::arrays::variant::VariantArray::clone(&self) -> vortex_array::arrays::variant::VariantArray - -impl core::convert::AsRef for vortex_array::arrays::variant::VariantArray - -pub fn vortex_array::arrays::variant::VariantArray::as_ref(&self) -> &dyn vortex_array::DynArray - -impl core::convert::From for vortex_array::ArrayRef - -pub fn vortex_array::ArrayRef::from(value: vortex_array::arrays::variant::VariantArray) -> vortex_array::ArrayRef - -impl core::fmt::Debug for vortex_array::arrays::variant::VariantArray - -pub fn vortex_array::arrays::variant::VariantArray::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result - -impl core::ops::deref::Deref for vortex_array::arrays::variant::VariantArray - -pub type vortex_array::arrays::variant::VariantArray::Target = dyn vortex_array::DynArray - -pub fn vortex_array::arrays::variant::VariantArray::deref(&self) -> &Self::Target - -impl vortex_array::IntoArray for vortex_array::arrays::variant::VariantArray - -pub fn vortex_array::arrays::variant::VariantArray::into_array(self) -> vortex_array::ArrayRef - pub mod vortex_array::arrow pub mod vortex_array::arrow::bool @@ -9586,8 +9360,6 @@ pub fn vortex_array::builtins::ArrayBuiltins::mask(self, mask: vortex_array::Arr pub fn vortex_array::builtins::ArrayBuiltins::not(&self) -> vortex_error::VortexResult -pub fn vortex_array::builtins::ArrayBuiltins::variant_get(&self, path: core::option::Option, dtype: vortex_array::dtype::DType) -> vortex_error::VortexResult - pub fn vortex_array::builtins::ArrayBuiltins::zip(&self, if_true: vortex_array::ArrayRef, if_false: vortex_array::ArrayRef) -> vortex_error::VortexResult impl vortex_array::builtins::ArrayBuiltins for vortex_array::ArrayRef @@ -9610,8 +9382,6 @@ pub fn vortex_array::ArrayRef::mask(self, mask: vortex_array::ArrayRef) -> vorte pub fn vortex_array::ArrayRef::not(&self) -> vortex_error::VortexResult -pub fn vortex_array::ArrayRef::variant_get(&self, path: core::option::Option, dtype: vortex_array::dtype::DType) -> vortex_error::VortexResult - pub fn vortex_array::ArrayRef::zip(&self, if_true: vortex_array::ArrayRef, if_false: vortex_array::ArrayRef) -> vortex_error::VortexResult pub trait vortex_array::builtins::ExprBuiltins: core::marker::Sized @@ -9632,8 +9402,6 @@ pub fn vortex_array::builtins::ExprBuiltins::mask(&self, mask: vortex_array::exp pub fn vortex_array::builtins::ExprBuiltins::not(&self) -> vortex_error::VortexResult -pub fn vortex_array::builtins::ExprBuiltins::variant_get(&self, path: core::option::Option, dtype: vortex_array::dtype::DType) -> vortex_error::VortexResult - pub fn vortex_array::builtins::ExprBuiltins::zip(&self, if_true: vortex_array::expr::Expression, if_false: vortex_array::expr::Expression) -> vortex_error::VortexResult impl vortex_array::builtins::ExprBuiltins for vortex_array::expr::Expression @@ -9654,8 +9422,6 @@ pub fn vortex_array::expr::Expression::mask(&self, mask: vortex_array::expr::Exp pub fn vortex_array::expr::Expression::not(&self) -> vortex_error::VortexResult -pub fn vortex_array::expr::Expression::variant_get(&self, path: core::option::Option, dtype: vortex_array::dtype::DType) -> vortex_error::VortexResult - pub fn vortex_array::expr::Expression::zip(&self, if_true: vortex_array::expr::Expression, if_false: vortex_array::expr::Expression) -> vortex_error::VortexResult pub mod vortex_array::compute @@ -13910,8 +13676,6 @@ pub fn vortex_array::expr::Expression::mask(&self, mask: vortex_array::expr::Exp pub fn vortex_array::expr::Expression::not(&self) -> vortex_error::VortexResult -pub fn vortex_array::expr::Expression::variant_get(&self, path: core::option::Option, dtype: vortex_array::dtype::DType) -> vortex_error::VortexResult - pub fn vortex_array::expr::Expression::zip(&self, if_true: vortex_array::expr::Expression, if_false: vortex_array::expr::Expression) -> vortex_error::VortexResult impl vortex_array::expr::VortexExprExt for vortex_array::expr::Expression @@ -14050,8 +13814,6 @@ pub fn vortex_array::expr::select_exclude(fields: impl core::convert::Into alloc::vec::Vec -pub fn vortex_array::expr::variant_get(path: core::option::Option, dtype: vortex_array::dtype::DType, child: vortex_array::expr::Expression) -> vortex_array::expr::Expression - pub fn vortex_array::expr::zip_expr(mask: vortex_array::expr::Expression, if_true: vortex_array::expr::Expression, if_false: vortex_array::expr::Expression) -> vortex_array::expr::Expression pub type vortex_array::expr::Annotations<'a, A> = vortex_utils::aliases::hash_map::HashMap<&'a vortex_array::expr::Expression, vortex_utils::aliases::hash_set::HashSet> @@ -18678,116 +18440,6 @@ pub fn vortex_array::scalar_fn::fns::select::Select::stat_falsification(&self, o pub fn vortex_array::scalar_fn::fns::select::Select::validity(&self, options: &Self::Options, expression: &vortex_array::expr::Expression) -> vortex_error::VortexResult> -pub mod vortex_array::scalar_fn::fns::variant_get - -pub struct vortex_array::scalar_fn::fns::variant_get::VariantGet - -impl core::clone::Clone for vortex_array::scalar_fn::fns::variant_get::VariantGet - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::clone(&self) -> vortex_array::scalar_fn::fns::variant_get::VariantGet - -impl vortex_array::scalar_fn::ScalarFnVTable for vortex_array::scalar_fn::fns::variant_get::VariantGet - -pub type vortex_array::scalar_fn::fns::variant_get::VariantGet::Options = vortex_array::scalar_fn::fns::variant_get::VariantGetOptions - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::arity(&self, _options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions) -> vortex_array::scalar_fn::Arity - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::child_name(&self, _options: &Self::Options, child_idx: usize) -> vortex_array::scalar_fn::ChildName - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::coerce_args(&self, options: &Self::Options, args: &[vortex_array::dtype::DType]) -> vortex_error::VortexResult> - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::deserialize(&self, metadata: &[u8], session: &vortex_session::VortexSession) -> vortex_error::VortexResult - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::execute(&self, _options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions, _args: &dyn vortex_array::scalar_fn::ExecutionArgs, _ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::fmt_sql(&self, options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions, expr: &vortex_array::expr::Expression, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::id(&self) -> vortex_array::scalar_fn::ScalarFnId - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::is_fallible(&self, _options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions) -> bool - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::is_null_sensitive(&self, _options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions) -> bool - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::reduce(&self, options: &Self::Options, node: &dyn vortex_array::scalar_fn::ReduceNode, ctx: &dyn vortex_array::scalar_fn::ReduceCtx) -> vortex_error::VortexResult> - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::return_dtype(&self, options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions, _arg_dtypes: &[vortex_array::dtype::DType]) -> vortex_error::VortexResult - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::serialize(&self, instance: &Self::Options) -> vortex_error::VortexResult>> - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::simplify(&self, options: &Self::Options, expr: &vortex_array::expr::Expression, ctx: &dyn vortex_array::scalar_fn::SimplifyCtx) -> vortex_error::VortexResult> - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::simplify_untyped(&self, options: &Self::Options, expr: &vortex_array::expr::Expression) -> vortex_error::VortexResult> - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::stat_expression(&self, options: &Self::Options, expr: &vortex_array::expr::Expression, stat: vortex_array::expr::stats::Stat, catalog: &dyn vortex_array::expr::pruning::StatsCatalog) -> core::option::Option - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::stat_falsification(&self, options: &Self::Options, expr: &vortex_array::expr::Expression, catalog: &dyn vortex_array::expr::pruning::StatsCatalog) -> core::option::Option - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::validity(&self, options: &Self::Options, expression: &vortex_array::expr::Expression) -> vortex_error::VortexResult> - -pub struct vortex_array::scalar_fn::fns::variant_get::VariantGetOptions - -impl vortex_array::scalar_fn::fns::variant_get::VariantGetOptions - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGetOptions::dtype(&self) -> &vortex_array::dtype::DType - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGetOptions::new(path: core::option::Option, dtype: vortex_array::dtype::DType) -> Self - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGetOptions::path(&self) -> core::option::Option<&vortex_array::scalar_fn::fns::variant_get::VariantPath> - -impl core::clone::Clone for vortex_array::scalar_fn::fns::variant_get::VariantGetOptions - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGetOptions::clone(&self) -> vortex_array::scalar_fn::fns::variant_get::VariantGetOptions - -impl core::cmp::Eq for vortex_array::scalar_fn::fns::variant_get::VariantGetOptions - -impl core::cmp::PartialEq for vortex_array::scalar_fn::fns::variant_get::VariantGetOptions - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGetOptions::eq(&self, other: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions) -> bool - -impl core::fmt::Debug for vortex_array::scalar_fn::fns::variant_get::VariantGetOptions - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGetOptions::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result - -impl core::fmt::Display for vortex_array::scalar_fn::fns::variant_get::VariantGetOptions - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGetOptions::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result - -impl core::hash::Hash for vortex_array::scalar_fn::fns::variant_get::VariantGetOptions - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGetOptions::hash<__H: core::hash::Hasher>(&self, state: &mut __H) - -impl core::marker::StructuralPartialEq for vortex_array::scalar_fn::fns::variant_get::VariantGetOptions - -pub struct vortex_array::scalar_fn::fns::variant_get::VariantPath - -impl vortex_array::scalar_fn::fns::variant_get::VariantPath - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantPath::is_empty(&self) -> bool - -impl core::clone::Clone for vortex_array::scalar_fn::fns::variant_get::VariantPath - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantPath::clone(&self) -> vortex_array::scalar_fn::fns::variant_get::VariantPath - -impl core::cmp::Eq for vortex_array::scalar_fn::fns::variant_get::VariantPath - -impl core::cmp::PartialEq for vortex_array::scalar_fn::fns::variant_get::VariantPath - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantPath::eq(&self, other: &vortex_array::scalar_fn::fns::variant_get::VariantPath) -> bool - -impl core::default::Default for vortex_array::scalar_fn::fns::variant_get::VariantPath - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantPath::default() -> vortex_array::scalar_fn::fns::variant_get::VariantPath - -impl core::fmt::Debug for vortex_array::scalar_fn::fns::variant_get::VariantPath - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantPath::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result - -impl core::hash::Hash for vortex_array::scalar_fn::fns::variant_get::VariantPath - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantPath::hash<__H: core::hash::Hasher>(&self, state: &mut __H) - -impl core::marker::StructuralPartialEq for vortex_array::scalar_fn::fns::variant_get::VariantPath - pub mod vortex_array::scalar_fn::fns::zip pub struct vortex_array::scalar_fn::fns::zip::Zip @@ -19860,44 +19512,6 @@ pub fn vortex_array::scalar_fn::fns::select::Select::stat_falsification(&self, o pub fn vortex_array::scalar_fn::fns::select::Select::validity(&self, options: &Self::Options, expression: &vortex_array::expr::Expression) -> vortex_error::VortexResult> -impl vortex_array::scalar_fn::ScalarFnVTable for vortex_array::scalar_fn::fns::variant_get::VariantGet - -pub type vortex_array::scalar_fn::fns::variant_get::VariantGet::Options = vortex_array::scalar_fn::fns::variant_get::VariantGetOptions - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::arity(&self, _options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions) -> vortex_array::scalar_fn::Arity - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::child_name(&self, _options: &Self::Options, child_idx: usize) -> vortex_array::scalar_fn::ChildName - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::coerce_args(&self, options: &Self::Options, args: &[vortex_array::dtype::DType]) -> vortex_error::VortexResult> - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::deserialize(&self, metadata: &[u8], session: &vortex_session::VortexSession) -> vortex_error::VortexResult - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::execute(&self, _options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions, _args: &dyn vortex_array::scalar_fn::ExecutionArgs, _ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::fmt_sql(&self, options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions, expr: &vortex_array::expr::Expression, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::id(&self) -> vortex_array::scalar_fn::ScalarFnId - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::is_fallible(&self, _options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions) -> bool - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::is_null_sensitive(&self, _options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions) -> bool - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::reduce(&self, options: &Self::Options, node: &dyn vortex_array::scalar_fn::ReduceNode, ctx: &dyn vortex_array::scalar_fn::ReduceCtx) -> vortex_error::VortexResult> - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::return_dtype(&self, options: &vortex_array::scalar_fn::fns::variant_get::VariantGetOptions, _arg_dtypes: &[vortex_array::dtype::DType]) -> vortex_error::VortexResult - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::serialize(&self, instance: &Self::Options) -> vortex_error::VortexResult>> - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::simplify(&self, options: &Self::Options, expr: &vortex_array::expr::Expression, ctx: &dyn vortex_array::scalar_fn::SimplifyCtx) -> vortex_error::VortexResult> - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::simplify_untyped(&self, options: &Self::Options, expr: &vortex_array::expr::Expression) -> vortex_error::VortexResult> - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::stat_expression(&self, options: &Self::Options, expr: &vortex_array::expr::Expression, stat: vortex_array::expr::stats::Stat, catalog: &dyn vortex_array::expr::pruning::StatsCatalog) -> core::option::Option - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::stat_falsification(&self, options: &Self::Options, expr: &vortex_array::expr::Expression, catalog: &dyn vortex_array::expr::pruning::StatsCatalog) -> core::option::Option - -pub fn vortex_array::scalar_fn::fns::variant_get::VariantGet::validity(&self, options: &Self::Options, expression: &vortex_array::expr::Expression) -> vortex_error::VortexResult> - impl vortex_array::scalar_fn::ScalarFnVTable for vortex_array::scalar_fn::fns::zip::Zip pub type vortex_array::scalar_fn::fns::zip::Zip::Options = vortex_array::scalar_fn::EmptyOptions @@ -20806,10 +20420,6 @@ impl vortex_array::vtable::OperationsVTable fo pub fn vortex_array::arrays::VarBinView::scalar_at(array: &vortex_array::arrays::VarBinViewArray, index: usize) -> vortex_error::VortexResult -impl vortex_array::vtable::OperationsVTable for vortex_array::arrays::Variant - -pub fn vortex_array::arrays::Variant::scalar_at(array: &::Array, index: usize) -> vortex_error::VortexResult - impl vortex_array::vtable::OperationsVTable for vortex_array::arrays::dict::Dict pub fn vortex_array::arrays::dict::Dict::scalar_at(array: &vortex_array::arrays::dict::DictArray, index: usize) -> vortex_error::VortexResult @@ -21694,60 +21304,6 @@ pub fn vortex_array::arrays::VarBinView::stats(array: &vortex_array::arrays::Var pub fn vortex_array::arrays::VarBinView::with_children(array: &mut Self::Array, children: alloc::vec::Vec) -> vortex_error::VortexResult<()> -impl vortex_array::vtable::VTable for vortex_array::arrays::Variant - -pub type vortex_array::arrays::Variant::Array = vortex_array::arrays::variant::VariantArray - -pub type vortex_array::arrays::Variant::Metadata = vortex_array::EmptyMetadata - -pub type vortex_array::arrays::Variant::OperationsVTable = vortex_array::arrays::Variant - -pub type vortex_array::arrays::Variant::ValidityVTable = vortex_array::arrays::Variant - -pub fn vortex_array::arrays::Variant::append_to_builder(array: &Self::Array, builder: &mut dyn vortex_array::builders::ArrayBuilder, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult<()> - -pub fn vortex_array::arrays::Variant::array_eq(array: &Self::Array, other: &Self::Array, precision: vortex_array::Precision) -> bool - -pub fn vortex_array::arrays::Variant::array_hash(array: &Self::Array, state: &mut H, precision: vortex_array::Precision) - -pub fn vortex_array::arrays::Variant::buffer(_array: &Self::Array, idx: usize) -> vortex_array::buffer::BufferHandle - -pub fn vortex_array::arrays::Variant::buffer_name(_array: &Self::Array, _idx: usize) -> core::option::Option - -pub fn vortex_array::arrays::Variant::build(dtype: &vortex_array::dtype::DType, len: usize, _metadata: &Self::Metadata, _buffers: &[vortex_array::buffer::BufferHandle], children: &dyn vortex_array::serde::ArrayChildren) -> vortex_error::VortexResult - -pub fn vortex_array::arrays::Variant::child(array: &Self::Array, idx: usize) -> vortex_array::ArrayRef - -pub fn vortex_array::arrays::Variant::child_name(_array: &Self::Array, idx: usize) -> alloc::string::String - -pub fn vortex_array::arrays::Variant::deserialize(_bytes: &[u8], _dtype: &vortex_array::dtype::DType, _len: usize, _buffers: &[vortex_array::buffer::BufferHandle], _session: &vortex_session::VortexSession) -> vortex_error::VortexResult - -pub fn vortex_array::arrays::Variant::dtype(array: &Self::Array) -> &vortex_array::dtype::DType - -pub fn vortex_array::arrays::Variant::execute(array: &Self::Array, _ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult - -pub fn vortex_array::arrays::Variant::execute_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult> - -pub fn vortex_array::arrays::Variant::id(_array: &Self::Array) -> vortex_array::vtable::ArrayId - -pub fn vortex_array::arrays::Variant::len(array: &Self::Array) -> usize - -pub fn vortex_array::arrays::Variant::metadata(_array: &Self::Array) -> vortex_error::VortexResult - -pub fn vortex_array::arrays::Variant::nbuffers(_array: &Self::Array) -> usize - -pub fn vortex_array::arrays::Variant::nchildren(_array: &Self::Array) -> usize - -pub fn vortex_array::arrays::Variant::reduce(array: &Self::Array) -> vortex_error::VortexResult> - -pub fn vortex_array::arrays::Variant::reduce_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize) -> vortex_error::VortexResult> - -pub fn vortex_array::arrays::Variant::serialize(_metadata: Self::Metadata) -> vortex_error::VortexResult>> - -pub fn vortex_array::arrays::Variant::stats(array: &Self::Array) -> vortex_array::stats::StatsSetRef<'_> - -pub fn vortex_array::arrays::Variant::with_children(array: &mut Self::Array, children: alloc::vec::Vec) -> vortex_error::VortexResult<()> - impl vortex_array::vtable::VTable for vortex_array::arrays::dict::Dict pub type vortex_array::arrays::dict::Dict::Array = vortex_array::arrays::dict::DictArray @@ -22048,10 +21604,6 @@ impl vortex_array::vtable::ValidityVTable for vort pub fn vortex_array::arrays::Shared::validity(array: &vortex_array::arrays::SharedArray) -> vortex_error::VortexResult -impl vortex_array::vtable::ValidityVTable for vortex_array::arrays::Variant - -pub fn vortex_array::arrays::Variant::validity(array: &::Array) -> vortex_error::VortexResult - impl vortex_array::vtable::ValidityVTable for vortex_array::arrays::dict::Dict pub fn vortex_array::arrays::dict::Dict::validity(array: &vortex_array::arrays::dict::DictArray) -> vortex_error::VortexResult @@ -23120,10 +22672,6 @@ impl vortex_array::IntoArray for vortex_array::arrays::slice::SliceArray pub fn vortex_array::arrays::slice::SliceArray::into_array(self) -> vortex_array::ArrayRef -impl vortex_array::IntoArray for vortex_array::arrays::variant::VariantArray - -pub fn vortex_array::arrays::variant::VariantArray::into_array(self) -> vortex_array::ArrayRef - impl vortex_array::IntoArray for vortex_buffer::bit::buf::BitBuffer pub fn vortex_buffer::bit::buf::BitBuffer::into_array(self) -> vortex_array::ArrayRef diff --git a/vortex-array/src/arrays/variant/vtable/mod.rs b/vortex-array/src/arrays/variant/vtable/mod.rs index 590c3b74e9f..11e1d4c0a86 100644 --- a/vortex-array/src/arrays/variant/vtable/mod.rs +++ b/vortex-array/src/arrays/variant/vtable/mod.rs @@ -2,7 +2,6 @@ // SPDX-FileCopyrightText: Copyright the Vortex contributors mod operations; -mod rules; mod validity; use std::hash::Hasher; @@ -12,7 +11,6 @@ use vortex_error::VortexResult; use vortex_error::vortex_ensure; use vortex_error::vortex_panic; -use self::rules::PARENT_RULES; use crate::ArrayEq; use crate::ArrayHash; use crate::ArrayRef; @@ -156,12 +154,4 @@ impl VTable for Variant { // VariantArray is the canonical variant representation. Ok(ExecutionStep::done(array.clone().into_array())) } - - fn reduce_parent( - array: &Self::Array, - parent: &ArrayRef, - child_idx: usize, - ) -> VortexResult> { - PARENT_RULES.evaluate(array, parent, child_idx) - } } diff --git a/vortex-array/src/arrays/variant/vtable/rules.rs b/vortex-array/src/arrays/variant/vtable/rules.rs deleted file mode 100644 index d0786ec8b81..00000000000 --- a/vortex-array/src/arrays/variant/vtable/rules.rs +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: Copyright the Vortex contributors - -use vortex_error::VortexResult; - -use crate::ArrayRef; -use crate::arrays::VariantArray; -use crate::arrays::scalar_fn::ExactScalarFn; -use crate::arrays::scalar_fn::ScalarFnArrayView; -use crate::arrays::variant::vtable::Variant; -use crate::builtins::ArrayBuiltins; -use crate::optimizer::rules::ArrayParentReduceRule; -use crate::optimizer::rules::ParentRuleSet; -use crate::scalar_fn::fns::variant_get::VariantGet; - -pub(crate) const PARENT_RULES: ParentRuleSet = - ParentRuleSet::new(&[ParentRuleSet::lift(&VariantGetPushDownRule)]); - -/// Rule to push VariantGet through VariantArray to its child encoding. -#[derive(Debug)] -struct VariantGetPushDownRule; - -impl ArrayParentReduceRule for VariantGetPushDownRule { - type Parent = ExactScalarFn; - - fn reduce_parent( - &self, - array: &VariantArray, - parent: ScalarFnArrayView<'_, VariantGet>, - _child_idx: usize, - ) -> VortexResult> { - let options = parent.options; - Ok(Some(array.child().variant_get( - options.path().cloned(), - options.dtype().clone(), - )?)) - } -} diff --git a/vortex-array/src/builtins.rs b/vortex-array/src/builtins.rs index 9a9315cc805..ba3b8542eb7 100644 --- a/vortex-array/src/builtins.rs +++ b/vortex-array/src/builtins.rs @@ -33,9 +33,6 @@ use crate::scalar_fn::fns::list_contains::ListContains; use crate::scalar_fn::fns::mask::Mask; use crate::scalar_fn::fns::not::Not; use crate::scalar_fn::fns::operators::Operator; -use crate::scalar_fn::fns::variant_get::VariantGet; -use crate::scalar_fn::fns::variant_get::VariantGetOptions; -use crate::scalar_fn::fns::variant_get::VariantPath; use crate::scalar_fn::fns::zip::Zip; /// A collection of built-in scalar functions that can be applied to expressions or arrays. @@ -66,9 +63,6 @@ pub trait ExprBuiltins: Sized { /// Conditional selection: `result[i] = if mask[i] then if_true[i] else if_false[i]`. fn zip(&self, if_true: Expression, if_false: Expression) -> VortexResult; - /// Extract data by path and dtype from a variant expression. - fn variant_get(&self, path: Option, dtype: DType) -> VortexResult; - /// Apply a binary operator to this expression and another. fn binary(&self, rhs: Expression, op: Operator) -> VortexResult; } @@ -106,10 +100,6 @@ impl ExprBuiltins for Expression { Zip.try_new_expr(EmptyOptions, [if_true, if_false, self.clone()]) } - fn variant_get(&self, path: Option, dtype: DType) -> VortexResult { - VariantGet.try_new_expr(VariantGetOptions::new(path, dtype), [self.clone()]) - } - fn binary(&self, rhs: Expression, op: Operator) -> VortexResult { Binary.try_new_expr(op, [self.clone(), rhs]) } @@ -142,9 +132,6 @@ pub trait ArrayBuiltins: Sized { /// Check if a list contains a value. fn list_contains(&self, value: ArrayRef) -> VortexResult; - /// Extract data by path and dtype from a variant array. - fn variant_get(&self, path: Option, dtype: DType) -> VortexResult; - /// Apply a binary operator to this array and another. fn binary(&self, rhs: ArrayRef, op: Operator) -> VortexResult; @@ -215,16 +202,6 @@ impl ArrayBuiltins for ArrayRef { .optimize() } - fn variant_get(&self, path: Option, dtype: DType) -> VortexResult { - VariantGet - .try_new_array( - self.len(), - VariantGetOptions::new(path, dtype), - [self.clone()], - )? - .optimize() - } - fn binary(&self, rhs: ArrayRef, op: Operator) -> VortexResult { Binary .try_new_array(self.len(), op, [self.clone(), rhs])? diff --git a/vortex-array/src/expr/exprs.rs b/vortex-array/src/expr/exprs.rs index 7a5c91f2100..bc30ba86ec4 100644 --- a/vortex-array/src/expr/exprs.rs +++ b/vortex-array/src/expr/exprs.rs @@ -45,9 +45,6 @@ use crate::scalar_fn::fns::pack::PackOptions; use crate::scalar_fn::fns::root::Root; use crate::scalar_fn::fns::select::FieldSelection; use crate::scalar_fn::fns::select::Select; -use crate::scalar_fn::fns::variant_get::VariantGet; -use crate::scalar_fn::fns::variant_get::VariantGetOptions; -use crate::scalar_fn::fns::variant_get::VariantPath; use crate::scalar_fn::fns::zip::Zip; // ---- Root ---- @@ -666,13 +663,6 @@ pub fn dynamic( ) } -// ---- VariantGet ---- - -/// Creates an expression that extracts data by path and dtype from a variant expression. -pub fn variant_get(path: Option, dtype: DType, child: Expression) -> Expression { - VariantGet.new_expr(VariantGetOptions::new(path, dtype), vec![child]) -} - // ---- ListContains ---- /// Creates an expression that checks if a value is contained in a list. diff --git a/vortex-array/src/scalar_fn/fns/mod.rs b/vortex-array/src/scalar_fn/fns/mod.rs index b0c7e7547e5..94fc8fb0384 100644 --- a/vortex-array/src/scalar_fn/fns/mod.rs +++ b/vortex-array/src/scalar_fn/fns/mod.rs @@ -19,5 +19,4 @@ pub mod operators; pub mod pack; pub mod root; pub mod select; -pub mod variant_get; pub mod zip; diff --git a/vortex-array/src/scalar_fn/fns/variant_get.rs b/vortex-array/src/scalar_fn/fns/variant_get.rs deleted file mode 100644 index e89ceeddb35..00000000000 --- a/vortex-array/src/scalar_fn/fns/variant_get.rs +++ /dev/null @@ -1,145 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: Copyright the Vortex contributors - -use std::fmt; -use std::fmt::Formatter; - -use prost::Message; -use vortex_error::VortexResult; -use vortex_error::vortex_bail; -use vortex_error::vortex_err; -use vortex_proto::expr as pb; -use vortex_session::VortexSession; - -use crate::ArrayRef; -use crate::ExecutionCtx; -use crate::dtype::DType; -use crate::dtype::Nullability; -use crate::scalar_fn::Arity; -use crate::scalar_fn::ChildName; -use crate::scalar_fn::ExecutionArgs; -use crate::scalar_fn::ScalarFnId; -use crate::scalar_fn::ScalarFnVTable; - -#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)] -pub struct VariantPath {} - -impl VariantPath { - pub fn is_empty(&self) -> bool { - true - } -} - -/// Options for the `VariantGet` scalar function. -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct VariantGetOptions { - /// The variant field path to extract. - path: Option, - /// The expected return type. - dtype: DType, -} - -impl VariantGetOptions { - pub fn new(path: Option, dtype: DType) -> Self { - Self { path, dtype } - } - - pub fn path(&self) -> Option<&VariantPath> { - self.path.as_ref() - } - - pub fn dtype(&self) -> &DType { - &self.dtype - } -} - -impl fmt::Display for VariantGetOptions { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "variant_get({})", self.dtype) - } -} - -/// Scalar function that extracts data by path and dtype from variant arrays. -#[derive(Clone)] -pub struct VariantGet; - -impl ScalarFnVTable for VariantGet { - type Options = VariantGetOptions; - - fn id(&self) -> ScalarFnId { - ScalarFnId::from("vortex.variant_get") - } - - fn serialize(&self, instance: &Self::Options) -> VortexResult>> { - Ok(Some( - pb::VariantGetOpts { - dtype: Some(instance.dtype().try_into()?), - } - .encode_to_vec(), - )) - } - - fn deserialize(&self, metadata: &[u8], session: &VortexSession) -> VortexResult { - let opts = pb::VariantGetOpts::decode(metadata)?; - let dtype = DType::from_proto( - opts.dtype - .as_ref() - .ok_or_else(|| vortex_err!("VariantGetOpts missing dtype"))?, - session, - )?; - Ok(VariantGetOptions::new(None, dtype)) - } - - fn arity(&self, _options: &VariantGetOptions) -> Arity { - Arity::Exact(1) - } - - fn child_name(&self, _options: &Self::Options, child_idx: usize) -> ChildName { - match child_idx { - 0 => ChildName::from("input"), - _ => unreachable!( - "Invalid child index {} for VariantGet expression", - child_idx - ), - } - } - - fn fmt_sql( - &self, - options: &VariantGetOptions, - expr: &crate::expr::Expression, - f: &mut Formatter<'_>, - ) -> fmt::Result { - expr.children()[0].fmt_sql(f)?; - let _ = options; - Ok(()) - } - - fn return_dtype( - &self, - options: &VariantGetOptions, - _arg_dtypes: &[DType], - ) -> VortexResult { - // Always return nullable since Variant data is always nullable - Ok(options.dtype().with_nullability(Nullability::Nullable)) - } - - fn execute( - &self, - _options: &VariantGetOptions, - _args: &dyn ExecutionArgs, - _ctx: &mut ExecutionCtx, - ) -> VortexResult { - vortex_bail!( - "VariantGet should be pushed down via parent reduction rules, not executed directly" - ) - } - - fn is_null_sensitive(&self, _options: &VariantGetOptions) -> bool { - true - } - - fn is_fallible(&self, _options: &VariantGetOptions) -> bool { - false - } -} diff --git a/vortex-array/src/scalar_fn/session.rs b/vortex-array/src/scalar_fn/session.rs index 6553cbd29e3..eef759bf8e3 100644 --- a/vortex-array/src/scalar_fn/session.rs +++ b/vortex-array/src/scalar_fn/session.rs @@ -23,7 +23,6 @@ use crate::scalar_fn::fns::not::Not; use crate::scalar_fn::fns::pack::Pack; use crate::scalar_fn::fns::root::Root; use crate::scalar_fn::fns::select::Select; -use crate::scalar_fn::fns::variant_get::VariantGet; /// Registry of scalar function vtables. /// Registry of scalar function vtables. @@ -68,7 +67,6 @@ impl Default for ScalarFnSession { this.register(Pack); this.register(Root); this.register(Select); - this.register(VariantGet); this } diff --git a/vortex-proto/proto/expr.proto b/vortex-proto/proto/expr.proto index cae11d23e9a..3b47db2a756 100644 --- a/vortex-proto/proto/expr.proto +++ b/vortex-proto/proto/expr.proto @@ -89,8 +89,3 @@ message SelectOpts { message CaseWhenOpts { uint32 num_children = 1; } - -// Options for `vortex.variant_get` -message VariantGetOpts { - vortex.dtype.DType dtype = 1; -} diff --git a/vortex-proto/public-api.lock b/vortex-proto/public-api.lock index 1a1752a01c6..3282170a2bf 100644 --- a/vortex-proto/public-api.lock +++ b/vortex-proto/public-api.lock @@ -1152,34 +1152,6 @@ pub fn vortex_proto::expr::SelectOpts::clear(&mut self) pub fn vortex_proto::expr::SelectOpts::encoded_len(&self) -> usize -pub struct vortex_proto::expr::VariantGetOpts - -pub vortex_proto::expr::VariantGetOpts::dtype: core::option::Option - -impl core::clone::Clone for vortex_proto::expr::VariantGetOpts - -pub fn vortex_proto::expr::VariantGetOpts::clone(&self) -> vortex_proto::expr::VariantGetOpts - -impl core::cmp::PartialEq for vortex_proto::expr::VariantGetOpts - -pub fn vortex_proto::expr::VariantGetOpts::eq(&self, other: &vortex_proto::expr::VariantGetOpts) -> bool - -impl core::default::Default for vortex_proto::expr::VariantGetOpts - -pub fn vortex_proto::expr::VariantGetOpts::default() -> Self - -impl core::fmt::Debug for vortex_proto::expr::VariantGetOpts - -pub fn vortex_proto::expr::VariantGetOpts::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result - -impl core::marker::StructuralPartialEq for vortex_proto::expr::VariantGetOpts - -impl prost::message::Message for vortex_proto::expr::VariantGetOpts - -pub fn vortex_proto::expr::VariantGetOpts::clear(&mut self) - -pub fn vortex_proto::expr::VariantGetOpts::encoded_len(&self) -> usize - pub mod vortex_proto::scalar pub mod vortex_proto::scalar::scalar_value diff --git a/vortex-proto/src/generated/vortex.expr.rs b/vortex-proto/src/generated/vortex.expr.rs index 6bdf43eb3d8..9bc61475e59 100644 --- a/vortex-proto/src/generated/vortex.expr.rs +++ b/vortex-proto/src/generated/vortex.expr.rs @@ -155,9 +155,3 @@ pub struct CaseWhenOpts { #[prost(uint32, tag = "1")] pub num_children: u32, } -/// Options for `vortex.variant_get` -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct VariantGetOpts { - #[prost(message, optional, tag = "1")] - pub dtype: ::core::option::Option, -} From fdc30cf956cd02576a47804a1427cfd2c86deb32 Mon Sep 17 00:00:00 2001 From: Adam Gutglick Date: Thu, 19 Mar 2026 12:39:09 +0000 Subject: [PATCH 3/5] update public api file Signed-off-by: Adam Gutglick --- vortex-array/public-api.lock | 292 +++++++++++++++++++++++++++++++++++ 1 file changed, 292 insertions(+) diff --git a/vortex-array/public-api.lock b/vortex-array/public-api.lock index ea2e3619b1e..f77f8c8a8db 100644 --- a/vortex-array/public-api.lock +++ b/vortex-array/public-api.lock @@ -4708,6 +4708,120 @@ pub vortex_array::arrays::varbinview::VarBinViewArrayParts::validity: vortex_arr pub vortex_array::arrays::varbinview::VarBinViewArrayParts::views: vortex_array::buffer::BufferHandle +pub mod vortex_array::arrays::variant + +pub struct vortex_array::arrays::variant::Variant + +impl vortex_array::arrays::Variant + +pub const vortex_array::arrays::Variant::ID: vortex_array::vtable::ArrayId + +impl core::fmt::Debug for vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result + +impl vortex_array::vtable::OperationsVTable for vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::scalar_at(array: &::Array, index: usize) -> vortex_error::VortexResult + +impl vortex_array::vtable::VTable for vortex_array::arrays::Variant + +pub type vortex_array::arrays::Variant::Array = vortex_array::arrays::variant::VariantArray + +pub type vortex_array::arrays::Variant::Metadata = vortex_array::EmptyMetadata + +pub type vortex_array::arrays::Variant::OperationsVTable = vortex_array::arrays::Variant + +pub type vortex_array::arrays::Variant::ValidityVTable = vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::append_to_builder(array: &Self::Array, builder: &mut dyn vortex_array::builders::ArrayBuilder, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult<()> + +pub fn vortex_array::arrays::Variant::array_eq(array: &Self::Array, other: &Self::Array, precision: vortex_array::Precision) -> bool + +pub fn vortex_array::arrays::Variant::array_hash(array: &Self::Array, state: &mut H, precision: vortex_array::Precision) + +pub fn vortex_array::arrays::Variant::buffer(_array: &Self::Array, idx: usize) -> vortex_array::buffer::BufferHandle + +pub fn vortex_array::arrays::Variant::buffer_name(_array: &Self::Array, _idx: usize) -> core::option::Option + +pub fn vortex_array::arrays::Variant::build(dtype: &vortex_array::dtype::DType, len: usize, _metadata: &Self::Metadata, _buffers: &[vortex_array::buffer::BufferHandle], children: &dyn vortex_array::serde::ArrayChildren) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::child(array: &Self::Array, idx: usize) -> vortex_array::ArrayRef + +pub fn vortex_array::arrays::Variant::child_name(_array: &Self::Array, idx: usize) -> alloc::string::String + +pub fn vortex_array::arrays::Variant::deserialize(_bytes: &[u8], _dtype: &vortex_array::dtype::DType, _len: usize, _buffers: &[vortex_array::buffer::BufferHandle], _session: &vortex_session::VortexSession) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::dtype(array: &Self::Array) -> &vortex_array::dtype::DType + +pub fn vortex_array::arrays::Variant::execute(array: &Self::Array, _ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::execute_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::id(_array: &Self::Array) -> vortex_array::vtable::ArrayId + +pub fn vortex_array::arrays::Variant::len(array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::metadata(_array: &Self::Array) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::nbuffers(_array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::nchildren(_array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::reduce(array: &Self::Array) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::reduce_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::serialize(_metadata: Self::Metadata) -> vortex_error::VortexResult>> + +pub fn vortex_array::arrays::Variant::stats(array: &Self::Array) -> vortex_array::stats::StatsSetRef<'_> + +pub fn vortex_array::arrays::Variant::with_children(array: &mut Self::Array, children: alloc::vec::Vec) -> vortex_error::VortexResult<()> + +impl vortex_array::vtable::ValidityVTable for vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::validity(array: &::Array) -> vortex_error::VortexResult + +pub struct vortex_array::arrays::variant::VariantArray + +impl vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::child(&self) -> &vortex_array::ArrayRef + +pub fn vortex_array::arrays::variant::VariantArray::new(child: vortex_array::ArrayRef) -> Self + +pub fn vortex_array::arrays::variant::VariantArray::new_nullable(child: vortex_array::ArrayRef, nullability: vortex_array::dtype::Nullability) -> Self + +impl vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::to_array(&self) -> vortex_array::ArrayRef + +impl core::clone::Clone for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::clone(&self) -> vortex_array::arrays::variant::VariantArray + +impl core::convert::AsRef for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::as_ref(&self) -> &dyn vortex_array::DynArray + +impl core::convert::From for vortex_array::ArrayRef + +pub fn vortex_array::ArrayRef::from(value: vortex_array::arrays::variant::VariantArray) -> vortex_array::ArrayRef + +impl core::fmt::Debug for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result + +impl core::ops::deref::Deref for vortex_array::arrays::variant::VariantArray + +pub type vortex_array::arrays::variant::VariantArray::Target = dyn vortex_array::DynArray + +pub fn vortex_array::arrays::variant::VariantArray::deref(&self) -> &Self::Target + +impl vortex_array::IntoArray for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::into_array(self) -> vortex_array::ArrayRef + pub struct vortex_array::arrays::Bool impl vortex_array::arrays::Bool @@ -7852,6 +7966,118 @@ impl<'a> core::iter::traits::collect::FromIterator pub fn vortex_array::arrays::VarBinViewArray::from_iter>>(iter: T) -> Self +pub struct vortex_array::arrays::Variant + +impl vortex_array::arrays::Variant + +pub const vortex_array::arrays::Variant::ID: vortex_array::vtable::ArrayId + +impl core::fmt::Debug for vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result + +impl vortex_array::vtable::OperationsVTable for vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::scalar_at(array: &::Array, index: usize) -> vortex_error::VortexResult + +impl vortex_array::vtable::VTable for vortex_array::arrays::Variant + +pub type vortex_array::arrays::Variant::Array = vortex_array::arrays::variant::VariantArray + +pub type vortex_array::arrays::Variant::Metadata = vortex_array::EmptyMetadata + +pub type vortex_array::arrays::Variant::OperationsVTable = vortex_array::arrays::Variant + +pub type vortex_array::arrays::Variant::ValidityVTable = vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::append_to_builder(array: &Self::Array, builder: &mut dyn vortex_array::builders::ArrayBuilder, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult<()> + +pub fn vortex_array::arrays::Variant::array_eq(array: &Self::Array, other: &Self::Array, precision: vortex_array::Precision) -> bool + +pub fn vortex_array::arrays::Variant::array_hash(array: &Self::Array, state: &mut H, precision: vortex_array::Precision) + +pub fn vortex_array::arrays::Variant::buffer(_array: &Self::Array, idx: usize) -> vortex_array::buffer::BufferHandle + +pub fn vortex_array::arrays::Variant::buffer_name(_array: &Self::Array, _idx: usize) -> core::option::Option + +pub fn vortex_array::arrays::Variant::build(dtype: &vortex_array::dtype::DType, len: usize, _metadata: &Self::Metadata, _buffers: &[vortex_array::buffer::BufferHandle], children: &dyn vortex_array::serde::ArrayChildren) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::child(array: &Self::Array, idx: usize) -> vortex_array::ArrayRef + +pub fn vortex_array::arrays::Variant::child_name(_array: &Self::Array, idx: usize) -> alloc::string::String + +pub fn vortex_array::arrays::Variant::deserialize(_bytes: &[u8], _dtype: &vortex_array::dtype::DType, _len: usize, _buffers: &[vortex_array::buffer::BufferHandle], _session: &vortex_session::VortexSession) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::dtype(array: &Self::Array) -> &vortex_array::dtype::DType + +pub fn vortex_array::arrays::Variant::execute(array: &Self::Array, _ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::execute_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::id(_array: &Self::Array) -> vortex_array::vtable::ArrayId + +pub fn vortex_array::arrays::Variant::len(array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::metadata(_array: &Self::Array) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::nbuffers(_array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::nchildren(_array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::reduce(array: &Self::Array) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::reduce_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::serialize(_metadata: Self::Metadata) -> vortex_error::VortexResult>> + +pub fn vortex_array::arrays::Variant::stats(array: &Self::Array) -> vortex_array::stats::StatsSetRef<'_> + +pub fn vortex_array::arrays::Variant::with_children(array: &mut Self::Array, children: alloc::vec::Vec) -> vortex_error::VortexResult<()> + +impl vortex_array::vtable::ValidityVTable for vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::validity(array: &::Array) -> vortex_error::VortexResult + +pub struct vortex_array::arrays::VariantArray + +impl vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::child(&self) -> &vortex_array::ArrayRef + +pub fn vortex_array::arrays::variant::VariantArray::new(child: vortex_array::ArrayRef) -> Self + +pub fn vortex_array::arrays::variant::VariantArray::new_nullable(child: vortex_array::ArrayRef, nullability: vortex_array::dtype::Nullability) -> Self + +impl vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::to_array(&self) -> vortex_array::ArrayRef + +impl core::clone::Clone for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::clone(&self) -> vortex_array::arrays::variant::VariantArray + +impl core::convert::AsRef for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::as_ref(&self) -> &dyn vortex_array::DynArray + +impl core::convert::From for vortex_array::ArrayRef + +pub fn vortex_array::ArrayRef::from(value: vortex_array::arrays::variant::VariantArray) -> vortex_array::ArrayRef + +impl core::fmt::Debug for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result + +impl core::ops::deref::Deref for vortex_array::arrays::variant::VariantArray + +pub type vortex_array::arrays::variant::VariantArray::Target = dyn vortex_array::DynArray + +pub fn vortex_array::arrays::variant::VariantArray::deref(&self) -> &Self::Target + +impl vortex_array::IntoArray for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::into_array(self) -> vortex_array::ArrayRef + pub mod vortex_array::arrow pub mod vortex_array::arrow::bool @@ -20420,6 +20646,10 @@ impl vortex_array::vtable::OperationsVTable fo pub fn vortex_array::arrays::VarBinView::scalar_at(array: &vortex_array::arrays::VarBinViewArray, index: usize) -> vortex_error::VortexResult +impl vortex_array::vtable::OperationsVTable for vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::scalar_at(array: &::Array, index: usize) -> vortex_error::VortexResult + impl vortex_array::vtable::OperationsVTable for vortex_array::arrays::dict::Dict pub fn vortex_array::arrays::dict::Dict::scalar_at(array: &vortex_array::arrays::dict::DictArray, index: usize) -> vortex_error::VortexResult @@ -21304,6 +21534,60 @@ pub fn vortex_array::arrays::VarBinView::stats(array: &vortex_array::arrays::Var pub fn vortex_array::arrays::VarBinView::with_children(array: &mut Self::Array, children: alloc::vec::Vec) -> vortex_error::VortexResult<()> +impl vortex_array::vtable::VTable for vortex_array::arrays::Variant + +pub type vortex_array::arrays::Variant::Array = vortex_array::arrays::variant::VariantArray + +pub type vortex_array::arrays::Variant::Metadata = vortex_array::EmptyMetadata + +pub type vortex_array::arrays::Variant::OperationsVTable = vortex_array::arrays::Variant + +pub type vortex_array::arrays::Variant::ValidityVTable = vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::append_to_builder(array: &Self::Array, builder: &mut dyn vortex_array::builders::ArrayBuilder, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult<()> + +pub fn vortex_array::arrays::Variant::array_eq(array: &Self::Array, other: &Self::Array, precision: vortex_array::Precision) -> bool + +pub fn vortex_array::arrays::Variant::array_hash(array: &Self::Array, state: &mut H, precision: vortex_array::Precision) + +pub fn vortex_array::arrays::Variant::buffer(_array: &Self::Array, idx: usize) -> vortex_array::buffer::BufferHandle + +pub fn vortex_array::arrays::Variant::buffer_name(_array: &Self::Array, _idx: usize) -> core::option::Option + +pub fn vortex_array::arrays::Variant::build(dtype: &vortex_array::dtype::DType, len: usize, _metadata: &Self::Metadata, _buffers: &[vortex_array::buffer::BufferHandle], children: &dyn vortex_array::serde::ArrayChildren) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::child(array: &Self::Array, idx: usize) -> vortex_array::ArrayRef + +pub fn vortex_array::arrays::Variant::child_name(_array: &Self::Array, idx: usize) -> alloc::string::String + +pub fn vortex_array::arrays::Variant::deserialize(_bytes: &[u8], _dtype: &vortex_array::dtype::DType, _len: usize, _buffers: &[vortex_array::buffer::BufferHandle], _session: &vortex_session::VortexSession) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::dtype(array: &Self::Array) -> &vortex_array::dtype::DType + +pub fn vortex_array::arrays::Variant::execute(array: &Self::Array, _ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::execute_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize, ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::id(_array: &Self::Array) -> vortex_array::vtable::ArrayId + +pub fn vortex_array::arrays::Variant::len(array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::metadata(_array: &Self::Array) -> vortex_error::VortexResult + +pub fn vortex_array::arrays::Variant::nbuffers(_array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::nchildren(_array: &Self::Array) -> usize + +pub fn vortex_array::arrays::Variant::reduce(array: &Self::Array) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::reduce_parent(array: &Self::Array, parent: &vortex_array::ArrayRef, child_idx: usize) -> vortex_error::VortexResult> + +pub fn vortex_array::arrays::Variant::serialize(_metadata: Self::Metadata) -> vortex_error::VortexResult>> + +pub fn vortex_array::arrays::Variant::stats(array: &Self::Array) -> vortex_array::stats::StatsSetRef<'_> + +pub fn vortex_array::arrays::Variant::with_children(array: &mut Self::Array, children: alloc::vec::Vec) -> vortex_error::VortexResult<()> + impl vortex_array::vtable::VTable for vortex_array::arrays::dict::Dict pub type vortex_array::arrays::dict::Dict::Array = vortex_array::arrays::dict::DictArray @@ -21604,6 +21888,10 @@ impl vortex_array::vtable::ValidityVTable for vort pub fn vortex_array::arrays::Shared::validity(array: &vortex_array::arrays::SharedArray) -> vortex_error::VortexResult +impl vortex_array::vtable::ValidityVTable for vortex_array::arrays::Variant + +pub fn vortex_array::arrays::Variant::validity(array: &::Array) -> vortex_error::VortexResult + impl vortex_array::vtable::ValidityVTable for vortex_array::arrays::dict::Dict pub fn vortex_array::arrays::dict::Dict::validity(array: &vortex_array::arrays::dict::DictArray) -> vortex_error::VortexResult @@ -22672,6 +22960,10 @@ impl vortex_array::IntoArray for vortex_array::arrays::slice::SliceArray pub fn vortex_array::arrays::slice::SliceArray::into_array(self) -> vortex_array::ArrayRef +impl vortex_array::IntoArray for vortex_array::arrays::variant::VariantArray + +pub fn vortex_array::arrays::variant::VariantArray::into_array(self) -> vortex_array::ArrayRef + impl vortex_array::IntoArray for vortex_buffer::bit::buf::BitBuffer pub fn vortex_buffer::bit::buf::BitBuffer::into_array(self) -> vortex_array::ArrayRef From 721f9531ec8e54e1ab9cf21ae6e19f3c7628ae40 Mon Sep 17 00:00:00 2001 From: Adam Gutglick Date: Thu, 19 Mar 2026 13:02:44 +0000 Subject: [PATCH 4/5] cleanup arrow export Signed-off-by: Adam Gutglick --- vortex-array/src/arrow/executor/mod.rs | 18 ---- vortex-array/src/arrow/executor/variant.rs | 113 --------------------- 2 files changed, 131 deletions(-) delete mode 100644 vortex-array/src/arrow/executor/variant.rs diff --git a/vortex-array/src/arrow/executor/mod.rs b/vortex-array/src/arrow/executor/mod.rs index 1582081dbcb..edaa244d967 100644 --- a/vortex-array/src/arrow/executor/mod.rs +++ b/vortex-array/src/arrow/executor/mod.rs @@ -15,7 +15,6 @@ mod run_end; mod struct_; mod temporal; mod validity; -mod variant; use arrow_array::ArrayRef as ArrowArrayRef; use arrow_array::RecordBatch; @@ -47,7 +46,6 @@ use crate::arrow::executor::primitive::to_arrow_primitive; use crate::arrow::executor::run_end::to_arrow_run_end; use crate::arrow::executor::struct_::to_arrow_struct; use crate::arrow::executor::temporal::to_arrow_temporal; -use crate::arrow::executor::variant::to_arrow_variant; use crate::dtype::DType; use crate::dtype::PType; use crate::executor::ExecutionCtx; @@ -90,22 +88,6 @@ impl ArrowArrayExecutor for ArrayRef { ) -> VortexResult { let len = self.len(); - if self.dtype().is_variant() { - let target_fields = match data_type { - Some(DataType::Struct(fields)) => Some(fields), - Some(_) => { - vortex_bail!("Variant can only be converted to Arrow Struct storage type"); - } - None => None, - }; - let arrow = to_arrow_variant(self, target_fields, ctx)?; - vortex_ensure!( - arrow.len() == len, - "Arrow array length does not match Vortex array length after conversion to Variant" - ); - return Ok(arrow); - } - // Resolve the DataType if it is a leaf type // we should likely make this extensible. let resolved_type: DataType = match data_type { diff --git a/vortex-array/src/arrow/executor/variant.rs b/vortex-array/src/arrow/executor/variant.rs deleted file mode 100644 index a02f7cfe593..00000000000 --- a/vortex-array/src/arrow/executor/variant.rs +++ /dev/null @@ -1,113 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: Copyright the Vortex contributors - -use std::sync::Arc; - -use arrow_array::ArrayRef as ArrowArrayRef; -use arrow_array::StructArray as ArrowStructArray; -use arrow_schema::Field; -use arrow_schema::Fields; -use vortex_error::VortexResult; -use vortex_error::vortex_bail; -use vortex_error::vortex_ensure; - -use crate::ArrayRef; -use crate::ExecutionCtx; -use crate::array::ArrayVisitor; -use crate::arrays::Variant; -use crate::arrow::ArrowArrayExecutor; -use crate::arrow::executor::validity::to_arrow_null_buffer; - -pub(super) fn to_arrow_variant( - array: ArrayRef, - target_fields: Option<&Fields>, - ctx: &mut ExecutionCtx, -) -> VortexResult { - let len = array.len(); - let nulls = to_arrow_null_buffer(array.validity()?, len, ctx)?; - let inner = match array.try_into::() { - Ok(variant) => variant.child().clone(), - Err(array) => array, - }; - - let named_children = inner.named_children(); - if named_children.is_empty() { - vortex_bail!("Variant array has no children"); - } - - let mut metadata: Option = None; - let mut value: Option = None; - let mut typed_value: Option = None; - - for (name, child) in named_children { - match name.as_str() { - "validity" => {} - "metadata" => metadata = Some(child), - "value" => value = Some(child), - "typed_value" => typed_value = Some(child), - _ => { - vortex_bail!("Unsupported variant child {name}"); - } - } - } - - let metadata = match metadata { - Some(metadata) => metadata, - None => vortex_bail!("Variant array missing metadata child"), - }; - - let mut ordered: Vec<(String, ArrayRef)> = vec![("metadata".to_string(), metadata.clone())]; - if let Some(value) = value.clone() { - ordered.push(("value".to_string(), value)); - } - if let Some(typed_value) = typed_value.clone() { - ordered.push(("typed_value".to_string(), typed_value)); - } - - let (fields, arrays) = if let Some(fields) = target_fields { - let mut arrays = Vec::with_capacity(fields.len()); - for field in fields.iter() { - let child = match field.name().as_str() { - "metadata" => Some(&metadata), - "value" => value.as_ref(), - "typed_value" => typed_value.as_ref(), - other => { - vortex_bail!("Unsupported variant field {other}"); - } - }; - - let Some(child) = child else { - vortex_bail!("Variant array missing child for field {}", field.name()); - }; - - arrays.push(child.clone().execute_arrow(Some(field.data_type()), ctx)?); - } - - // Ensure we didn't silently drop any children - vortex_ensure!( - fields.len() == ordered.len(), - "Variant array has {} children but target Arrow type has {} fields", - ordered.len(), - fields.len() - ); - - (fields.clone(), arrays) - } else { - let mut fields = Vec::with_capacity(ordered.len()); - let mut arrays = Vec::with_capacity(ordered.len()); - - for (name, child) in ordered { - let arrow = child.clone().execute_arrow(None, ctx)?; - fields.push(Field::new( - name, - arrow.data_type().clone(), - child.dtype().is_nullable(), - )); - arrays.push(arrow); - } - - (Fields::from(fields), arrays) - }; - - Ok(Arc::new(ArrowStructArray::try_new(fields, arrays, nulls)?)) -} From 03006dbf13314bcca2820d6454158e4031af7a29 Mon Sep 17 00:00:00 2001 From: Adam Gutglick Date: Thu, 19 Mar 2026 13:15:21 +0000 Subject: [PATCH 5/5] CR comments Signed-off-by: Adam Gutglick --- vortex-array/public-api.lock | 8 ++------ vortex-array/src/arrays/variant/mod.rs | 10 +--------- vortex-array/src/arrays/variant/vtable/mod.rs | 4 ++-- 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/vortex-array/public-api.lock b/vortex-array/public-api.lock index f77f8c8a8db..5d03b88a616 100644 --- a/vortex-array/public-api.lock +++ b/vortex-array/public-api.lock @@ -4788,9 +4788,7 @@ impl vortex_array::arrays::variant::VariantArray pub fn vortex_array::arrays::variant::VariantArray::child(&self) -> &vortex_array::ArrayRef -pub fn vortex_array::arrays::variant::VariantArray::new(child: vortex_array::ArrayRef) -> Self - -pub fn vortex_array::arrays::variant::VariantArray::new_nullable(child: vortex_array::ArrayRef, nullability: vortex_array::dtype::Nullability) -> Self +pub fn vortex_array::arrays::variant::VariantArray::new(child: vortex_array::ArrayRef, nullability: vortex_array::dtype::Nullability) -> Self impl vortex_array::arrays::variant::VariantArray @@ -8044,9 +8042,7 @@ impl vortex_array::arrays::variant::VariantArray pub fn vortex_array::arrays::variant::VariantArray::child(&self) -> &vortex_array::ArrayRef -pub fn vortex_array::arrays::variant::VariantArray::new(child: vortex_array::ArrayRef) -> Self - -pub fn vortex_array::arrays::variant::VariantArray::new_nullable(child: vortex_array::ArrayRef, nullability: vortex_array::dtype::Nullability) -> Self +pub fn vortex_array::arrays::variant::VariantArray::new(child: vortex_array::ArrayRef, nullability: vortex_array::dtype::Nullability) -> Self impl vortex_array::arrays::variant::VariantArray diff --git a/vortex-array/src/arrays/variant/mod.rs b/vortex-array/src/arrays/variant/mod.rs index 63c1fb2e3e8..054cdedb9b8 100644 --- a/vortex-array/src/arrays/variant/mod.rs +++ b/vortex-array/src/arrays/variant/mod.rs @@ -7,7 +7,6 @@ pub use self::vtable::Variant; use crate::ArrayRef; use crate::dtype::DType; use crate::dtype::Nullability; -use crate::stats::ArrayStats; /// The canonical in-memory representation of variant (semi-structured) data. /// @@ -17,21 +16,14 @@ use crate::stats::ArrayStats; pub struct VariantArray { dtype: DType, child: ArrayRef, - pub(super) stats_set: ArrayStats, } impl VariantArray { - /// Creates a new non-nullable VariantArray wrapping the given child. - pub fn new(child: ArrayRef) -> Self { - Self::new_nullable(child, Nullability::NonNullable) - } - /// Creates a new VariantArray with the given nullability. - pub fn new_nullable(child: ArrayRef, nullability: Nullability) -> Self { + pub fn new(child: ArrayRef, nullability: Nullability) -> Self { Self { dtype: DType::Variant(nullability), child, - stats_set: ArrayStats::default(), } } diff --git a/vortex-array/src/arrays/variant/vtable/mod.rs b/vortex-array/src/arrays/variant/vtable/mod.rs index 11e1d4c0a86..71ae0665212 100644 --- a/vortex-array/src/arrays/variant/vtable/mod.rs +++ b/vortex-array/src/arrays/variant/vtable/mod.rs @@ -59,7 +59,7 @@ impl VTable for Variant { } fn stats(array: &Self::Array) -> StatsSetRef<'_> { - array.stats_set.to_ref(array.as_ref()) + array.child.statistics() } fn array_hash(array: &Self::Array, state: &mut H, precision: Precision) { @@ -137,7 +137,7 @@ impl VTable for Variant { &DType::Variant(crate::dtype::Nullability::NonNullable), len, )?; - Ok(VariantArray::new_nullable(child, dtype.nullability())) + Ok(VariantArray::new(child, dtype.nullability())) } fn with_children(array: &mut Self::Array, children: Vec) -> VortexResult<()> {