Skip to content

Commit 442c935

Browse files
committed
fixup! [Variant] Avoid extra allocation in object builder
1 parent 55def1d commit 442c935

File tree

1 file changed

+87
-14
lines changed

1 file changed

+87
-14
lines changed

parquet-variant/src/builder.rs

Lines changed: 87 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,21 +1084,58 @@ impl<'a> ObjectBuilder<'a> {
10841084
key: &str,
10851085
value: T,
10861086
) -> Result<(), ArrowError> {
1087-
// Get metadata_builder from parent state
1088-
let metadata_builder = self.parent_state.metadata_builder();
1087+
match &mut self.parent_state {
1088+
ParentState::Variant {
1089+
buffer,
1090+
metadata_builder,
1091+
} => {
1092+
let field_id = metadata_builder.upsert_field_name(key);
1093+
let field_start = buffer.offset() - self.object_start_offset;
10891094

1090-
let field_id = metadata_builder.upsert_field_name(key);
1091-
// field_start is a relevant offset from the buffer this object is being built in.
1092-
let field_start = self.parent_state.buffer().offset() - self.object_start_offset;
1095+
if self.fields.insert(field_id, field_start).is_some()
1096+
&& self.validate_unique_fields
1097+
{
1098+
self.duplicate_fields.insert(field_id);
1099+
}
10931100

1094-
if self.fields.insert(field_id, field_start).is_some() && self.validate_unique_fields {
1095-
self.duplicate_fields.insert(field_id);
1096-
}
1101+
buffer.try_append_variant(value.into(), metadata_builder)?;
1102+
Ok(())
1103+
}
1104+
ParentState::List {
1105+
buffer,
1106+
metadata_builder,
1107+
..
1108+
} => {
1109+
let field_id = metadata_builder.upsert_field_name(key);
1110+
let field_start = buffer.offset() - self.object_start_offset;
10971111

1098-
self.parent_state.buffer()
1099-
.try_append_variant(value.into(), metadata_builder)?;
1112+
if self.fields.insert(field_id, field_start).is_some()
1113+
&& self.validate_unique_fields
1114+
{
1115+
self.duplicate_fields.insert(field_id);
1116+
}
11001117

1101-
Ok(())
1118+
buffer.try_append_variant(value.into(), metadata_builder)?;
1119+
Ok(())
1120+
}
1121+
ParentState::Object {
1122+
buffer,
1123+
metadata_builder,
1124+
..
1125+
} => {
1126+
let field_id = metadata_builder.upsert_field_name(key);
1127+
let field_start = buffer.offset() - self.object_start_offset;
1128+
1129+
if self.fields.insert(field_id, field_start).is_some()
1130+
&& self.validate_unique_fields
1131+
{
1132+
self.duplicate_fields.insert(field_id);
1133+
}
1134+
1135+
buffer.try_append_variant(value.into(), metadata_builder)?;
1136+
Ok(())
1137+
}
1138+
}
11021139
}
11031140

11041141
/// Enables validation for unique field keys when inserting into this object.
@@ -1936,7 +1973,13 @@ mod tests {
19361973
{
19371974
"a": false,
19381975
"c": {
1939-
"b": "a"
1976+
"b": "a",
1977+
"c": {
1978+
"aa": "bb",
1979+
},
1980+
"d": {
1981+
"cc": "dd"
1982+
}
19401983
}
19411984
"b": true,
19421985
}
@@ -1951,6 +1994,18 @@ mod tests {
19511994
{
19521995
let mut inner_object_builder = outer_object_builder.new_object("c");
19531996
inner_object_builder.insert("b", "a");
1997+
1998+
{
1999+
let mut inner_inner_object_builder = inner_object_builder.new_object("c");
2000+
inner_inner_object_builder.insert("aa", "bb");
2001+
let _ = inner_inner_object_builder.finish();
2002+
}
2003+
2004+
{
2005+
let mut inner_inner_object_builder = inner_object_builder.new_object("d");
2006+
inner_inner_object_builder.insert("cc", "dd");
2007+
let _ = inner_inner_object_builder.finish();
2008+
}
19542009
let _ = inner_object_builder.finish();
19552010
}
19562011

@@ -1967,7 +2022,13 @@ mod tests {
19672022
"a": false,
19682023
"b": true,
19692024
"c": {
1970-
"b": "a"
2025+
"b": "a",
2026+
"c": {
2027+
"aa": "bb",
2028+
},
2029+
"d": {
2030+
"cc": "dd"
2031+
}
19712032
}
19722033
}
19732034
*/
@@ -1985,10 +2046,22 @@ mod tests {
19852046
let inner_object_variant = outer_object.field(2).unwrap();
19862047
let inner_object = inner_object_variant.as_object().unwrap();
19872048

1988-
assert_eq!(inner_object.len(), 1);
2049+
assert_eq!(inner_object.len(), 3);
19892050
assert_eq!(inner_object.field_name(0).unwrap(), "b");
19902051
assert_eq!(inner_object.field(0).unwrap(), Variant::from("a"));
19912052

2053+
let inner_iner_object_variant_c = inner_object.field(1).unwrap();
2054+
let inner_inner_object_c = inner_iner_object_variant_c.as_object().unwrap();
2055+
assert_eq!(inner_inner_object_c.len(), 1);
2056+
assert_eq!(inner_inner_object_c.field_name(0).unwrap(), "aa");
2057+
assert_eq!(inner_inner_object_c.field(0).unwrap(), Variant::from("bb"));
2058+
2059+
let inner_iner_object_variant_d = inner_object.field(2).unwrap();
2060+
let inner_inner_object_d = inner_iner_object_variant_d.as_object().unwrap();
2061+
assert_eq!(inner_inner_object_d.len(), 1);
2062+
assert_eq!(inner_inner_object_d.field_name(0).unwrap(), "cc");
2063+
assert_eq!(inner_inner_object_d.field(0).unwrap(), Variant::from("dd"));
2064+
19922065
assert_eq!(outer_object.field_name(1).unwrap(), "b");
19932066
assert_eq!(outer_object.field(1).unwrap(), Variant::from(true));
19942067
}

0 commit comments

Comments
 (0)