Skip to content

Commit cce61ed

Browse files
committed
perf(array): reuse canonical decimal operands directly
Signed-off-by: Connor Tsui <connor.tsui20@gmail.com>
1 parent 100c519 commit cce61ed

2 files changed

Lines changed: 31 additions & 1 deletion

File tree

‎vortex-array/src/scalar_fn/fns/binary/numeric/decimal.rs‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,13 @@ use vortex_mask::Mask;
3838

3939
use super::checked::checked_lanes;
4040
use crate::ArrayRef;
41+
use crate::Canonical;
4142
use crate::Columnar;
4243
use crate::ExecutionCtx;
4344
use crate::IntoArray;
4445
use crate::arrays::Constant;
4546
use crate::arrays::ConstantArray;
47+
use crate::arrays::Decimal;
4648
use crate::arrays::DecimalArray;
4749
use crate::arrays::decimal::widened_buffer;
4850
use crate::dtype::BigCast;
@@ -145,7 +147,10 @@ enum DecimalOperand {
145147

146148
impl DecimalOperand {
147149
fn try_new(array: &ArrayRef, ctx: &mut ExecutionCtx) -> VortexResult<Option<Self>> {
148-
let columnar = array.clone().execute::<Columnar>(ctx)?;
150+
let columnar = match array.as_opt::<Decimal>() {
151+
Some(array) => Columnar::Canonical(Canonical::Decimal(array.into_owned())),
152+
None => array.clone().execute::<Columnar>(ctx)?,
153+
};
149154

150155
match columnar {
151156
Columnar::Constant(array) => match array.scalar().as_decimal().decimal_value() {

‎vortex-array/src/scalar_fn/fns/binary/numeric/tests.rs‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use crate::VortexSessionExecute;
1515
use crate::array_session;
1616
use crate::arrays::ConstantArray;
1717
use crate::arrays::DecimalArray;
18+
use crate::arrays::DictArray;
1819
use crate::arrays::PrimitiveArray;
1920
use crate::assert_arrays_eq;
2021
use crate::builtins::ArrayBuiltins;
@@ -420,6 +421,30 @@ fn test_decimal_mixed_storage_widths() -> VortexResult<()> {
420421
Ok(())
421422
}
422423

424+
#[test]
425+
fn test_decimal_encoded_integer_child() -> VortexResult<()> {
426+
let mut ctx = array_session().create_execution_ctx();
427+
let dtype = DecimalDType::new(10, 2);
428+
let values = DictArray::try_new(
429+
buffer![0u8, 1, 0].into_array(),
430+
PrimitiveArray::from_option_iter([Some(900i32), None]).into_array(),
431+
)?
432+
.into_array();
433+
let lhs = DecimalArray::from_integer_values(values, dtype)?.into_array();
434+
let rhs = DecimalArray::from_iter::<i64, _>([150, 225, 150], dtype).into_array();
435+
436+
let result = decimal_binary(lhs, rhs, Operator::Mul)?;
437+
assert_arrays_eq!(
438+
result,
439+
DecimalArray::from_option_iter::<i128, _>(
440+
[Some(135_000), None, Some(135_000)],
441+
result_decimal_dtype(dtype, NumericOperator::Mul)?,
442+
),
443+
&mut ctx
444+
);
445+
Ok(())
446+
}
447+
423448
#[test]
424449
fn test_decimal_nullable_lanes() -> VortexResult<()> {
425450
let mut ctx = array_session().create_execution_ctx();

0 commit comments

Comments
 (0)