vortex_roaring/integer/
compress.rs1use croaring::Bitmap;
2use num_traits::NumCast;
3use vortex_array::array::PrimitiveArray;
4use vortex_array::variants::PrimitiveArrayTrait;
5use vortex_dtype::{NativePType, PType};
6use vortex_error::{vortex_bail, vortex_err, VortexResult};
7
8use crate::RoaringIntArray;
9
10pub fn roaring_int_encode(parray: PrimitiveArray) -> VortexResult<RoaringIntArray> {
11 match parray.ptype() {
12 PType::U8 => roaring_encode_primitive::<u8>(parray.maybe_null_slice()),
13 PType::U16 => roaring_encode_primitive::<u16>(parray.maybe_null_slice()),
14 PType::U32 => roaring_encode_primitive::<u32>(parray.maybe_null_slice()),
15 PType::U64 => roaring_encode_primitive::<u64>(parray.maybe_null_slice()),
16 _ => vortex_bail!("Unsupported PType {}", parray.ptype()),
17 }
18}
19
20fn roaring_encode_primitive<T: NumCast + NativePType>(
21 values: &[T],
22) -> VortexResult<RoaringIntArray> {
23 let mut bitmap = Bitmap::new();
24 bitmap.extend(
25 values
26 .iter()
27 .map(|i| {
28 i.to_u32()
29 .ok_or_else(|| vortex_err!("Failed to cast value {} to u32", i))
30 })
31 .collect::<VortexResult<Vec<u32>>>()?,
32 );
33 bitmap.run_optimize();
34 bitmap.shrink_to_fit();
35 RoaringIntArray::try_new(bitmap, T::PTYPE)
36}