From a23b4702e02cdb2862eb074cbd6ee9d068a5f670 Mon Sep 17 00:00:00 2001 From: Nicholas Gates Date: Fri, 6 Mar 2026 16:53:36 -0500 Subject: [PATCH 1/5] Use execution where ExecutionCtx is already in scope Signed-off-by: Nicholas Gates --- encodings/alp/src/alp/decompress.rs | 19 +++++-------------- encodings/datetime-parts/src/canonical.rs | 3 +-- .../fastlanes/src/bitpacking/compute/take.rs | 6 +++--- encodings/runend/src/compute/compare.rs | 9 +++++---- encodings/runend/src/compute/filter.rs | 5 ++--- encodings/runend/src/compute/take.rs | 4 ++-- encodings/sequence/src/compute/take.rs | 5 ++--- .../src/arrays/chunked/compute/take.rs | 3 +-- vortex-array/src/canonical.rs | 1 + vortex-duckdb/src/exporter/dict.rs | 3 +-- 10 files changed, 23 insertions(+), 35 deletions(-) diff --git a/encodings/alp/src/alp/decompress.rs b/encodings/alp/src/alp/decompress.rs index a979fea8f80..15c52279f2d 100644 --- a/encodings/alp/src/alp/decompress.rs +++ b/encodings/alp/src/alp/decompress.rs @@ -4,7 +4,6 @@ use std::mem::transmute; use vortex_array::ExecutionCtx; -use vortex_array::ToCanonical; use vortex_array::arrays::PrimitiveArray; use vortex_array::arrays::chunk_range; use vortex_array::arrays::patch_chunk; @@ -33,14 +32,10 @@ pub fn decompress_into_array( if let Some(ref patches) = patches && let Some(chunk_offsets) = patches.chunk_offsets() { - let prim_encoded = encoded.to_primitive(); - // We need to drop ALPArray here in case converting encoded buffer into - // primitive didn't create a copy. In that case both alp_encoded and array - // will hold a reference to the buffer we want to mutate. - drop(encoded); - let patches_chunk_offsets = chunk_offsets.as_ref().to_primitive(); - let patches_indices = patches.indices().to_primitive(); - let patches_values = patches.values().to_primitive(); + let prim_encoded = encoded.execute::(ctx)?; + let patches_chunk_offsets = chunk_offsets.clone().execute::(ctx)?; + let patches_indices = patches.indices().clone().execute::(ctx)?; + let patches_values = patches.values().clone().execute::(ctx)?; Ok(decompress_chunked_core( prim_encoded, exponents, @@ -51,11 +46,7 @@ pub fn decompress_into_array( dtype, )) } else { - let encoded_prim = encoded.to_primitive(); - // We need to drop ALPArray here in case converting encoded buffer into - // primitive didn't create a copy. In that case both alp_encoded and array - // will hold a reference to the buffer we want to mutate. - drop(encoded); + let encoded_prim = encoded.execute::(ctx)?; decompress_unchunked_core(encoded_prim, exponents, patches, dtype, ctx) } } diff --git a/encodings/datetime-parts/src/canonical.rs b/encodings/datetime-parts/src/canonical.rs index 36ae6f01444..096247ae487 100644 --- a/encodings/datetime-parts/src/canonical.rs +++ b/encodings/datetime-parts/src/canonical.rs @@ -110,7 +110,6 @@ mod test { use rstest::rstest; use vortex_array::ExecutionCtx; use vortex_array::IntoArray; - use vortex_array::ToCanonical; use vortex_array::arrays::PrimitiveArray; use vortex_array::arrays::TemporalArray; use vortex_array::assert_arrays_eq; @@ -156,7 +155,7 @@ mod test { let mut ctx = ExecutionCtx::new(VortexSession::empty()); let primitive_values = decode_to_temporal(&date_times, &mut ctx)? .temporal_values() - .to_primitive(); + .execute::(&mut ctx)?; assert_arrays_eq!(primitive_values, milliseconds); assert_eq!(primitive_values.validity(), &validity); diff --git a/encodings/fastlanes/src/bitpacking/compute/take.rs b/encodings/fastlanes/src/bitpacking/compute/take.rs index 1689bbf974d..bd8ab8a6970 100644 --- a/encodings/fastlanes/src/bitpacking/compute/take.rs +++ b/encodings/fastlanes/src/bitpacking/compute/take.rs @@ -9,7 +9,6 @@ use vortex_array::ArrayRef; use vortex_array::DynArray; use vortex_array::ExecutionCtx; use vortex_array::IntoArray; -use vortex_array::ToCanonical; use vortex_array::arrays::PrimitiveArray; use vortex_array::arrays::TakeExecute; use vortex_array::dtype::IntegerPType; @@ -43,7 +42,8 @@ impl TakeExecute for BitPackedVTable { ) -> VortexResult> { // If the indices are large enough, it's faster to flatten and take the primitive array. if indices.len() * UNPACK_CHUNK_THRESHOLD > array.len() { - return array.to_primitive().take(indices.to_array()).map(Some); + let prim = array.clone().into_array().execute::(ctx)?; + return prim.take(indices.to_array()).map(Some); } // NOTE: we use the unsigned PType because all values in the BitPackedArray must @@ -52,7 +52,7 @@ impl TakeExecute for BitPackedVTable { let validity = array.validity(); let taken_validity = validity.take(indices)?; - let indices = indices.to_primitive(); + let indices = indices.clone().execute::(ctx)?; let taken = match_each_unsigned_integer_ptype!(ptype.to_unsigned(), |T| { match_each_integer_ptype!(indices.ptype(), |I| { take_primitive::(array, &indices, taken_validity, ctx)? diff --git a/encodings/runend/src/compute/compare.rs b/encodings/runend/src/compute/compare.rs index d3b66f41a2a..0b02c474dc1 100644 --- a/encodings/runend/src/compute/compare.rs +++ b/encodings/runend/src/compute/compare.rs @@ -5,8 +5,9 @@ use vortex_array::ArrayRef; use vortex_array::DynArray; use vortex_array::ExecutionCtx; use vortex_array::IntoArray; -use vortex_array::ToCanonical; +use vortex_array::arrays::BoolArray; use vortex_array::arrays::ConstantArray; +use vortex_array::arrays::PrimitiveArray; use vortex_array::builtins::ArrayBuiltins; use vortex_array::scalar_fn::fns::binary::CompareKernel; use vortex_array::scalar_fn::fns::operators::CompareOperator; @@ -22,7 +23,7 @@ impl CompareKernel for RunEndVTable { lhs: &RunEndArray, rhs: &ArrayRef, operator: CompareOperator, - _ctx: &mut ExecutionCtx, + ctx: &mut ExecutionCtx, ) -> VortexResult> { // If the RHS is constant, then we just need to compare against our encoded values. if let Some(const_scalar) = rhs.as_constant() { @@ -31,8 +32,8 @@ impl CompareKernel for RunEndVTable { Operator::from(operator), )?; let decoded = runend_decode_bools( - lhs.ends().to_primitive(), - values.to_bool(), + lhs.ends().clone().execute::(ctx)?, + values.execute::(ctx)?, lhs.offset(), lhs.len(), )?; diff --git a/encodings/runend/src/compute/filter.rs b/encodings/runend/src/compute/filter.rs index a1c7e84a551..208a6a3ce1e 100644 --- a/encodings/runend/src/compute/filter.rs +++ b/encodings/runend/src/compute/filter.rs @@ -8,7 +8,6 @@ use num_traits::AsPrimitive; use vortex_array::ArrayRef; use vortex_array::ExecutionCtx; use vortex_array::IntoArray; -use vortex_array::ToCanonical; use vortex_array::arrays::FilterKernel; use vortex_array::arrays::PrimitiveArray; use vortex_array::dtype::NativePType; @@ -30,7 +29,7 @@ impl FilterKernel for RunEndVTable { fn filter( array: &RunEndArray, mask: &Mask, - _ctx: &mut ExecutionCtx, + ctx: &mut ExecutionCtx, ) -> VortexResult> { let mask_values = mask .values() @@ -45,7 +44,7 @@ impl FilterKernel for RunEndVTable { &Validity::NonNullable, )?)) } else { - let primitive_run_ends = array.ends().to_primitive(); + let primitive_run_ends = array.ends().clone().execute::(ctx)?; let (run_ends, values_mask) = match_each_unsigned_integer_ptype!(primitive_run_ends.ptype(), |P| { filter_run_end_primitive( diff --git a/encodings/runend/src/compute/take.rs b/encodings/runend/src/compute/take.rs index 7a698ae6cea..41abb31acba 100644 --- a/encodings/runend/src/compute/take.rs +++ b/encodings/runend/src/compute/take.rs @@ -31,9 +31,9 @@ impl TakeExecute for RunEndVTable { fn take( array: &RunEndArray, indices: &ArrayRef, - _ctx: &mut ExecutionCtx, + ctx: &mut ExecutionCtx, ) -> VortexResult> { - let primitive_indices = indices.to_primitive(); + let primitive_indices = indices.clone().execute::(ctx)?; let checked_indices = match_each_integer_ptype!(primitive_indices.ptype(), |P| { primitive_indices diff --git a/encodings/sequence/src/compute/take.rs b/encodings/sequence/src/compute/take.rs index 13e893aaa47..ebcdf29501f 100644 --- a/encodings/sequence/src/compute/take.rs +++ b/encodings/sequence/src/compute/take.rs @@ -6,7 +6,6 @@ use vortex_array::ArrayRef; use vortex_array::DynArray; use vortex_array::ExecutionCtx; use vortex_array::IntoArray; -use vortex_array::ToCanonical; use vortex_array::arrays::ConstantArray; use vortex_array::arrays::PrimitiveArray; use vortex_array::arrays::TakeExecute; @@ -77,10 +76,10 @@ impl TakeExecute for SequenceVTable { fn take( array: &SequenceArray, indices: &ArrayRef, - _ctx: &mut ExecutionCtx, + ctx: &mut ExecutionCtx, ) -> VortexResult> { let mask = indices.validity_mask()?; - let indices = indices.to_primitive(); + let indices = indices.clone().execute::(ctx)?; let result_nullability = array.dtype().nullability() | indices.dtype().nullability(); match_each_integer_ptype!(indices.ptype(), |T| { diff --git a/vortex-array/src/arrays/chunked/compute/take.rs b/vortex-array/src/arrays/chunked/compute/take.rs index 81e632f0150..8c068c302f3 100644 --- a/vortex-array/src/arrays/chunked/compute/take.rs +++ b/vortex-array/src/arrays/chunked/compute/take.rs @@ -14,7 +14,6 @@ use crate::arrays::PrimitiveArray; use crate::arrays::TakeExecute; use crate::arrays::chunked::ChunkedArray; use crate::builtins::ArrayBuiltins; -use crate::canonical::ToCanonical; use crate::dtype::DType; use crate::dtype::PType; use crate::executor::ExecutionCtx; @@ -30,7 +29,7 @@ fn take_chunked( let indices = indices .to_array() .cast(DType::Primitive(PType::U64, indices.dtype().nullability()))? - .to_primitive(); + .execute::(ctx)?; let indices_mask = indices.validity_mask()?; let indices_values = indices.as_slice::(); diff --git a/vortex-array/src/canonical.rs b/vortex-array/src/canonical.rs index bae2aadc542..fe12441a324 100644 --- a/vortex-array/src/canonical.rs +++ b/vortex-array/src/canonical.rs @@ -421,6 +421,7 @@ impl IntoArray for Canonical { /// # Canonicalization /// /// This trait has a blanket implementation for all types implementing [ToCanonical]. +#[deprecated(note = "Use Array::execute instead")] pub trait ToCanonical { /// Canonicalize into a [`NullArray`] if the target is [`Null`](DType::Null) typed. fn to_null(&self) -> NullArray; diff --git a/vortex-duckdb/src/exporter/dict.rs b/vortex-duckdb/src/exporter/dict.rs index 797b0d6bc70..744716597be 100644 --- a/vortex-duckdb/src/exporter/dict.rs +++ b/vortex-duckdb/src/exporter/dict.rs @@ -11,7 +11,6 @@ use vortex::array::Canonical; use vortex::array::DynArray; use vortex::array::ExecutionCtx; use vortex::array::IntoArray; -use vortex::array::ToCanonical; use vortex::array::arrays::ConstantArray; use vortex::array::arrays::ConstantVTable; use vortex::array::arrays::DictArray; @@ -72,7 +71,7 @@ pub(crate) fn new_exporter_with_flatten( } let values_key = Arc::as_ptr(values).addr(); - let codes = array.codes().to_primitive(); + let codes = array.codes().clone().execute::(ctx)?; let exporter_values = if flatten { let canonical = cache From cc1d6ec5f1441338ccf0783271fe285d67e204a7 Mon Sep 17 00:00:00 2001 From: Nicholas Gates Date: Fri, 6 Mar 2026 17:03:14 -0500 Subject: [PATCH 2/5] Use execution where ExecutionCtx is already in scope Signed-off-by: Nicholas Gates --- encodings/datetime-parts/src/canonical.rs | 1 + vortex-array/src/canonical.rs | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/encodings/datetime-parts/src/canonical.rs b/encodings/datetime-parts/src/canonical.rs index 096247ae487..51e2d0447ba 100644 --- a/encodings/datetime-parts/src/canonical.rs +++ b/encodings/datetime-parts/src/canonical.rs @@ -155,6 +155,7 @@ mod test { let mut ctx = ExecutionCtx::new(VortexSession::empty()); let primitive_values = decode_to_temporal(&date_times, &mut ctx)? .temporal_values() + .clone() .execute::(&mut ctx)?; assert_arrays_eq!(primitive_values, milliseconds); diff --git a/vortex-array/src/canonical.rs b/vortex-array/src/canonical.rs index fe12441a324..bae2aadc542 100644 --- a/vortex-array/src/canonical.rs +++ b/vortex-array/src/canonical.rs @@ -421,7 +421,6 @@ impl IntoArray for Canonical { /// # Canonicalization /// /// This trait has a blanket implementation for all types implementing [ToCanonical]. -#[deprecated(note = "Use Array::execute instead")] pub trait ToCanonical { /// Canonicalize into a [`NullArray`] if the target is [`Null`](DType::Null) typed. fn to_null(&self) -> NullArray; From 00a5aeb19d8b4c136562f1ea3981b1a33dcfbc04 Mon Sep 17 00:00:00 2001 From: Nicholas Gates Date: Fri, 6 Mar 2026 17:11:23 -0500 Subject: [PATCH 3/5] Use execution where ExecutionCtx is already in scope Signed-off-by: Nicholas Gates --- encodings/runend/public-api.lock | 6 +++--- encodings/sequence/public-api.lock | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/encodings/runend/public-api.lock b/encodings/runend/public-api.lock index 3d558820fe1..d5c2bc8b646 100644 --- a/encodings/runend/public-api.lock +++ b/encodings/runend/public-api.lock @@ -122,11 +122,11 @@ pub fn vortex_runend::RunEndVTable::fmt(&self, f: &mut core::fmt::Formatter<'_>) impl vortex_array::arrays::dict::take::TakeExecute for vortex_runend::RunEndVTable -pub fn vortex_runend::RunEndVTable::take(array: &vortex_runend::RunEndArray, indices: &vortex_array::array::ArrayRef, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult> +pub fn vortex_runend::RunEndVTable::take(array: &vortex_runend::RunEndArray, indices: &vortex_array::array::ArrayRef, ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult> impl vortex_array::arrays::filter::kernel::FilterKernel for vortex_runend::RunEndVTable -pub fn vortex_runend::RunEndVTable::filter(array: &vortex_runend::RunEndArray, mask: &vortex_mask::Mask, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult> +pub fn vortex_runend::RunEndVTable::filter(array: &vortex_runend::RunEndArray, mask: &vortex_mask::Mask, ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult> impl vortex_array::compute::is_constant::IsConstantKernel for vortex_runend::RunEndVTable @@ -144,7 +144,7 @@ pub fn vortex_runend::RunEndVTable::min_max(&self, array: &vortex_runend::RunEnd impl vortex_array::scalar_fn::fns::binary::compare::CompareKernel for vortex_runend::RunEndVTable -pub fn vortex_runend::RunEndVTable::compare(lhs: &vortex_runend::RunEndArray, rhs: &vortex_array::array::ArrayRef, operator: vortex_array::scalar_fn::fns::operators::CompareOperator, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult> +pub fn vortex_runend::RunEndVTable::compare(lhs: &vortex_runend::RunEndArray, rhs: &vortex_array::array::ArrayRef, operator: vortex_array::scalar_fn::fns::operators::CompareOperator, ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult> impl vortex_array::scalar_fn::fns::cast::kernel::CastReduce for vortex_runend::RunEndVTable diff --git a/encodings/sequence/public-api.lock b/encodings/sequence/public-api.lock index a48416a322a..cdd5418ecf4 100644 --- a/encodings/sequence/public-api.lock +++ b/encodings/sequence/public-api.lock @@ -72,7 +72,7 @@ pub fn vortex_sequence::SequenceVTable::fmt(&self, f: &mut core::fmt::Formatter< impl vortex_array::arrays::dict::take::TakeExecute for vortex_sequence::SequenceVTable -pub fn vortex_sequence::SequenceVTable::take(array: &vortex_sequence::SequenceArray, indices: &vortex_array::array::ArrayRef, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult> +pub fn vortex_sequence::SequenceVTable::take(array: &vortex_sequence::SequenceArray, indices: &vortex_array::array::ArrayRef, ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult> impl vortex_array::arrays::filter::kernel::FilterKernel for vortex_sequence::SequenceVTable From c7f6171c6180fb98fb3750780f1adcef9b1d1e6a Mon Sep 17 00:00:00 2001 From: Nicholas Gates Date: Fri, 6 Mar 2026 17:19:52 -0500 Subject: [PATCH 4/5] Use execution where ExecutionCtx is already in scope Signed-off-by: Nicholas Gates --- encodings/runend/src/compute/filter.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/encodings/runend/src/compute/filter.rs b/encodings/runend/src/compute/filter.rs index 37b454e8220..4f89068ff13 100644 --- a/encodings/runend/src/compute/filter.rs +++ b/encodings/runend/src/compute/filter.rs @@ -8,11 +8,7 @@ use num_traits::AsPrimitive; use vortex_array::ArrayRef; use vortex_array::ExecutionCtx; use vortex_array::IntoArray; -<<<<<<< HEAD -use vortex_array::arrays::FilterKernel; -======= use vortex_array::ToCanonical; ->>>>>>> develop use vortex_array::arrays::PrimitiveArray; use vortex_array::arrays::filter::FilterKernel; use vortex_array::dtype::NativePType; From 886f62fd4c7ec8cb299e4430488754146ffbf8c2 Mon Sep 17 00:00:00 2001 From: Nicholas Gates Date: Fri, 6 Mar 2026 20:06:28 -0500 Subject: [PATCH 5/5] Use execution where ExecutionCtx is already in scope Signed-off-by: Nicholas Gates --- encodings/runend/src/compute/filter.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/encodings/runend/src/compute/filter.rs b/encodings/runend/src/compute/filter.rs index 4f89068ff13..4f1662c15e1 100644 --- a/encodings/runend/src/compute/filter.rs +++ b/encodings/runend/src/compute/filter.rs @@ -8,7 +8,6 @@ use num_traits::AsPrimitive; use vortex_array::ArrayRef; use vortex_array::ExecutionCtx; use vortex_array::IntoArray; -use vortex_array::ToCanonical; use vortex_array::arrays::PrimitiveArray; use vortex_array::arrays::filter::FilterKernel; use vortex_array::dtype::NativePType;