Skip to content

Commit 2ad99ec

Browse files
authored
MutableArrayData support extend decimal data type (#1100)
* support extend decimal data type * add more test
1 parent 74591a5 commit 2ad99ec

File tree

2 files changed

+72
-2
lines changed

2 files changed

+72
-2
lines changed

arrow/src/array/data.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1208,7 +1208,7 @@ fn layout(data_type: &DataType) -> DataTypeLayout {
12081208
}
12091209
DataType::Dictionary(key_type, _value_type) => layout(key_type),
12101210
DataType::Decimal(_, _) => {
1211-
// Decimals are always some fixed width; The rust implemenation
1211+
// Decimals are always some fixed width; The rust implementation
12121212
// always uses 16 bytes / size of i128
12131213
DataTypeLayout::new_fixed_width(size_of::<i128>())
12141214
}

arrow/src/array/transform/mod.rs

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ fn build_extend_dictionary(
233233
fn build_extend(array: &ArrayData) -> Extend {
234234
use crate::datatypes::*;
235235
match array.data_type() {
236+
DataType::Decimal(_, _) => primitive::build_extend::<i128>(array),
236237
DataType::Null => null::build_extend(array),
237238
DataType::Boolean => boolean::build_extend(array),
238239
DataType::UInt8 => primitive::build_extend::<u8>(array),
@@ -281,6 +282,7 @@ fn build_extend(array: &ArrayData) -> Extend {
281282
fn build_extend_nulls(data_type: &DataType) -> ExtendNulls {
282283
use crate::datatypes::*;
283284
Box::new(match data_type {
285+
DataType::Decimal(_, _) => primitive::extend_nulls::<i128>,
284286
DataType::Null => null::extend_nulls,
285287
DataType::Boolean => boolean::extend_nulls,
286288
DataType::UInt8 => primitive::extend_nulls::<u8>,
@@ -423,7 +425,8 @@ impl<'a> MutableArrayData<'a> {
423425
};
424426

425427
let child_data = match &data_type {
426-
DataType::Null
428+
DataType::Decimal(_, _)
429+
| DataType::Null
427430
| DataType::Boolean
428431
| DataType::UInt8
429432
| DataType::UInt16
@@ -656,6 +659,7 @@ mod tests {
656659

657660
use super::*;
658661

662+
use crate::array::{DecimalArray, DecimalBuilder};
659663
use crate::{
660664
array::{
661665
Array, ArrayData, ArrayRef, BooleanArray, DictionaryArray,
@@ -671,6 +675,72 @@ mod tests {
671675
error::Result,
672676
};
673677

678+
fn create_decimal_array(
679+
array: &[Option<i128>],
680+
precision: usize,
681+
scale: usize,
682+
) -> DecimalArray {
683+
let mut decimal_builder = DecimalBuilder::new(array.len(), precision, scale);
684+
for value in array {
685+
match value {
686+
None => {
687+
decimal_builder.append_null().unwrap();
688+
}
689+
Some(v) => {
690+
decimal_builder.append_value(*v).unwrap();
691+
}
692+
}
693+
}
694+
decimal_builder.finish()
695+
}
696+
697+
#[test]
698+
fn test_decimal() {
699+
let decimal_array =
700+
create_decimal_array(&[Some(1), Some(2), None, Some(3)], 10, 3);
701+
let arrays = vec![decimal_array.data()];
702+
let mut a = MutableArrayData::new(arrays, true, 3);
703+
a.extend(0, 0, 3);
704+
a.extend(0, 2, 3);
705+
let result = a.freeze();
706+
let array = DecimalArray::from(result);
707+
let expected = create_decimal_array(&[Some(1), Some(2), None, None], 10, 3);
708+
assert_eq!(array, expected);
709+
}
710+
#[test]
711+
fn test_decimal_offset() {
712+
let decimal_array =
713+
create_decimal_array(&[Some(1), Some(2), None, Some(3)], 10, 3);
714+
let decimal_array = decimal_array.slice(1, 3); // 2, null, 3
715+
let arrays = vec![decimal_array.data()];
716+
let mut a = MutableArrayData::new(arrays, true, 2);
717+
a.extend(0, 0, 2); // 2, null
718+
let result = a.freeze();
719+
let array = DecimalArray::from(result);
720+
let expected = create_decimal_array(&[Some(2), None], 10, 3);
721+
assert_eq!(array, expected);
722+
}
723+
724+
#[test]
725+
fn test_decimal_null_offset_nulls() {
726+
let decimal_array =
727+
create_decimal_array(&[Some(1), Some(2), None, Some(3)], 10, 3);
728+
let decimal_array = decimal_array.slice(1, 3); // 2, null, 3
729+
let arrays = vec![decimal_array.data()];
730+
let mut a = MutableArrayData::new(arrays, true, 2);
731+
a.extend(0, 0, 2); // 2, null
732+
a.extend_nulls(3); // 2, null, null, null, null
733+
a.extend(0, 1, 3); //2, null, null, null, null, null, 3
734+
let result = a.freeze();
735+
let array = DecimalArray::from(result);
736+
let expected = create_decimal_array(
737+
&[Some(2), None, None, None, None, None, Some(3)],
738+
10,
739+
3,
740+
);
741+
assert_eq!(array, expected);
742+
}
743+
674744
/// tests extending from a primitive array w/ offset nor nulls
675745
#[test]
676746
fn test_primitive() {

0 commit comments

Comments
 (0)