vortex_array/arrow/executor/
primitive.rs1use std::sync::Arc;
5
6use arrow_array::ArrayRef as ArrowArrayRef;
7use arrow_array::ArrowPrimitiveType;
8use arrow_array::PrimitiveArray as ArrowPrimitiveArray;
9use vortex_dtype::DType;
10use vortex_dtype::NativePType;
11use vortex_dtype::Nullability;
12use vortex_error::VortexResult;
13
14use crate::ArrayRef;
15use crate::ExecutionCtx;
16use crate::arrays::PrimitiveArray;
17use crate::arrow::null_buffer::to_null_buffer;
18use crate::builtins::ArrayBuiltins;
19
20pub fn canonical_primitive_to_arrow<T: ArrowPrimitiveType>(
22 array: PrimitiveArray,
23) -> VortexResult<ArrowArrayRef>
24where
25 T::Native: NativePType,
26{
27 let validity = array.validity_mask()?;
28 let null_buffer = to_null_buffer(validity);
29 let buffer = array.into_buffer::<T::Native>().into_arrow_scalar_buffer();
30 Ok(Arc::new(ArrowPrimitiveArray::<T>::new(buffer, null_buffer)))
31}
32
33pub(super) fn to_arrow_primitive<T: ArrowPrimitiveType>(
34 array: ArrayRef,
35 ctx: &mut ExecutionCtx,
36) -> VortexResult<ArrowArrayRef>
37where
38 T::Native: NativePType,
39{
40 let array = array.cast(DType::Primitive(T::Native::PTYPE, Nullability::Nullable))?;
42 let primitive = array.execute::<PrimitiveArray>(ctx)?;
43 canonical_primitive_to_arrow::<T>(primitive)
44}