Skip to content

Commit 5e63d81

Browse files
authored
better decimal array (#474)
Previously it was compressed with fixed-len array. it does not have to be.
1 parent f3a8da2 commit 5e63d81

File tree

4 files changed

+689
-12
lines changed

4 files changed

+689
-12
lines changed

src/storage/src/cache/transcode.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ use arrow_schema::{DataType, TimeUnit};
77
use crate::liquid_array::byte_view_array::ByteViewBuildOptions;
88
use crate::liquid_array::raw::FsstArray;
99
use crate::liquid_array::{
10-
LiquidArrayRef, LiquidByteViewArray, LiquidFixedLenByteArray, LiquidFloatArray,
11-
LiquidPrimitiveArray,
10+
LiquidArrayRef, LiquidByteViewArray, LiquidDecimalArray, LiquidFixedLenByteArray,
11+
LiquidFloatArray, LiquidPrimitiveArray,
1212
};
1313

1414
use super::{CacheExpression, utils::LiquidCompressorStates};
@@ -113,38 +113,40 @@ pub fn transcode_liquid_inner_with_hint<'a>(
113113
array.as_primitive::<Float64Type>().clone(),
114114
)),
115115
DataType::Decimal128(_, _) => {
116+
let decimals = array.as_primitive::<Decimal128Type>();
117+
if LiquidDecimalArray::fits_u64(decimals) {
118+
return Ok(Arc::new(LiquidDecimalArray::from_decimal_array(decimals)));
119+
}
116120
let liquid_array = with_fsst_compressor_or_train(
117121
state,
118122
|compressor| {
119123
Arc::new(LiquidFixedLenByteArray::from_decimal_array(
120-
array.as_primitive::<Decimal128Type>(),
121-
compressor,
124+
decimals, compressor,
122125
))
123126
},
124127
|| {
125128
let (compressor, liquid_array) =
126-
LiquidFixedLenByteArray::train_from_decimal_array(
127-
array.as_primitive::<Decimal128Type>(),
128-
);
129+
LiquidFixedLenByteArray::train_from_decimal_array(decimals);
129130
(compressor, Arc::new(liquid_array))
130131
},
131132
);
132133
return Ok(liquid_array);
133134
}
134135
DataType::Decimal256(_, _) => {
136+
let decimals = array.as_primitive::<Decimal256Type>();
137+
if LiquidDecimalArray::fits_u64(decimals) {
138+
return Ok(Arc::new(LiquidDecimalArray::from_decimal_array(decimals)));
139+
}
135140
let liquid_array = with_fsst_compressor_or_train(
136141
state,
137142
|compressor| {
138143
Arc::new(LiquidFixedLenByteArray::from_decimal_array(
139-
array.as_primitive::<Decimal256Type>(),
140-
compressor,
144+
decimals, compressor,
141145
))
142146
},
143147
|| {
144148
let (compressor, liquid_array) =
145-
LiquidFixedLenByteArray::train_from_decimal_array(
146-
array.as_primitive::<Decimal256Type>(),
147-
);
149+
LiquidFixedLenByteArray::train_from_decimal_array(decimals);
148150
(compressor, Arc::new(liquid_array))
149151
},
150152
);

0 commit comments

Comments
 (0)