Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions parquet-variant-compute/src/shred_variant.rs
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ impl<'a> VariantToShreddedObjectVariantRowBuilder<'a> {
};

// Route the object's fields by name as either shredded or unshredded
let mut builder = self.value_builder.builder_ext(value.metadata().clone());
let mut builder = self.value_builder.builder_ext(value.metadata());
let mut object_builder = builder.try_new_object()?;
let mut seen = std::collections::HashSet::new();
let mut partially_shredded = false;
Expand Down Expand Up @@ -794,7 +794,7 @@ mod tests {
let object_with_foo_field = |i| {
use parquet_variant::{ParentState, ValueBuilder, VariantMetadata};
let metadata = VariantMetadata::new(metadata.value(i));
let mut metadata_builder = ReadOnlyMetadataBuilder::new(metadata.clone());
let mut metadata_builder = ReadOnlyMetadataBuilder::new(&metadata);
let mut value_builder = ValueBuilder::new();
let state = ParentState::variant(&mut value_builder, &mut metadata_builder);
ObjectBuilder::new(state, false)
Expand Down
11 changes: 6 additions & 5 deletions parquet-variant-compute/src/variant_array_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,8 @@ impl VariantValueArrayBuilder {
/// builder.append_value(Variant::from(42));
/// ```
pub fn append_value(&mut self, value: Variant<'_, '_>) {
self.builder_ext(value.metadata().clone())
// NOTE: Have to clone because the builder consumes `value`
self.builder_ext(&value.metadata().clone())
.append_value(value);
}

Expand All @@ -313,7 +314,7 @@ impl VariantValueArrayBuilder {
/// let Variant::Object(obj) = value else {
/// panic!("Not a variant object");
/// };
/// let mut metadata_builder = ReadOnlyMetadataBuilder::new(obj.metadata.clone());
/// let mut metadata_builder = ReadOnlyMetadataBuilder::new(&obj.metadata);
/// let state = value_array_builder.parent_state(&mut metadata_builder);
/// let mut object_builder = ObjectBuilder::new(state, false);
/// for (field_name, field_value) in obj.iter() {
Expand All @@ -339,7 +340,7 @@ impl VariantValueArrayBuilder {
/// parameter (similar to the way [`parquet_variant::ObjectFieldBuilder`] hides field names).
pub fn builder_ext<'a>(
&'a mut self,
metadata: VariantMetadata<'a>,
metadata: &'a VariantMetadata<'a>,
) -> VariantValueArrayBuilderExt<'a> {
VariantValueArrayBuilderExt {
metadata_builder: ReadOnlyMetadataBuilder::new(metadata),
Expand Down Expand Up @@ -548,7 +549,7 @@ mod test {

// filtering fields takes more work because we need to manually create an object builder
let value = array.value(1);
let mut builder = value_builder.builder_ext(value.metadata().clone());
let mut builder = value_builder.builder_ext(value.metadata());
builder
.new_object()
.with_field("name", value.get_object_field("name").unwrap())
Expand All @@ -557,7 +558,7 @@ mod test {

// same bytes, but now nested and duplicated inside a list
let value = array.value(2);
let mut builder = value_builder.builder_ext(value.metadata().clone());
let mut builder = value_builder.builder_ext(value.metadata());
builder
.new_list()
.with_value(value.clone())
Expand Down
16 changes: 8 additions & 8 deletions parquet-variant/src/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -498,15 +498,15 @@ impl MetadataBuilder for WritableMetadataBuilder {
/// time `finish` is called, a different trait impl will be needed.
#[derive(Debug)]
pub struct ReadOnlyMetadataBuilder<'m> {
metadata: VariantMetadata<'m>,
metadata: &'m VariantMetadata<'m>,
// A cache that tracks field names this builder has already seen, because finding the field id
// for a given field name is expensive -- O(n) for a large and unsorted metadata dictionary.
known_field_names: HashMap<&'m str, u32>,
}

impl<'m> ReadOnlyMetadataBuilder<'m> {
/// Creates a new read-only metadata builder from the given metadata dictionary.
pub fn new(metadata: VariantMetadata<'m>) -> Self {
pub fn new(metadata: &'m VariantMetadata<'m>) -> Self {
Self {
metadata,
known_field_names: HashMap::new(),
Expand Down Expand Up @@ -3357,7 +3357,7 @@ mod tests {

// Use the metadata to build new variant values
let metadata = VariantMetadata::try_new(&metadata_bytes).unwrap();
let mut metadata_builder = ReadOnlyMetadataBuilder::new(metadata);
let mut metadata_builder = ReadOnlyMetadataBuilder::new(&metadata);
let mut value_builder = ValueBuilder::new();

{
Expand Down Expand Up @@ -3390,7 +3390,7 @@ mod tests {

// Use the metadata to build new variant values
let metadata = VariantMetadata::try_new(&metadata_bytes).unwrap();
let mut metadata_builder = ReadOnlyMetadataBuilder::new(metadata);
let mut metadata_builder = ReadOnlyMetadataBuilder::new(&metadata);
let mut value_builder = ValueBuilder::new();

{
Expand Down Expand Up @@ -3438,7 +3438,7 @@ mod tests {

// Copy using the new bytes API
let metadata = VariantMetadata::new(&metadata);
let mut metadata = ReadOnlyMetadataBuilder::new(metadata);
let mut metadata = ReadOnlyMetadataBuilder::new(&metadata);
let mut builder2 = ValueBuilder::new();
let state = ParentState::variant(&mut builder2, &mut metadata);
ValueBuilder::append_variant_bytes(state, variant1);
Expand Down Expand Up @@ -3466,7 +3466,7 @@ mod tests {

// Create a new object copying subset of fields interleaved with new ones
let metadata2 = VariantMetadata::new(&metadata1);
let mut metadata2 = ReadOnlyMetadataBuilder::new(metadata2);
let mut metadata2 = ReadOnlyMetadataBuilder::new(&metadata2);
let mut builder2 = ValueBuilder::new();
let state = ParentState::variant(&mut builder2, &mut metadata2);
{
Expand Down Expand Up @@ -3530,7 +3530,7 @@ mod tests {

// Create a new list copying subset of elements interleaved with new ones
let metadata2 = VariantMetadata::new(&metadata1);
let mut metadata2 = ReadOnlyMetadataBuilder::new(metadata2);
let mut metadata2 = ReadOnlyMetadataBuilder::new(&metadata2);
let mut builder2 = ValueBuilder::new();
let state = ParentState::variant(&mut builder2, &mut metadata2);
{
Expand Down Expand Up @@ -3626,7 +3626,7 @@ mod tests {

// Create filtered/modified version: only copy active users and inject new data
let metadata2 = VariantMetadata::new(&metadata1);
let mut metadata2 = ReadOnlyMetadataBuilder::new(metadata2);
let mut metadata2 = ReadOnlyMetadataBuilder::new(&metadata2);
let mut builder2 = ValueBuilder::new();
let state = ParentState::variant(&mut builder2, &mut metadata2);
{
Expand Down
Loading