Skip to content

Commit 90de932

Browse files
authored
Fix serialization issue with nested unions (#110)
* Expand enum test coverage with nested unions * Fix implementation of len() in generated MutableArray for Unions * Fix test formatting * Test for dense-inside-sparse * Handle pushing None in Dense unions * CI cleanup for updated rust stable (1.69)
1 parent d517f07 commit 90de932

File tree

4 files changed

+49
-13
lines changed

4 files changed

+49
-13
lines changed

arrow2_convert/tests/test_enum.rs

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,32 +57,68 @@ fn test_nested_unit_variant() {
5757

5858
#[derive(Debug, PartialEq, ArrowField, ArrowSerialize, ArrowDeserialize)]
5959
#[arrow_field(type = "dense")]
60-
enum TestEnum {
60+
enum TestDenseEnum {
6161
VAL1,
6262
VAL2(i32),
6363
VAL3(f64),
6464
VAL4(TestStruct),
65-
VAL5(ChildEnum),
65+
VAL5(DenseChildEnum),
66+
VAL6(SparseChildEnum),
6667
}
6768

6869
#[derive(Debug, PartialEq, ArrowField, ArrowSerialize, ArrowDeserialize)]
6970
#[arrow_field(type = "sparse")]
70-
enum ChildEnum {
71+
enum TestSparseEnum {
72+
VAL1,
73+
VAL2(i32),
74+
VAL3(f64),
75+
VAL4(TestStruct),
76+
VAL5(DenseChildEnum),
77+
VAL6(SparseChildEnum),
78+
}
79+
80+
#[derive(Debug, PartialEq, ArrowField, ArrowSerialize, ArrowDeserialize)]
81+
#[arrow_field(type = "dense")]
82+
enum DenseChildEnum {
83+
VAL1,
84+
VAL2(i32),
85+
VAL3(f64),
86+
VAL4(TestStruct),
87+
}
88+
89+
#[derive(Debug, PartialEq, ArrowField, ArrowSerialize, ArrowDeserialize)]
90+
#[arrow_field(type = "sparse")]
91+
enum SparseChildEnum {
7192
VAL1,
7293
VAL2(i32),
7394
VAL3(f64),
7495
VAL4(TestStruct),
7596
}
7697

7798
let enums = vec![
78-
TestEnum::VAL1,
79-
TestEnum::VAL2(2),
80-
TestEnum::VAL3(1.2),
81-
TestEnum::VAL4(TestStruct { a1: 10 }),
99+
TestDenseEnum::VAL1,
100+
TestDenseEnum::VAL2(2),
101+
TestDenseEnum::VAL3(1.2),
102+
TestDenseEnum::VAL4(TestStruct { a1: 10 }),
103+
TestDenseEnum::VAL5(DenseChildEnum::VAL4(TestStruct { a1: 17 })),
104+
TestDenseEnum::VAL6(SparseChildEnum::VAL4(TestStruct { a1: 42 })),
82105
];
83106

84107
let b: Box<dyn Array> = enums.try_into_arrow().unwrap();
85-
let round_trip: Vec<TestEnum> = b.try_into_collection().unwrap();
108+
let round_trip: Vec<TestDenseEnum> = b.try_into_collection().unwrap();
109+
assert_eq!(round_trip, enums);
110+
111+
let enums = vec![
112+
TestSparseEnum::VAL1,
113+
TestSparseEnum::VAL2(2),
114+
TestSparseEnum::VAL3(1.2),
115+
TestSparseEnum::VAL4(TestStruct { a1: 10 }),
116+
TestSparseEnum::VAL5(DenseChildEnum::VAL4(TestStruct { a1: 17 })),
117+
TestSparseEnum::VAL6(SparseChildEnum::VAL4(TestStruct { a1: 42 })),
118+
];
119+
120+
let b: Box<dyn Array> = enums.try_into_arrow().unwrap();
121+
let round_trip: Vec<TestSparseEnum> = b.try_into_collection().unwrap();
86122
assert_eq!(round_trip, enums);
87123
}
88124

arrow2_convert/tests/test_serialize.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,14 @@ fn test_array() {
7373
#[test]
7474
fn test_buffer() {
7575
// Buffer<u8> and Vec<u8> should serialize into BinaryArray
76-
let dat: Vec<Buffer<u8>> = vec![(0..10).into_iter().collect()];
76+
let dat: Vec<Buffer<u8>> = vec![(0..10).collect()];
7777
let r: Box<dyn Array> = dat.try_into_arrow().unwrap();
7878
assert_eq!(r.len(), 1);
7979
assert_eq!(r.data_type(), &<Buffer<u8> as ArrowField>::data_type());
8080
assert_eq!(r.data_type(), &<Vec<u8> as ArrowField>::data_type());
8181

8282
// Buffer<u16> and Vec<u16> should serialize into ListArray
83-
let dat: Vec<Buffer<u16>> = vec![(0..10).into_iter().collect()];
83+
let dat: Vec<Buffer<u16>> = vec![(0..10).collect()];
8484
let r: Box<dyn Array> = dat.try_into_arrow().unwrap();
8585
assert_eq!(r.len(), 1);
8686
assert_eq!(r.data_type(), &<Buffer<u16> as ArrowField>::data_type());

arrow2_convert/tests/ui/struct_incorrect_type.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ error[E0308]: mismatched types
1111
--> tests/ui/struct_incorrect_type.rs:4:45
1212
|
1313
4 | #[derive(Debug, ArrowField, ArrowSerialize, ArrowDeserialize)]
14-
| ^^^^^^^^^^^^^^^^ expected struct `String`, found struct `Vec`
14+
| ^^^^^^^^^^^^^^^^ expected `String`, found `Vec<u8>`
1515
|
1616
= note: expected struct `String`
1717
found struct `Vec<u8>`

arrow2_convert_derive/src/derive_enum.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ pub fn expand_serialize(input: DeriveEnum) -> TokenStream {
119119
..
120120
} = (&input).into();
121121

122-
let first_variant = &variant_names[0];
123122
let is_dense = input.is_dense;
124123

125124
let mutable_array_name = &input.common.mutable_array_name();
@@ -227,6 +226,7 @@ pub fn expand_serialize(input: DeriveEnum) -> TokenStream {
227226
let first_name = &variant_names[0];
228227
quote! {
229228
self.types.push(0);
229+
self.offsets.push((self.#first_name.len()) as i32);
230230
<#first_array_type as MutableArray>::push_null(&mut self.#first_name);
231231
}
232232
} else {
@@ -313,7 +313,7 @@ pub fn expand_serialize(input: DeriveEnum) -> TokenStream {
313313
}
314314

315315
fn len(&self) -> usize {
316-
self.#first_variant.len()
316+
self.types.len()
317317
}
318318

319319
fn validity(&self) -> Option<&arrow2::bitmap::MutableBitmap> {

0 commit comments

Comments
 (0)