Skip to content

Commit ce69739

Browse files
authored
fix: Implement support for appending Object and List variants in VariantBuilder (#7735)
# Which issue does this PR close? Closes #7701 . # Rationale for this change The VariantBuilder::append_value method did not support appending `Object` and `List` variants correctly. This PR ensures that these complex types are appropriately copied and appended. # What changes are included in this PR? # Are there any user-facing changes? No
1 parent 4549ced commit ce69739

File tree

1 file changed

+50
-2
lines changed

1 file changed

+50
-2
lines changed

parquet-variant/src/builder.rs

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -392,8 +392,19 @@ impl VariantBuilder {
392392
Variant::Binary(v) => self.append_binary(v),
393393
Variant::String(s) => self.append_string(s),
394394
Variant::ShortString(s) => self.append_short_string(s),
395-
Variant::Object(_) | Variant::List(_) => {
396-
unreachable!("Object and List variants cannot be created through Into<Variant>")
395+
Variant::Object(obj) => {
396+
let mut obj_builder = self.new_object();
397+
for (key, value) in obj.iter() {
398+
obj_builder.append_value(key, value);
399+
}
400+
obj_builder.finish();
401+
}
402+
Variant::List(list) => {
403+
let mut list_builder = self.new_list();
404+
for value in list.iter() {
405+
list_builder.append_value(value);
406+
}
407+
list_builder.finish();
397408
}
398409
}
399410
}
@@ -737,4 +748,41 @@ mod tests {
737748
// apple(1), banana(2), zebra(0)
738749
assert_eq!(field_ids, vec![1, 2, 0]);
739750
}
751+
752+
#[test]
753+
fn test_append_object() {
754+
let (object_metadata, object_value) = {
755+
let mut builder = VariantBuilder::new();
756+
let mut obj = builder.new_object();
757+
obj.append_value("name", "John");
758+
obj.finish();
759+
builder.finish()
760+
};
761+
let object_variant = Variant::try_new(&object_metadata, &object_value).unwrap();
762+
763+
let mut builder = VariantBuilder::new();
764+
builder.append_value(object_variant.clone());
765+
let (metadata, value) = builder.finish();
766+
let variant = Variant::try_new(&metadata, &value).unwrap();
767+
assert_eq!(variant, object_variant);
768+
}
769+
770+
#[test]
771+
fn test_append_list() {
772+
let (list_metadata, list_value) = {
773+
let mut builder = VariantBuilder::new();
774+
let mut list = builder.new_list();
775+
list.append_value(1i8);
776+
list.append_value(2i8);
777+
list.finish();
778+
builder.finish()
779+
};
780+
let list_variant = Variant::try_new(&list_metadata, &list_value).unwrap();
781+
782+
let mut builder = VariantBuilder::new();
783+
builder.append_value(list_variant.clone());
784+
let (metadata, value) = builder.finish();
785+
let variant = Variant::try_new(&metadata, &value).unwrap();
786+
assert_eq!(variant, list_variant);
787+
}
740788
}

0 commit comments

Comments
 (0)