Skip to content

Commit 021cbe8

Browse files
authored
Add maybe_from function to help downcast ArrayData into a specific encoded array without potentially capturing a backtrace (#1560)
closes #1377
1 parent ba5e7b4 commit 021cbe8

File tree

14 files changed

+25
-24
lines changed

14 files changed

+25
-24
lines changed

bench-vortex/benches/compress.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ fn parquet_decompress_read(buf: bytes::Bytes) -> usize {
104104
}
105105

106106
fn parquet_compressed_written_size(array: &ArrayData, compression: Compression) -> usize {
107-
let chunked = ChunkedArray::try_from(array.clone()).unwrap();
107+
let chunked = ChunkedArray::maybe_from(array.clone()).unwrap();
108108
let (batches, schema) = chunked_to_vec_record_batch(chunked);
109109
parquet_compress_write(batches, schema, compression, &mut Vec::new())
110110
}

encodings/alp/src/alp/array.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ impl ALPArray {
7777
}
7878

7979
pub fn encode(array: ArrayData) -> VortexResult<ArrayData> {
80-
if let Ok(parray) = PrimitiveArray::try_from(array) {
80+
if let Some(parray) = PrimitiveArray::maybe_from(array) {
8181
Ok(alp_encode(&parray)?.into_array())
8282
} else {
8383
vortex_bail!("ALP can only encode primitive arrays");

encodings/fastlanes/src/bitpacking/compute/search_sorted.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ impl<'a, T: BitPacking + NativePType> BitPackedSearch<'a, T> {
147147
let min_patch_offset = array
148148
.patches()
149149
.and_then(|p| {
150-
SparseArray::try_from(p)
150+
SparseArray::maybe_from(p)
151151
.vortex_expect("Only sparse patches are supported")
152152
.min_index()
153153
})

encodings/fastlanes/src/bitpacking/compute/slice.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ impl SliceFn<BitPackedArray> for BitPackedEncoding {
3030
.filter(|a| {
3131
// If the sliced patch_indices is empty, we should not propagate the patches.
3232
// There may be other logic that depends on Some(patches) indicating non-empty.
33-
!SparseArray::try_from(a.clone())
33+
!SparseArray::maybe_from(a.clone())
3434
.vortex_expect("BitPackedArray must encode patches as SparseArray")
3535
.indices()
3636
.is_empty()

vortex-array/src/array/extension/compute/compare.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use vortex_error::VortexResult;
22

33
use crate::array::{ConstantArray, ExtensionArray, ExtensionEncoding};
44
use crate::compute::{compare, CompareFn, Operator};
5-
use crate::encoding::EncodingVTable;
65
use crate::{ArrayData, ArrayLen};
76

87
impl CompareFn<ExtensionArray> for ExtensionEncoding {
@@ -24,8 +23,7 @@ impl CompareFn<ExtensionArray> for ExtensionEncoding {
2423
}
2524

2625
// If the RHS is an extension array matching ours, we can extract the storage.
27-
if rhs.is_encoding(ExtensionEncoding.id()) {
28-
let rhs_ext = ExtensionArray::try_from(rhs.clone())?;
26+
if let Some(rhs_ext) = ExtensionArray::maybe_from(rhs.clone()) {
2927
return compare(lhs.storage(), rhs_ext.storage(), operator).map(Some);
3028
}
3129

vortex-array/src/macros.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@ macro_rules! impl_encoding {
5858
stats
5959
)?)
6060
}
61+
62+
/// Optionally downcast an [`ArrayData`](crate::ArrayData) instance to a specific encoding.
63+
///
64+
/// Preferred in cases where a backtrace isn't needed, like when trying multiple encoding to go
65+
/// down different code paths.
66+
pub fn maybe_from(data: $crate::ArrayData) -> Option<Self> {
67+
(data.encoding().id() == <[<$Name Encoding>] as $crate::encoding::Encoding>::ID).then_some(Self(data))
68+
}
6169
}
6270

6371
impl TryFrom<$crate::ArrayData> for [<$Name Array>] {

vortex-ipc/src/stream_writer/mod.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ use std::fmt::{Display, Formatter};
22
use std::ops::Range;
33

44
use futures_util::{Stream, TryStreamExt};
5-
use vortex_array::array::{ChunkedArray, ChunkedEncoding};
6-
use vortex_array::encoding::EncodingVTable;
5+
use vortex_array::array::ChunkedArray;
76
use vortex_array::stream::ArrayStream;
87
use vortex_array::ArrayData;
98
use vortex_buffer::Buffer;
@@ -83,9 +82,8 @@ impl<W: VortexWrite> StreamArrayWriter<W> {
8382
}
8483

8584
pub async fn write_array(self, array: ArrayData) -> VortexResult<Self> {
86-
if array.is_encoding(ChunkedEncoding.id()) {
87-
self.write_array_stream(ChunkedArray::try_from(array)?.array_stream())
88-
.await
85+
if let Some(chunked_array) = ChunkedArray::maybe_from(array.clone()) {
86+
self.write_array_stream(chunked_array.array_stream()).await
8987
} else {
9088
self.write_array_stream(array.into_array_stream()).await
9189
}

vortex-sampling-compressor/src/compressors/alp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ impl EncodingCompressor for ALPCompressor {
2626

2727
fn can_compress(&self, array: &ArrayData) -> Option<&dyn EncodingCompressor> {
2828
// Only support primitive arrays
29-
let parray = PrimitiveArray::try_from(array.clone()).ok()?;
29+
let parray = PrimitiveArray::maybe_from(array.clone())?;
3030

3131
// Only supports f32 and f64
3232
if !matches!(parray.ptype(), PType::F32 | PType::F64) {

vortex-sampling-compressor/src/compressors/alp_rd.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ impl EncodingCompressor for ALPRDCompressor {
3535

3636
fn can_compress(&self, array: &ArrayData) -> Option<&dyn EncodingCompressor> {
3737
// Only support primitive arrays
38-
let parray = PrimitiveArray::try_from(array.clone()).ok()?;
38+
let parray = PrimitiveArray::maybe_from(array.clone())?;
3939

4040
// Only supports f32 and f64
4141
if !matches!(parray.ptype(), PType::F32 | PType::F64) {

vortex-sampling-compressor/src/compressors/bitpacked.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ impl EncodingCompressor for BitPackedCompressor {
5454

5555
fn can_compress(&self, array: &ArrayData) -> Option<&dyn EncodingCompressor> {
5656
// Only support primitive arrays
57-
let parray = PrimitiveArray::try_from(array.clone()).ok()?;
57+
let parray = PrimitiveArray::maybe_from(array.clone())?;
5858

5959
// Only supports unsigned ints
6060
if !parray.ptype().is_unsigned_int() {

0 commit comments

Comments
 (0)