Skip to content

Commit 2e0b1e2

Browse files
committed
Reuse fixed-width storage for decimal arrays
Signed-off-by: Connor Tsui <connor.tsui20@gmail.com>
1 parent a371bd1 commit 2e0b1e2

2 files changed

Lines changed: 22 additions & 26 deletions

File tree

vortex-array/src/arrays/decimal/array.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ use crate::array::validity_to_child;
2828
use crate::arrays::Decimal;
2929
use crate::arrays::DecimalArray;
3030
use crate::arrays::PrimitiveArray;
31+
use crate::arrays::fixed_width::FixedWidth;
32+
use crate::arrays::fixed_width::FixedWidthData;
3133
use crate::arrays::primitive::PrimitiveArrayExt;
3234
use crate::buffer::BufferHandle;
3335
use crate::dtype::BigCast;
@@ -107,7 +109,7 @@ pub(super) const SLOT_NAMES: [&str; NUM_SLOTS] = ["validity"];
107109
#[derive(Clone, Debug)]
108110
pub struct DecimalData {
109111
pub(super) decimal_dtype: DecimalDType,
110-
pub(super) values: BufferHandle,
112+
pub(super) values: FixedWidthData,
111113
pub(super) values_type: DecimalType,
112114
}
113115

@@ -121,6 +123,16 @@ impl Display for DecimalData {
121123
}
122124
}
123125

126+
impl FixedWidth for DecimalData {
127+
fn fixed_width(&self) -> &FixedWidthData {
128+
&self.values
129+
}
130+
131+
fn fixed_width_mut(&mut self) -> &mut FixedWidthData {
132+
&mut self.values
133+
}
134+
}
135+
124136
pub struct DecimalDataParts {
125137
pub decimal_dtype: DecimalDType,
126138
pub values: BufferHandle,
@@ -287,7 +299,7 @@ impl DecimalData {
287299
) -> Self {
288300
Self {
289301
decimal_dtype,
290-
values,
302+
values: FixedWidthData::new(values),
291303
values_type,
292304
}
293305
}
@@ -391,7 +403,7 @@ impl Array<Decimal> {
391403
let data = self.into_data();
392404
DecimalDataParts {
393405
decimal_dtype,
394-
values: data.values,
406+
values: data.values.into_buffer_handle(),
395407
values_type: data.values_type,
396408
validity,
397409
}

vortex-array/src/arrays/decimal/vtable/mod.rs

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use vortex_buffer::Alignment;
88
use vortex_error::VortexResult;
99
use vortex_error::vortex_bail;
1010
use vortex_error::vortex_ensure;
11-
use vortex_error::vortex_panic;
1211
use vortex_session::VortexSession;
1312

1413
use crate::ArrayParts;
@@ -19,6 +18,7 @@ use crate::array::Array;
1918
use crate::array::ArrayView;
2019
use crate::array::VTable;
2120
use crate::arrays::decimal::DecimalData;
21+
use crate::arrays::fixed_width;
2222
use crate::buffer::BufferHandle;
2323
use crate::builders::ArrayBuilder;
2424
use crate::builders::DecimalBuilder;
@@ -80,40 +80,24 @@ impl VTable for Decimal {
8080
*ID
8181
}
8282

83-
fn nbuffers(_array: ArrayView<'_, Self>) -> usize {
84-
1
83+
fn nbuffers(array: ArrayView<'_, Self>) -> usize {
84+
fixed_width::nbuffers(array)
8585
}
8686

8787
fn buffer(array: ArrayView<'_, Self>, idx: usize) -> BufferHandle {
88-
match idx {
89-
0 => array.values.clone(),
90-
_ => vortex_panic!("DecimalArray buffer index {idx} out of bounds"),
91-
}
88+
fixed_width::buffer(array, idx)
9289
}
9390

94-
fn buffer_name(_array: ArrayView<'_, Self>, idx: usize) -> Option<String> {
95-
match idx {
96-
0 => Some("values".to_string()),
97-
_ => None,
98-
}
91+
fn buffer_name(array: ArrayView<'_, Self>, idx: usize) -> Option<String> {
92+
fixed_width::buffer_name(array, idx)
9993
}
10094

10195
fn with_buffers(
10296
&self,
10397
array: ArrayView<'_, Self>,
10498
buffers: &[BufferHandle],
10599
) -> VortexResult<ArrayParts<Self>> {
106-
vortex_ensure!(
107-
buffers.len() == 1,
108-
"Expected 1 buffer, got {}",
109-
buffers.len()
110-
);
111-
let mut data = array.data().clone();
112-
data.values = buffers[0].clone();
113-
Ok(
114-
ArrayParts::new(self.clone(), array.dtype().clone(), array.len(), data)
115-
.with_slots(array.slots().iter().cloned().collect()),
116-
)
100+
fixed_width::with_buffers(self, array, buffers)
117101
}
118102

119103
fn serialize(

0 commit comments

Comments
 (0)