scovich commented on code in PR #7914:
URL: https://github.com/apache/arrow-rs/pull/7914#discussion_r2202823069


##########
parquet-variant/src/builder.rs:
##########
@@ -213,14 +215,14 @@ impl ValueBuffer {
             Variant::Binary(v) => self.append_binary(v),
             Variant::String(s) => self.append_string(s),
             Variant::ShortString(s) => self.append_short_string(s),
-            Variant::Object(_) | Variant::List(_) => {
-                unreachable!(
-                    "Nested values are handled specially by ObjectBuilder and 
ListBuilder"
-                );
-            }
+            _ => unreachable!("Objects and lists must be appended using 
VariantBuilder::append_object and VariantBuilder::append_list"),

Review Comment:
   This is an awkward division of responsibilities. What if we got rid of 
`ValueBuffer::append_variant` entirely, and just had the builder invoke the 
primitive `append_xxx` methods directly?



##########
parquet-variant/src/builder.rs:
##########
@@ -213,14 +215,14 @@ impl ValueBuffer {
             Variant::Binary(v) => self.append_binary(v),
             Variant::String(s) => self.append_string(s),
             Variant::ShortString(s) => self.append_short_string(s),
-            Variant::Object(_) | Variant::List(_) => {
-                unreachable!(
-                    "Nested values are handled specially by ObjectBuilder and 
ListBuilder"
-                );
-            }
+            _ => unreachable!("Objects and lists must be appended using 
VariantBuilder::append_object and VariantBuilder::append_list"),

Review Comment:
   I guess the method is currently important because all three builders need to 
call it. I wonder more and more whether there might be some way to harmonize 
the implementations more, leveraging a combination of `ParentState` and 
`VariantBuilderExt`?



##########
parquet-variant/src/builder.rs:
##########
@@ -697,6 +699,79 @@ impl VariantBuilder {
         ObjectBuilder::new(parent_state, validate_unique_fields)
     }
 
+    /// Appends a [`VariantObject`] to the builder.
+    ///
+    /// # Panics
+    /// Will panic if the appended object has duplicate field names or any 
nested validation fails.
+    /// Use `try_append_object` if you need full validation for untrusted data.
+    pub fn append_object<'m, 'v>(&mut self, object: VariantObject<'m, 'v>) {
+        let (parent_state, validate_unique_fields) = self.parent_state();
+
+        let mut obj_builder = ObjectBuilder::new(parent_state, 
validate_unique_fields);
+
+        for (field_name, variant) in object.iter() {
+            obj_builder.insert(field_name, variant);
+        }
+
+        obj_builder.finish().unwrap();
+    }
+
+    /// Appends a [`VariantObject`] to the builder with full validation during 
iteration.
+    ///
+    /// Recursively validates all nested variants in the object during 
iteration.
+    pub fn try_append_object<'m, 'v>(

Review Comment:
   I wish there were an efficient way to reuse code for fallible vs. infallible 
versions of this method...



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscr...@arrow.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to