Skip to content

Commit 501cb12

Browse files
authored
Remove use of into_arrow2_buffer in generated code (#8731)
* Part of #3741
1 parent 1efce7d commit 501cb12

File tree

18 files changed

+241
-145
lines changed

18 files changed

+241
-145
lines changed

crates/build/re_types_builder/src/codegen/rust/serializer.rs

Lines changed: 51 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -585,66 +585,76 @@ fn quote_arrow_field_serializer(
585585
DataType::Utf8 => {
586586
// NOTE: We need values for all slots, regardless of what the validity says,
587587
// hence `unwrap_or_default`.
588-
let (quoted_transparent_mapping, quoted_transparent_length) =
589-
if inner_is_arrow_transparent {
590-
let inner_obj = inner_obj.as_ref().unwrap();
591-
let is_tuple_struct = is_tuple_struct_from_obj(inner_obj);
592-
let quoted_data_dst = format_ident!(
593-
"{}",
594-
if is_tuple_struct {
595-
"data0"
596-
} else {
597-
inner_obj.fields[0].name.as_str()
598-
}
599-
);
600-
let quoted_member_accessor = if is_tuple_struct {
601-
quote!(0)
588+
let (quoted_member_accessor, quoted_transparent_length) = if inner_is_arrow_transparent
589+
{
590+
let inner_obj = inner_obj.as_ref().unwrap();
591+
let is_tuple_struct = is_tuple_struct_from_obj(inner_obj);
592+
let quoted_data_dst = format_ident!(
593+
"{}",
594+
if is_tuple_struct {
595+
"data0"
602596
} else {
603-
quote!(#quoted_data_dst)
604-
};
605-
606-
(
607-
quote! {
608-
.flat_map(|datum| {
609-
datum.#quoted_member_accessor.into_arrow2_buffer()
610-
})
611-
},
612-
quote! {
613-
.map(|datum| {
614-
datum.#quoted_member_accessor.len()
615-
})
616-
},
617-
)
597+
inner_obj.fields[0].name.as_str()
598+
}
599+
);
600+
let quoted_member_accessor = if is_tuple_struct {
601+
quote!(.0)
618602
} else {
619-
(
620-
quote! {
621-
.flat_map(|s| s.into_arrow2_buffer())
622-
},
623-
quote! {
624-
.map(|datum| datum.len())
625-
},
626-
)
603+
quote!(.#quoted_data_dst)
627604
};
628605

606+
(
607+
quoted_member_accessor.clone(),
608+
quote! {
609+
.map(|datum| {
610+
datum #quoted_member_accessor.len()
611+
})
612+
},
613+
)
614+
} else {
615+
(
616+
quote! {},
617+
quote! {
618+
.map(|datum| datum.len())
619+
},
620+
)
621+
};
622+
629623
let inner_data_and_offsets = if elements_are_nullable {
630624
quote! {
631625
let offsets = arrow::buffer::OffsetBuffer::<i32>::from_lengths(
632626
#data_src.iter().map(|opt| opt.as_ref() #quoted_transparent_length .unwrap_or_default())
633627
);
634628

629+
// Offsets is always non-empty. The last element is the total length of buffer we need.
630+
// We want this capacity in order to allocate exactly as much memory as we need.
631+
#[allow(clippy::unwrap_used)]
632+
let capacity = offsets.last().copied().unwrap() as usize;
633+
634+
let mut buffer_builder = arrow::array::builder::BufferBuilder::<u8>::new(capacity);
635635
// NOTE: Flattening to remove the guaranteed layer of nullability: we don't care
636636
// about it while building the backing buffer since it's all offsets driven.
637-
let inner_data: arrow::buffer::Buffer =
638-
#data_src.into_iter().flatten() #quoted_transparent_mapping.collect();
637+
for data in #data_src.iter().flatten() {
638+
buffer_builder.append_slice(data #quoted_member_accessor.as_bytes());
639+
}
640+
let inner_data: arrow::buffer::Buffer = buffer_builder.finish();
639641
}
640642
} else {
641643
quote! {
642644
let offsets = arrow::buffer::OffsetBuffer::<i32>::from_lengths(
643645
#data_src.iter() #quoted_transparent_length
644646
);
645647

646-
let inner_data: arrow::buffer::Buffer =
647-
#data_src.into_iter() #quoted_transparent_mapping.collect();
648+
// Offsets is always non-empty. The last element is the total length of buffer we need.
649+
// We want this capacity in order to allocate exactly as much memory as we need.
650+
#[allow(clippy::unwrap_used)]
651+
let capacity = offsets.last().copied().unwrap() as usize;
652+
653+
let mut buffer_builder = arrow::array::builder::BufferBuilder::<u8>::new(capacity);
654+
for data in &#data_src {
655+
buffer_builder.append_slice(data #quoted_member_accessor.as_bytes());
656+
}
657+
let inner_data: arrow::buffer::Buffer = buffer_builder.finish();
648658
}
649659
};
650660

crates/store/re_types/src/blueprint/datatypes/component_column_selector.rs

Lines changed: 17 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/store/re_types/src/blueprint/datatypes/selected_columns.rs

Lines changed: 9 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/store/re_types/src/blueprint/datatypes/utf8list.rs

Lines changed: 9 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/store/re_types/src/datatypes/annotation_info.rs

Lines changed: 9 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/store/re_types/src/datatypes/tensor_data.rs

Lines changed: 8 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/store/re_types/src/datatypes/utf8pair.rs

Lines changed: 19 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/store/re_types/src/testing/components/affix_fuzzer10.rs

Lines changed: 8 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/store/re_types/src/testing/components/affix_fuzzer12.rs

Lines changed: 9 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/store/re_types/src/testing/components/affix_fuzzer13.rs

Lines changed: 9 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/store/re_types/src/testing/components/affix_fuzzer9.rs

Lines changed: 8 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)