use std::sync::Arc;
use arrow_array::ArrayRef as ArrowArrayRef;
use arrow_array::GenericByteViewArray;
use arrow_array::types::ByteViewType;
use arrow_buffer::ScalarBuffer;
use vortex_error::VortexResult;
use crate::ArrayRef;
use crate::ExecutionCtx;
use crate::arrays::VarBinViewArray;
use crate::arrow::executor::validity::to_arrow_null_buffer;
use crate::arrow::null_buffer::to_null_buffer;
use crate::builtins::ArrayBuiltins;
use crate::dtype::DType;
use crate::dtype::Nullability;
use crate::dtype::arrow::FromArrowType;
pub fn canonical_varbinview_to_arrow<T: ByteViewType>(
array: &VarBinViewArray,
) -> VortexResult<ArrowArrayRef> {
let views =
ScalarBuffer::<u128>::from(array.views_handle().as_host().clone().into_arrow_buffer());
let buffers: Vec<_> = array
.data_buffers()
.iter()
.map(|buffer| buffer.as_host().clone().into_arrow_buffer())
.collect();
let nulls = to_null_buffer(array.validity_mask()?);
Ok(Arc::new(unsafe {
GenericByteViewArray::<T>::new_unchecked(views, buffers, nulls)
}))
}
pub fn execute_varbinview_to_arrow<T: ByteViewType>(
array: &VarBinViewArray,
ctx: &mut ExecutionCtx,
) -> VortexResult<ArrowArrayRef> {
let views =
ScalarBuffer::<u128>::from(array.views_handle().as_host().clone().into_arrow_buffer());
let buffers: Vec<_> = array
.data_buffers()
.iter()
.map(|buffer| buffer.as_host().clone().into_arrow_buffer())
.collect();
let nulls = to_arrow_null_buffer(array.validity()?, array.len(), ctx)?;
Ok(Arc::new(unsafe {
GenericByteViewArray::<T>::new_unchecked(views, buffers, nulls)
}))
}
pub(super) fn to_arrow_byte_view<T: ByteViewType>(
array: ArrayRef,
ctx: &mut ExecutionCtx,
) -> VortexResult<ArrowArrayRef> {
let array = array.cast(DType::from_arrow((&T::DATA_TYPE, Nullability::Nullable)))?;
let varbinview = array.execute::<VarBinViewArray>(ctx)?;
canonical_varbinview_to_arrow::<T>(&varbinview)
}