use vortex_array::ArrayRef;
use vortex_array::ExecutionCtx;
use vortex_array::IntoArray;
use vortex_array::arrays::ConstantArray;
use vortex_array::arrays::PrimitiveArray;
use vortex_array::arrays::primitive::PrimitiveArrayExt;
use vortex_array::patches::Patches;
use vortex_error::VortexError;
use vortex_error::VortexResult;
pub fn compress_patches(patches: Patches, ctx: &mut ExecutionCtx) -> VortexResult<Patches> {
let indices = patches
.indices()
.clone()
.execute::<PrimitiveArray>(ctx)?
.narrow()?
.into_array();
let values = patches.values();
let values = if values
.statistics()
.compute_is_constant(ctx)
.unwrap_or_default()
{
ConstantArray::new(values.execute_scalar(0, ctx)?, values.len()).into_array()
} else {
values.clone()
};
let chunk_offsets = patches
.chunk_offsets()
.as_ref()
.map(|offsets| {
let offsets_primitive = offsets
.clone()
.execute::<PrimitiveArray>(ctx)?
.narrow()?
.into_array();
Ok::<ArrayRef, VortexError>(offsets_primitive)
})
.transpose()?;
Patches::new(
patches.array_len(),
patches.offset(),
indices,
values,
chunk_offsets,
)
}