vortex_arrow/executor/
byte_view.rs1use std::sync::Arc;
5
6use arrow_array::ArrayRef as ArrowArrayRef;
7use arrow_array::GenericByteViewArray;
8use arrow_array::types::ByteViewType;
9use arrow_buffer::ScalarBuffer;
10use vortex_array::ArrayRef;
11use vortex_array::ExecutionCtx;
12use vortex_array::arrays::VarBinViewArray;
13use vortex_array::builtins::ArrayBuiltins;
14use vortex_array::dtype::DType;
15use vortex_array::dtype::Nullability;
16use vortex_error::VortexResult;
17
18use crate::dtype::FromArrowType;
19use crate::null_buffer::to_null_buffer;
20
21pub fn canonical_varbinview_to_arrow<T: ByteViewType>(
23 array: &VarBinViewArray,
24 ctx: &mut ExecutionCtx,
25) -> VortexResult<ArrowArrayRef> {
26 let views =
27 ScalarBuffer::<u128>::from(array.views_handle().as_host().clone().into_arrow_buffer());
28 let buffers: Vec<_> = array
29 .data_buffers()
30 .iter()
31 .map(|buffer| buffer.as_host().clone().into_arrow_buffer())
32 .collect();
33 let nulls = to_null_buffer(
34 array
35 .as_ref()
36 .validity()?
37 .execute_mask(array.as_ref().len(), ctx)?,
38 );
39
40 Ok(Arc::new(unsafe {
42 GenericByteViewArray::<T>::new_unchecked(views, buffers, nulls)
43 }))
44}
45
46pub fn execute_varbinview_to_arrow<T: ByteViewType>(
47 array: &VarBinViewArray,
48 ctx: &mut ExecutionCtx,
49) -> VortexResult<ArrowArrayRef> {
50 let compacted = array.compact_buffers(ctx)?;
51 canonical_varbinview_to_arrow::<T>(&compacted, ctx)
52}
53
54pub(super) fn to_arrow_byte_view<T: ByteViewType>(
55 array: ArrayRef,
56 ctx: &mut ExecutionCtx,
57) -> VortexResult<ArrowArrayRef> {
58 let array = array.cast(DType::from_arrow((&T::DATA_TYPE, Nullability::Nullable)))?;
63
64 let array = array.execute::<ArrayRef>(ctx)?;
65 let varbinview = array.execute::<VarBinViewArray>(ctx)?;
66 execute_varbinview_to_arrow::<T>(&varbinview, ctx)
67}