Skip to content

Commit e8fa76a

Browse files
committed
drop alparray
Signed-off-by: Robert Kruszewski <[email protected]>
1 parent f3ee1de commit e8fa76a

File tree

3 files changed

+47
-34
lines changed

3 files changed

+47
-34
lines changed

encodings/alp/benches/alp_compress.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ fn decompress_alp<T: ALPFloat + NativePType>(bencher: Bencher, args: (usize, f64
9292
)
9393
.unwrap()
9494
})
95-
.bench_values(|array| decompress(&array));
95+
.bench_values(|array| decompress(array));
9696
}
9797

9898
#[divan::bench(types = [f32, f64], args = [10_000, 100_000])]

encodings/alp/src/alp/array.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,6 @@ impl ArrayVTable<ALPVTable> for ALPVTable {
282282

283283
impl CanonicalVTable<ALPVTable> for ALPVTable {
284284
fn canonicalize(array: &ALPArray) -> Canonical {
285-
Canonical::Primitive(decompress(array))
285+
Canonical::Primitive(decompress(array.clone()))
286286
}
287287
}

encodings/alp/src/alp/compress.rs

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,12 @@ where
129129
/// # Returns
130130
///
131131
/// A `PrimitiveArray` containing the decompressed floating-point values with all patches applied.
132-
pub fn decompress(array: &ALPArray) -> PrimitiveArray {
133-
if let Some(patches) = array.patches()
132+
pub fn decompress(array: ALPArray) -> PrimitiveArray {
133+
let patches = array.patches().cloned();
134+
if let Some(patches) = patches
134135
&& let Some(chunk_offsets) = patches.chunk_offsets()
135136
{
136-
return decompress_chunked(array, patches, &chunk_offsets.as_ref().to_primitive());
137+
return decompress_chunked(array, &patches, &chunk_offsets.as_ref().to_primitive());
137138
}
138139

139140
decompress_unchunked(array)
@@ -154,31 +155,36 @@ pub fn decompress(array: &ALPArray) -> PrimitiveArray {
154155
/// A `PrimitiveArray` containing the decompressed values with all patches applied.
155156
#[allow(clippy::cognitive_complexity)]
156157
pub fn decompress_chunked(
157-
array: &ALPArray,
158+
array: ALPArray,
158159
patches: &Patches,
159160
patches_chunk_offsets: &PrimitiveArray,
160161
) -> PrimitiveArray {
161-
let alp_encoded = array.encoded().to_primitive();
162-
let validity = alp_encoded.validity().clone();
162+
let encoded = array.encoded().to_primitive();
163+
let validity = encoded.validity().clone();
163164

164165
let patches_indices = patches.indices().as_ref().to_primitive();
165166
let patches_values = patches.values().as_ref().to_primitive();
166-
167-
match_each_alp_float_ptype!(array.dtype().as_ptype(), |T| {
167+
let ptype = array.dtype().as_ptype();
168+
let array_len = array.len();
169+
let exponents = array.exponents();
170+
let patches_offset = patches.offset();
171+
172+
// We need to drop ALPArray here in case converting encoded buffer into primitive didn't create a copy. In that case
173+
// both alp_encoded and array will hold a reference to the buffer we want to mutate.
174+
drop(array);
175+
176+
match_each_alp_float_ptype!(ptype, |T| {
177+
let patches_values = patches_values.as_slice::<T>();
178+
let mut alp_buffer = encoded.into_buffer_mut();
168179
match_each_unsigned_integer_ptype!(patches_chunk_offsets.ptype(), |C| {
180+
let patches_chunk_offsets = patches_chunk_offsets.as_slice::<C>();
169181
match_each_unsigned_integer_ptype!(patches_indices.ptype(), |I| {
170182
let patches_indices = patches_indices.as_slice::<I>();
171-
let patches_values = patches_values.as_slice::<T>();
172-
let patches_chunk_offsets = patches_chunk_offsets.as_slice::<C>();
173-
174-
let mut alp_buffer = alp_encoded.into_buffer_mut();
175-
let array_len = array.len();
176-
let patches_offset = patches.offset();
177183

178184
for (chunk_idx, chunk_start) in (0..array_len).step_by(1024).enumerate() {
179185
let chunk_end = (chunk_start + 1024).min(array_len);
180186
let chunk_slice = &mut alp_buffer.as_mut_slice()[chunk_start..chunk_end];
181-
<T>::decode_slice_inplace(chunk_slice, array.exponents());
187+
<T>::decode_slice_inplace(chunk_slice, exponents);
182188

183189
let decoded_chunk: &mut [T] = unsafe { transmute(chunk_slice) };
184190
PrimitiveArray::patch_chunk(
@@ -201,19 +207,26 @@ pub fn decompress_chunked(
201207
/// Decompresses an ALP-encoded array without chunk offsets.
202208
///
203209
/// This function decodes the complete array at once and then applies any patches after.
204-
fn decompress_unchunked(array: &ALPArray) -> PrimitiveArray {
210+
fn decompress_unchunked(array: ALPArray) -> PrimitiveArray {
211+
let patches = array.patches().cloned();
205212
let encoded = array.encoded().to_primitive();
206213
let validity = encoded.validity().clone();
214+
let exponents = array.exponents();
215+
let ptype = array.dtype().as_ptype();
216+
217+
// We need to drop ALPArray here in case converting encoded buffer into primitive didn't create a copy. In that case
218+
// both alp_encoded and array will hold a reference to the buffer we want to mutate.
219+
drop(array);
207220

208-
let decoded = match_each_alp_float_ptype!(array.dtype().as_ptype(), |T| {
221+
let decoded = match_each_alp_float_ptype!(ptype, |T| {
209222
PrimitiveArray::new::<T>(
210-
<T>::decode_buffer(encoded.into_buffer_mut(), array.exponents()),
223+
<T>::decode_buffer(encoded.into_buffer_mut(), exponents),
211224
validity,
212225
)
213226
});
214227

215-
if let Some(patches) = array.patches() {
216-
decoded.patch(patches)
228+
if let Some(patches) = patches {
229+
decoded.patch(&patches)
217230
} else {
218231
decoded
219232
}
@@ -240,7 +253,7 @@ mod tests {
240253
assert_arrays_eq!(encoded.encoded(), expected_encoded);
241254
assert_eq!(encoded.exponents(), Exponents { e: 9, f: 6 });
242255

243-
let decoded = decompress(&encoded);
256+
let decoded = decompress(encoded);
244257
assert_arrays_eq!(decoded, array);
245258
}
246259

@@ -253,7 +266,7 @@ mod tests {
253266
assert_arrays_eq!(encoded.encoded(), expected_encoded);
254267
assert_eq!(encoded.exponents(), Exponents { e: 9, f: 6 });
255268

256-
let decoded = decompress(&encoded);
269+
let decoded = decompress(encoded);
257270
let expected = PrimitiveArray::from_option_iter(vec![None, Some(1.234f32), None]);
258271
assert_arrays_eq!(decoded, expected);
259272
}
@@ -269,7 +282,7 @@ mod tests {
269282
assert_arrays_eq!(encoded.encoded(), expected_encoded);
270283
assert_eq!(encoded.exponents(), Exponents { e: 16, f: 13 });
271284

272-
let decoded = decompress(&encoded);
285+
let decoded = decompress(encoded);
273286
let expected_decoded = PrimitiveArray::new(values, Validity::NonNullable);
274287
assert_arrays_eq!(decoded, expected_decoded);
275288
}
@@ -286,7 +299,7 @@ mod tests {
286299
assert_arrays_eq!(encoded.encoded(), expected_encoded);
287300
assert_eq!(encoded.exponents(), Exponents { e: 16, f: 13 });
288301

289-
let decoded = decompress(&encoded);
302+
let decoded = decompress(encoded);
290303
assert_arrays_eq!(decoded, array);
291304
}
292305

@@ -305,9 +318,9 @@ mod tests {
305318

306319
assert_eq!(encoded.exponents(), Exponents { e: 16, f: 13 });
307320

308-
assert_arrays_eq!(&encoded, array);
321+
assert_arrays_eq!(encoded, array);
309322

310-
let _decoded = decompress(&encoded);
323+
let _decoded = decompress(encoded);
311324
}
312325

313326
#[test]
@@ -513,7 +526,7 @@ mod tests {
513526
let encoded = alp_encode(&array, None).unwrap();
514527

515528
assert!(encoded.patches().is_none());
516-
let decoded = decompress(&encoded);
529+
let decoded = decompress(encoded);
517530
assert_eq!(array.as_slice::<f32>(), decoded.as_slice::<f32>());
518531
}
519532

@@ -524,7 +537,7 @@ mod tests {
524537
let encoded = alp_encode(&array, None).unwrap();
525538

526539
assert!(encoded.patches().is_none());
527-
let decoded = decompress(&encoded);
540+
let decoded = decompress(encoded);
528541
assert_eq!(array.as_slice::<f64>(), decoded.as_slice::<f64>());
529542
}
530543

@@ -541,7 +554,7 @@ mod tests {
541554
let encoded = alp_encode(&array, None).unwrap();
542555

543556
assert!(encoded.patches().is_some());
544-
let decoded = decompress(&encoded);
557+
let decoded = decompress(encoded);
545558
assert_eq!(values.as_slice(), decoded.as_slice::<f32>());
546559
}
547560

@@ -562,7 +575,7 @@ mod tests {
562575
let encoded = alp_encode(&array, None).unwrap();
563576

564577
assert!(encoded.patches().is_some());
565-
let decoded = decompress(&encoded);
578+
let decoded = decompress(encoded);
566579

567580
for idx in 0..size {
568581
let decoded_val = decoded.as_slice::<f64>()[idx];
@@ -589,7 +602,7 @@ mod tests {
589602

590603
let array = PrimitiveArray::from_option_iter(values);
591604
let encoded = alp_encode(&array, None).unwrap();
592-
let decoded = decompress(&encoded);
605+
let decoded = decompress(encoded);
593606

594607
assert_arrays_eq!(decoded, array);
595608
}
@@ -609,7 +622,7 @@ mod tests {
609622

610623
let array = PrimitiveArray::new(Buffer::from(values), validity);
611624
let encoded = alp_encode(&array, None).unwrap();
612-
let decoded = decompress(&encoded);
625+
let decoded = decompress(encoded);
613626

614627
assert_arrays_eq!(decoded, array);
615628
}

0 commit comments

Comments
 (0)