use crate::cast::*;
pub(crate) fn cast_list_view_to_list<O: OffsetSizeTrait>(
array: &dyn Array,
to: &FieldRef,
cast_options: &CastOptions,
) -> Result<ArrayRef, ArrowError> {
let list_view = array.as_list_view::<O>();
let list_view_offsets = list_view.offsets();
let sizes = list_view.sizes();
let source_values = list_view.values();
let mut indices = Vec::with_capacity(list_view.values().len());
let mut offsets = Vec::with_capacity(list_view.len() + 1);
offsets.push(O::usize_as(0));
for i in 0..list_view.len() {
let offset = list_view_offsets[i].as_usize();
let size = sizes[i].as_usize();
let end = offset + size;
for j in offset..end {
indices.push(j as i32);
}
offsets.push(O::usize_as(indices.len()));
}
let values = arrow_select::take::take(source_values, &Int32Array::from(indices), None)?;
let values = cast_with_options(&values, to.data_type(), cast_options)?;
Ok(Arc::new(GenericListArray::<O>::try_new(
to.clone(),
OffsetBuffer::new(offsets.into()),
values,
list_view.nulls().cloned(),
)?))
}
pub(crate) fn cast_list_view<I: OffsetSizeTrait, O: OffsetSizeTrait>(
array: &dyn Array,
to_field: &FieldRef,
cast_options: &CastOptions,
) -> Result<ArrayRef, ArrowError> {
let list_view = array.as_list_view::<I>();
let (_field, offsets, sizes, values, nulls) = list_view.clone().into_parts();
let values = cast_with_options(&values, to_field.data_type(), cast_options)?;
let new_offsets: Vec<_> = offsets.iter().map(|x| O::usize_as(x.as_usize())).collect();
let new_sizes: Vec<_> = sizes.iter().map(|x| O::usize_as(x.as_usize())).collect();
Ok(Arc::new(GenericListViewArray::<O>::try_new(
to_field.clone(),
new_offsets.into(),
new_sizes.into(),
values,
nulls,
)?))
}
pub(crate) fn cast_list_to_list_view<OffsetSize>(array: &dyn Array) -> Result<ArrayRef, ArrowError>
where
OffsetSize: OffsetSizeTrait,
{
let list = array.as_list::<OffsetSize>();
let list_view: GenericListViewArray<OffsetSize> = list.clone().into();
Ok(Arc::new(list_view))
}