1use crate::builder::list::ListBuilder;
18use crate::builder::metadata::MetadataBuilder;
19use crate::decoder::VariantBasicType;
20use crate::{
21 BASIC_TYPE_BITS, BuilderSpecificState, ParentState, ValueBuilder, Variant, VariantBuilderExt,
22 int_size,
23};
24use arrow_schema::ArrowError;
25use indexmap::IndexMap;
26
27fn object_header(large: bool, id_size: u8, offset_size: u8) -> u8 {
28 let large_bit = if large { 1 } else { 0 };
29 (large_bit << (BASIC_TYPE_BITS + 4))
30 | ((id_size - 1) << (BASIC_TYPE_BITS + 2))
31 | ((offset_size - 1) << BASIC_TYPE_BITS)
32 | VariantBasicType::Object as u8
33}
34
35#[derive(Debug)]
41pub struct ObjectBuilder<'a, S: BuilderSpecificState> {
42 parent_state: ParentState<'a, S>,
43 pub(crate) fields: IndexMap<u32, usize>, validate_unique_fields: bool,
45}
46
47impl<'a, S: BuilderSpecificState> ObjectBuilder<'a, S> {
48 pub fn new(parent_state: ParentState<'a, S>, validate_unique_fields: bool) -> Self {
50 Self {
51 parent_state,
52 fields: IndexMap::new(),
53 validate_unique_fields,
54 }
55 }
56
57 pub fn insert<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, key: &str, value: T) {
68 let (state, _) = self.parent_state(key).unwrap();
69 ValueBuilder::append_variant(state, value.into())
70 }
71
72 pub fn try_insert<'m, 'd, T: Into<Variant<'m, 'd>>>(
83 &mut self,
84 key: &str,
85 value: T,
86 ) -> Result<(), ArrowError> {
87 let (state, _) = self.parent_state(key)?;
88 ValueBuilder::try_append_variant(state, value.into())
89 }
90
91 pub fn insert_bytes<'m, 'd>(&mut self, key: &str, value: impl Into<Variant<'m, 'd>>) {
105 self.try_insert_bytes(key, value).unwrap()
106 }
107
108 pub fn try_insert_bytes<'m, 'd>(
121 &mut self,
122 key: &str,
123 value: impl Into<Variant<'m, 'd>>,
124 ) -> Result<(), ArrowError> {
125 let (state, _) = self.parent_state(key)?;
126 ValueBuilder::append_variant_bytes(state, value.into());
127 Ok(())
128 }
129
130 pub fn with_field<'m, 'd, T: Into<Variant<'m, 'd>>>(mut self, key: &str, value: T) -> Self {
134 self.insert(key, value);
135 self
136 }
137
138 pub fn try_with_field<'m, 'd, T: Into<Variant<'m, 'd>>>(
142 mut self,
143 key: &str,
144 value: T,
145 ) -> Result<Self, ArrowError> {
146 self.try_insert(key, value)?;
147 Ok(self)
148 }
149
150 pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
155 self.validate_unique_fields = validate_unique_fields;
156 self
157 }
158
159 fn parent_state<'b>(
161 &'b mut self,
162 field_name: &str,
163 ) -> Result<(ParentState<'b, ObjectState<'b>>, bool), ArrowError> {
164 let validate_unique_fields = self.validate_unique_fields;
165 let state = ParentState::try_object(
166 self.parent_state.value_builder,
167 self.parent_state.metadata_builder,
168 &mut self.fields,
169 self.parent_state.saved_value_builder_offset,
170 field_name,
171 validate_unique_fields,
172 )?;
173 Ok((state, validate_unique_fields))
174 }
175
176 pub fn new_object<'b>(&'b mut self, key: &'b str) -> ObjectBuilder<'b, ObjectState<'b>> {
182 self.try_new_object(key).unwrap()
183 }
184
185 pub fn try_new_object<'b>(
191 &'b mut self,
192 key: &str,
193 ) -> Result<ObjectBuilder<'b, ObjectState<'b>>, ArrowError> {
194 let (parent_state, validate_unique_fields) = self.parent_state(key)?;
195 Ok(ObjectBuilder::new(parent_state, validate_unique_fields))
196 }
197
198 pub fn new_list<'b>(&'b mut self, key: &str) -> ListBuilder<'b, ObjectState<'b>> {
204 self.try_new_list(key).unwrap()
205 }
206
207 pub fn try_new_list<'b>(
213 &'b mut self,
214 key: &str,
215 ) -> Result<ListBuilder<'b, ObjectState<'b>>, ArrowError> {
216 let (parent_state, validate_unique_fields) = self.parent_state(key)?;
217 Ok(ListBuilder::new(parent_state, validate_unique_fields))
218 }
219
220 pub fn finish(mut self) {
222 let metadata_builder = self.parent_state.metadata_builder();
223
224 self.fields.sort_by(|&field_a_id, _, &field_b_id, _| {
225 let field_a_name = metadata_builder.field_name(field_a_id as usize);
226 let field_b_name = metadata_builder.field_name(field_b_id as usize);
227 field_a_name.cmp(field_b_name)
228 });
229
230 let max_id = self.fields.iter().map(|(i, _)| *i).max().unwrap_or(0);
231 let id_size = int_size(max_id as usize);
232
233 let starting_offset = self.parent_state.saved_value_builder_offset;
234 let value_builder = self.parent_state.value_builder();
235 let current_offset = value_builder.offset();
236 let data_size = current_offset - starting_offset;
238 let offset_size = int_size(data_size);
239
240 let num_fields = self.fields.len();
241 let is_large = num_fields > u8::MAX as usize;
242
243 let header_size = 1 + (if is_large { 4 } else { 1 }) + (num_fields * id_size as usize) + ((num_fields + 1) * offset_size as usize); value_builder.inner_mut().splice(
250 starting_offset..starting_offset,
251 std::iter::repeat_n(0u8, header_size),
252 );
253
254 let mut header_pos = starting_offset;
256
257 let header = object_header(is_large, id_size, offset_size);
259
260 header_pos = self
261 .parent_state
262 .value_builder()
263 .append_header_start_from_buf_pos(header_pos, header, is_large, num_fields);
264
265 header_pos = self
266 .parent_state
267 .value_builder()
268 .append_offset_array_start_from_buf_pos(
269 header_pos,
270 self.fields.keys().copied().map(|id| id as usize),
271 None,
272 id_size,
273 );
274
275 self.parent_state
276 .value_builder()
277 .append_offset_array_start_from_buf_pos(
278 header_pos,
279 self.fields.values().copied(),
280 Some(data_size),
281 offset_size,
282 );
283 self.parent_state.finish();
284 }
285}
286
287impl<'a, 'm, 'v, S, K, V> Extend<(K, V)> for ObjectBuilder<'a, S>
288where
289 S: BuilderSpecificState,
290 K: AsRef<str>,
291 V: Into<Variant<'m, 'v>>,
292{
293 fn extend<T: IntoIterator<Item = (K, V)>>(&mut self, iter: T) {
294 for (key, value) in iter.into_iter() {
295 self.insert(key.as_ref(), value);
296 }
297 }
298}
299
300#[derive(Debug)]
302pub struct ObjectState<'a> {
303 fields: &'a mut IndexMap<u32, usize>,
304 saved_fields_size: usize,
305}
306
307impl BuilderSpecificState for ObjectState<'_> {
309 fn rollback(&mut self) {
310 self.fields.truncate(self.saved_fields_size);
311 }
312}
313
314impl<'a> ParentState<'a, ObjectState<'a>> {
315 pub fn try_object(
321 value_builder: &'a mut ValueBuilder,
322 metadata_builder: &'a mut dyn MetadataBuilder,
323 fields: &'a mut IndexMap<u32, usize>,
324 saved_parent_value_builder_offset: usize,
325 field_name: &str,
326 validate_unique_fields: bool,
327 ) -> Result<Self, ArrowError> {
328 let saved_value_builder_offset = value_builder.offset();
332 let saved_fields_size = fields.len();
333 let saved_metadata_builder_dict_size = metadata_builder.num_field_names();
334 let field_id = metadata_builder.try_upsert_field_name(field_name)?;
335 let field_start = saved_value_builder_offset - saved_parent_value_builder_offset;
336 if fields.insert(field_id, field_start).is_some() && validate_unique_fields {
337 return Err(ArrowError::InvalidArgumentError(format!(
338 "Duplicate field name: {field_name}"
339 )));
340 }
341
342 let builder_state = ObjectState {
343 fields,
344 saved_fields_size,
345 };
346 Ok(Self {
347 saved_metadata_builder_dict_size,
348 saved_value_builder_offset,
349 value_builder,
350 metadata_builder,
351 builder_state,
352 finished: false,
353 })
354 }
355}
356
357pub struct ObjectFieldBuilder<'o, 'v, 's, S: BuilderSpecificState> {
359 key: &'s str,
360 builder: &'o mut ObjectBuilder<'v, S>,
361}
362
363impl<'o, 'v, 's, S: BuilderSpecificState> ObjectFieldBuilder<'o, 'v, 's, S> {
364 pub fn new(key: &'s str, builder: &'o mut ObjectBuilder<'v, S>) -> Self {
365 Self { key, builder }
366 }
367}
368
369impl<S: BuilderSpecificState> VariantBuilderExt for ObjectFieldBuilder<'_, '_, '_, S> {
370 type State<'a>
371 = ObjectState<'a>
372 where
373 Self: 'a;
374
375 fn append_null(&mut self) {}
377 fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>) {
378 self.builder.insert(self.key, value);
379 }
380
381 fn try_new_list(&mut self) -> Result<ListBuilder<'_, Self::State<'_>>, ArrowError> {
382 self.builder.try_new_list(self.key)
383 }
384
385 fn try_new_object(&mut self) -> Result<ObjectBuilder<'_, Self::State<'_>>, ArrowError> {
386 self.builder.try_new_object(self.key)
387 }
388}
389
390#[cfg(test)]
391mod tests {
392 use crate::{
393 ParentState, ValueBuilder, Variant, VariantBuilder, VariantMetadata,
394 builder::{metadata::ReadOnlyMetadataBuilder, object::ObjectBuilder},
395 decoder::VariantBasicType,
396 };
397
398 #[test]
399 fn test_object() {
400 let mut builder = VariantBuilder::new();
401
402 builder
403 .new_object()
404 .with_field("name", "John")
405 .with_field("age", 42i8)
406 .finish();
407
408 let (metadata, value) = builder.finish();
409 assert!(!metadata.is_empty());
410 assert!(!value.is_empty());
411 }
412
413 #[test]
414 fn test_object_field_ordering() {
415 let mut builder = VariantBuilder::new();
416
417 builder
418 .new_object()
419 .with_field("zebra", "stripes")
420 .with_field("apple", "red")
421 .with_field("banana", "yellow")
422 .finish();
423
424 let (_, value) = builder.finish();
425
426 let header = value[0];
427 assert_eq!(header & 0x03, VariantBasicType::Object as u8);
428
429 let field_count = value[1] as usize;
430 assert_eq!(field_count, 3);
431
432 let field_ids: Vec<u8> = value[2..5].to_vec();
434
435 assert_eq!(field_ids, vec![1, 2, 0]);
437 }
438
439 #[test]
440 fn test_duplicate_fields_in_object() {
441 let mut builder = VariantBuilder::new();
442 builder
443 .new_object()
444 .with_field("name", "Ron Artest")
445 .with_field("name", "Metta World Peace") .finish();
447
448 let (metadata, value) = builder.finish();
449 let variant = Variant::try_new(&metadata, &value).unwrap();
450
451 let obj = variant.as_object().unwrap();
452 assert_eq!(obj.len(), 1);
453 assert_eq!(obj.field(0).unwrap(), Variant::from("Metta World Peace"));
454
455 assert_eq!(
456 vec![("name", Variant::from("Metta World Peace"))],
457 obj.iter().collect::<Vec<_>>()
458 );
459 }
460
461 #[test]
462 fn test_read_only_metadata_builder() {
463 let mut default_builder = VariantBuilder::new();
465 default_builder.add_field_name("name");
466 default_builder.add_field_name("age");
467 default_builder.add_field_name("active");
468 let (metadata_bytes, _) = default_builder.finish();
469
470 let metadata = VariantMetadata::try_new(&metadata_bytes).unwrap();
472 let mut metadata_builder = ReadOnlyMetadataBuilder::new(&metadata);
473 let mut value_builder = ValueBuilder::new();
474
475 {
476 let state = ParentState::variant(&mut value_builder, &mut metadata_builder);
477 let mut obj = ObjectBuilder::new(state, false);
478
479 obj.insert("name", "Alice");
481 obj.insert("age", 30i8);
482 obj.insert("active", true);
483 obj.finish();
484 }
485
486 let value = value_builder.into_inner();
487
488 let variant = Variant::try_new(&metadata_bytes, &value).unwrap();
490 let obj = variant.as_object().unwrap();
491 assert_eq!(obj.get("name"), Some(Variant::from("Alice")));
492 assert_eq!(obj.get("age"), Some(Variant::Int8(30)));
493 assert_eq!(obj.get("active"), Some(Variant::from(true)));
494 }
495
496 #[test]
498 fn test_append_object() {
499 let (m1, v1) = make_object();
500 let variant = Variant::new(&m1, &v1);
501
502 let mut builder = VariantBuilder::new().with_metadata(VariantMetadata::new(&m1));
503
504 builder.append_value(variant.clone());
505
506 let (metadata, value) = builder.finish();
507 assert_eq!(variant, Variant::new(&metadata, &value));
508 }
509
510 fn make_object() -> (Vec<u8>, Vec<u8>) {
512 let mut builder = VariantBuilder::new();
513
514 let mut obj = builder.new_object();
515
516 obj.insert("b", true);
517 obj.insert("a", false);
518 obj.finish();
519 builder.finish()
520 }
521
522 #[test]
523 fn test_append_nested_object() {
524 let (m1, v1) = make_nested_object();
525 let variant = Variant::new(&m1, &v1);
526
527 let mut builder = VariantBuilder::new().with_metadata(VariantMetadata::new(&m1));
529 builder.append_value(variant.clone());
530
531 let (metadata, value) = builder.finish();
532 let result_variant = Variant::new(&metadata, &value);
533
534 assert_eq!(variant, result_variant);
535 }
536
537 fn make_nested_object() -> (Vec<u8>, Vec<u8>) {
539 let mut builder = VariantBuilder::new();
540
541 {
542 let mut outer_obj = builder.new_object();
543
544 {
545 let mut inner_obj = outer_obj.new_object("b");
546 inner_obj.insert("a", "inner_value");
547 inner_obj.finish();
548 }
549
550 outer_obj.finish();
551 }
552
553 builder.finish()
554 }
555
556 #[test]
557 fn test_nested_object() {
558 let mut builder = VariantBuilder::new();
568 {
569 let mut outer_object_builder = builder.new_object();
570 {
571 let mut inner_object_builder = outer_object_builder.new_object("c");
572 inner_object_builder.insert("b", "a");
573 inner_object_builder.finish();
574 }
575
576 outer_object_builder.finish();
577 }
578
579 let (metadata, value) = builder.finish();
580 let variant = Variant::try_new(&metadata, &value).unwrap();
581 let outer_object = variant.as_object().unwrap();
582
583 assert_eq!(outer_object.len(), 1);
584 assert_eq!(outer_object.field_name(0).unwrap(), "c");
585
586 let inner_object_variant = outer_object.field(0).unwrap();
587 let inner_object = inner_object_variant.as_object().unwrap();
588
589 assert_eq!(inner_object.len(), 1);
590 assert_eq!(inner_object.field_name(0).unwrap(), "b");
591 assert_eq!(inner_object.field(0).unwrap(), Variant::from("a"));
592 }
593
594 #[test]
595 fn test_nested_object_with_duplicate_field_names_per_object() {
596 let mut builder = VariantBuilder::new();
608 {
609 let mut outer_object_builder = builder.new_object();
610 {
611 let mut inner_object_builder = outer_object_builder.new_object("c");
612 inner_object_builder.insert("b", false);
613 inner_object_builder.insert("c", "a");
614
615 inner_object_builder.finish();
616 }
617
618 outer_object_builder.insert("b", false);
619 outer_object_builder.finish();
620 }
621
622 let (metadata, value) = builder.finish();
623 let variant = Variant::try_new(&metadata, &value).unwrap();
624 let outer_object = variant.as_object().unwrap();
625
626 assert_eq!(outer_object.len(), 2);
627 assert_eq!(outer_object.field_name(0).unwrap(), "b");
628
629 let inner_object_variant = outer_object.field(1).unwrap();
630 let inner_object = inner_object_variant.as_object().unwrap();
631
632 assert_eq!(inner_object.len(), 2);
633 assert_eq!(inner_object.field_name(0).unwrap(), "b");
634 assert_eq!(inner_object.field(0).unwrap(), Variant::from(false));
635 assert_eq!(inner_object.field_name(1).unwrap(), "c");
636 assert_eq!(inner_object.field(1).unwrap(), Variant::from("a"));
637 }
638
639 #[test]
640 fn test_nested_object_with_heterogeneous_fields() {
641 let mut builder = VariantBuilder::new();
663 {
664 let mut outer_object_builder = builder.new_object();
665
666 outer_object_builder.insert("a", false);
667
668 {
669 let mut inner_object_builder = outer_object_builder.new_object("c");
670 inner_object_builder.insert("b", "a");
671
672 {
673 let mut inner_inner_object_builder = inner_object_builder.new_object("c");
674 inner_inner_object_builder.insert("aa", "bb");
675 inner_inner_object_builder.finish();
676 }
677
678 {
679 let mut inner_inner_object_builder = inner_object_builder.new_object("d");
680 inner_inner_object_builder.insert("cc", "dd");
681 inner_inner_object_builder.finish();
682 }
683 inner_object_builder.finish();
684 }
685
686 outer_object_builder.insert("b", true);
687
688 {
689 let mut inner_object_builder = outer_object_builder.new_object("d");
690 inner_object_builder.insert("e", 1);
691 {
692 let mut inner_list_builder = inner_object_builder.new_list("f");
693 inner_list_builder.append_value(1);
694 inner_list_builder.append_value(true);
695
696 inner_list_builder.finish();
697 }
698
699 {
700 let mut inner_list_builder = inner_object_builder.new_list("g");
701 inner_list_builder.append_value("tree");
702 inner_list_builder.append_value(false);
703
704 inner_list_builder.finish();
705 }
706
707 inner_object_builder.finish();
708 }
709
710 outer_object_builder.finish();
711 }
712
713 let (metadata, value) = builder.finish();
714
715 let variant = Variant::try_new(&metadata, &value).unwrap();
738 let outer_object = variant.as_object().unwrap();
739
740 assert_eq!(outer_object.len(), 4);
741
742 assert_eq!(outer_object.field_name(0).unwrap(), "a");
743 assert_eq!(outer_object.field(0).unwrap(), Variant::from(false));
744
745 assert_eq!(outer_object.field_name(2).unwrap(), "c");
746
747 let inner_object_variant = outer_object.field(2).unwrap();
748 let inner_object = inner_object_variant.as_object().unwrap();
749
750 assert_eq!(inner_object.len(), 3);
751 assert_eq!(inner_object.field_name(0).unwrap(), "b");
752 assert_eq!(inner_object.field(0).unwrap(), Variant::from("a"));
753
754 let inner_iner_object_variant_c = inner_object.field(1).unwrap();
755 let inner_inner_object_c = inner_iner_object_variant_c.as_object().unwrap();
756 assert_eq!(inner_inner_object_c.len(), 1);
757 assert_eq!(inner_inner_object_c.field_name(0).unwrap(), "aa");
758 assert_eq!(inner_inner_object_c.field(0).unwrap(), Variant::from("bb"));
759
760 let inner_iner_object_variant_d = inner_object.field(2).unwrap();
761 let inner_inner_object_d = inner_iner_object_variant_d.as_object().unwrap();
762 assert_eq!(inner_inner_object_d.len(), 1);
763 assert_eq!(inner_inner_object_d.field_name(0).unwrap(), "cc");
764 assert_eq!(inner_inner_object_d.field(0).unwrap(), Variant::from("dd"));
765
766 assert_eq!(outer_object.field_name(1).unwrap(), "b");
767 assert_eq!(outer_object.field(1).unwrap(), Variant::from(true));
768
769 let out_object_variant_d = outer_object.field(3).unwrap();
770 let out_object_d = out_object_variant_d.as_object().unwrap();
771 assert_eq!(out_object_d.len(), 3);
772 assert_eq!("e", out_object_d.field_name(0).unwrap());
773 assert_eq!(Variant::from(1), out_object_d.field(0).unwrap());
774 assert_eq!("f", out_object_d.field_name(1).unwrap());
775
776 let first_inner_list_variant_f = out_object_d.field(1).unwrap();
777 let first_inner_list_f = first_inner_list_variant_f.as_list().unwrap();
778 assert_eq!(2, first_inner_list_f.len());
779 assert_eq!(Variant::from(1), first_inner_list_f.get(0).unwrap());
780 assert_eq!(Variant::from(true), first_inner_list_f.get(1).unwrap());
781
782 let second_inner_list_variant_g = out_object_d.field(2).unwrap();
783 let second_inner_list_g = second_inner_list_variant_g.as_list().unwrap();
784 assert_eq!(2, second_inner_list_g.len());
785 assert_eq!(Variant::from("tree"), second_inner_list_g.get(0).unwrap());
786 assert_eq!(Variant::from(false), second_inner_list_g.get(1).unwrap());
787 }
788
789 #[test]
790 fn test_object_without_unique_field_validation() {
791 let mut builder = VariantBuilder::new();
792
793 let mut obj = builder.new_object();
795 obj.insert("a", 1);
796 obj.insert("a", 2);
797 obj.finish();
798
799 let mut builder = VariantBuilder::new();
801 let mut outer_list = builder.new_list();
802 let mut inner_list = outer_list.new_list();
803 let mut nested_obj = inner_list.new_object();
804 nested_obj.insert("x", 1);
805 nested_obj.insert("x", 2);
806 nested_obj.new_list("x").with_value(3).finish();
807 nested_obj.new_object("x").with_field("y", 4).finish();
808 nested_obj.finish();
809 inner_list.finish();
810 outer_list.finish();
811
812 let (metadata, value) = builder.finish();
814 let variant = Variant::try_new(&metadata, &value).unwrap();
815 let outer_element = variant.get_list_element(0).unwrap();
816 let inner_element = outer_element.get_list_element(0).unwrap();
817 let outer_field = inner_element.get_object_field("x").unwrap();
818 let inner_field = outer_field.get_object_field("y").unwrap();
819 assert_eq!(inner_field, Variant::from(4));
820 }
821
822 #[test]
823 fn test_object_with_unique_field_validation() {
824 let mut builder = VariantBuilder::new().with_validate_unique_fields(true);
825
826 let result = builder
828 .new_object()
829 .with_field("a", 1)
830 .with_field("b", 2)
831 .try_with_field("a", 3);
832 assert_eq!(
833 result.unwrap_err().to_string(),
834 "Invalid argument error: Duplicate field name: a"
835 );
836
837 let mut outer_list = builder.new_list();
839 let mut inner_list = outer_list.new_list();
840 let mut object = inner_list.new_object().with_field("x", 1);
841 let nested_result = object.try_insert("x", 2);
842 assert_eq!(
843 nested_result.unwrap_err().to_string(),
844 "Invalid argument error: Duplicate field name: x"
845 );
846 let nested_result = object.try_new_list("x");
847 assert_eq!(
848 nested_result.unwrap_err().to_string(),
849 "Invalid argument error: Duplicate field name: x"
850 );
851
852 let nested_result = object.try_new_object("x");
853 assert_eq!(
854 nested_result.unwrap_err().to_string(),
855 "Invalid argument error: Duplicate field name: x"
856 );
857
858 drop(object);
859 inner_list.finish();
860 outer_list.finish();
861
862 let mut list = builder.new_list();
864 let mut valid_obj = list.new_object();
865 valid_obj.insert("m", 1);
866 valid_obj.insert("n", 2);
867
868 valid_obj.finish();
869 list.finish();
870 }
871}