diff --git a/encodings/alp/src/alp/compress.rs b/encodings/alp/src/alp/compress.rs index bdacb0be917..b7401eaa036 100644 --- a/encodings/alp/src/alp/compress.rs +++ b/encodings/alp/src/alp/compress.rs @@ -63,7 +63,7 @@ where { let values_slice = values.as_slice::(); - let (exponents, encoded, exceptional_positions, exceptional_values, chunk_offsets) = + let (exponents, encoded, exceptional_positions, exceptional_values, mut chunk_offsets) = T::encode(values_slice, exponents); let encoded_array = PrimitiveArray::new(encoded, values.validity().clone()).into_array(); @@ -82,7 +82,16 @@ where let (pos, vals): (BufferMut, BufferMut) = exceptional_positions .into_iter() .zip_eq(exceptional_values) - .filter(|(index, _)| is_valid.value(*index as usize)) + .filter(|(index, _)| { + let is_valid = is_valid.value(*index as usize); + if !is_valid { + let patch_chunk = *index as usize / 1024; + for chunk_idx in (patch_chunk + 1)..chunk_offsets.len() { + chunk_offsets[chunk_idx] -= 1; + } + } + is_valid + }) .unzip(); (pos.freeze(), vals.freeze()) } diff --git a/encodings/alp/src/alp/mod.rs b/encodings/alp/src/alp/mod.rs index 457c883d86a..6a42da28ba3 100644 --- a/encodings/alp/src/alp/mod.rs +++ b/encodings/alp/src/alp/mod.rs @@ -127,7 +127,7 @@ pub trait ALPFloat: private::Sealed + Float + Display + NativePType { Buffer, Buffer, Buffer, - Buffer, + BufferMut, ) { let exp = exponents.unwrap_or_else(|| Self::find_best_exponents(values)); @@ -158,7 +158,7 @@ pub trait ALPFloat: private::Sealed + Float + Display + NativePType { encoded_output.freeze(), patch_indices.freeze(), patch_values.freeze(), - chunk_offsets.freeze(), + chunk_offsets, ) }