Skip to content

Commit fe50481

Browse files
authored
Avoid unnecessary backtrace generation (#1353)
Fixes #1352
1 parent 7bcda5c commit fe50481

File tree

1 file changed

+35
-48
lines changed

1 file changed

+35
-48
lines changed

vortex-array/src/array/constant/canonical.rs

Lines changed: 35 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use arrow_array::builder::make_view;
22
use arrow_buffer::{BooleanBuffer, BufferBuilder};
33
use vortex_buffer::Buffer;
44
use vortex_dtype::{match_each_native_ptype, DType, Nullability, PType};
5-
use vortex_error::{vortex_bail, vortex_panic, VortexResult};
5+
use vortex_error::{vortex_bail, VortexResult};
66
use vortex_scalar::{BinaryScalar, BoolScalar, ExtScalar, Scalar, Utf8Scalar};
77

88
use crate::array::constant::ConstantArray;
@@ -25,58 +25,45 @@ impl IntoCanonical for ConstantArray {
2525
},
2626
};
2727

28-
if let Ok(b) = BoolScalar::try_from(scalar) {
29-
return Ok(Canonical::Bool(BoolArray::try_new(
30-
if b.value().unwrap_or_default() {
28+
Ok(match self.dtype() {
29+
DType::Null => Canonical::Null(NullArray::new(self.len())),
30+
DType::Bool(..) => Canonical::Bool(BoolArray::try_new(
31+
if BoolScalar::try_from(scalar)?.value().unwrap_or_default() {
3132
BooleanBuffer::new_set(self.len())
3233
} else {
3334
BooleanBuffer::new_unset(self.len())
3435
},
3536
validity,
36-
)?));
37-
}
38-
39-
if let Ok(s) = Utf8Scalar::try_from(scalar) {
40-
let value = s.value();
41-
let const_value = value.as_ref().map(|v| v.as_bytes());
42-
43-
return canonical_byte_view(const_value, self.dtype(), self.len())
44-
.map(Canonical::VarBinView);
45-
}
46-
47-
if let Ok(b) = BinaryScalar::try_from(scalar) {
48-
let value = b.value();
49-
let const_value = value.as_ref().map(|v| v.as_slice());
50-
51-
return canonical_byte_view(const_value, self.dtype(), self.len())
52-
.map(Canonical::VarBinView);
53-
}
54-
55-
if let Ok(ptype) = PType::try_from(scalar.dtype()) {
56-
return match_each_native_ptype!(ptype, |$P| {
57-
Ok(Canonical::Primitive(PrimitiveArray::from_vec::<$P>(
58-
vec![$P::try_from(scalar).unwrap_or_else(|_| $P::default()); self.len()],
59-
validity,
60-
)))
61-
});
62-
}
63-
64-
if matches!(self.dtype(), DType::Null) {
65-
return Ok(Canonical::Null(NullArray::new(self.len())));
66-
}
67-
68-
if let Ok(s) = ExtScalar::try_from(scalar) {
69-
let DType::Extension(ext_dtype) = s.dtype() else {
70-
vortex_panic!("ExtScalar has a non-ext dtype {}", s.dtype());
71-
};
72-
73-
let storage_dtype = ext_dtype.storage_dtype();
74-
let storage_scalar = Scalar::new(storage_dtype.clone(), s.value().clone());
75-
let storage_array = ConstantArray::new(storage_scalar, self.len()).into_array();
76-
return ExtensionArray::new(ext_dtype.clone(), storage_array).into_canonical();
77-
}
78-
79-
vortex_bail!("Unsupported scalar type {}", self.dtype())
37+
)?),
38+
DType::Primitive(ptype, ..) => {
39+
match_each_native_ptype!(ptype, |$P| {
40+
Canonical::Primitive(PrimitiveArray::from_vec::<$P>(
41+
vec![$P::try_from(scalar).unwrap_or_else(|_| $P::default()); self.len()],
42+
validity,
43+
))
44+
})
45+
}
46+
DType::Utf8(_) => {
47+
let value = Utf8Scalar::try_from(scalar)?.value();
48+
let const_value = value.as_ref().map(|v| v.as_bytes());
49+
Canonical::VarBinView(canonical_byte_view(const_value, self.dtype(), self.len())?)
50+
}
51+
DType::Binary(_) => {
52+
let value = BinaryScalar::try_from(scalar)?.value();
53+
let const_value = value.as_ref().map(|v| v.as_slice());
54+
Canonical::VarBinView(canonical_byte_view(const_value, self.dtype(), self.len())?)
55+
}
56+
DType::Struct(..) => vortex_bail!("Unsupported scalar type {}", self.dtype()),
57+
DType::List(..) => vortex_bail!("Unsupported scalar type {}", self.dtype()),
58+
DType::Extension(ext_dtype) => {
59+
let s = ExtScalar::try_from(scalar)?;
60+
61+
let storage_dtype = ext_dtype.storage_dtype();
62+
let storage_scalar = Scalar::new(storage_dtype.clone(), s.value().clone());
63+
let storage_array = ConstantArray::new(storage_scalar, self.len()).into_array();
64+
ExtensionArray::new(ext_dtype.clone(), storage_array).into_canonical()?
65+
}
66+
})
8067
}
8168
}
8269

0 commit comments

Comments
 (0)