Skip to content

Commit 0ae315d

Browse files
committed
Avoid recreating metadata
1 parent c36b7de commit 0ae315d

File tree

1 file changed

+16
-7
lines changed

1 file changed

+16
-7
lines changed

src/deserialize.cpp

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ namespace sparrow_ipc
2121
}
2222
return static_cast<const org::apache::arrow::flatbuf::RecordBatch*>(batch_message->header());
2323
}
24+
2425
/**
2526
* @brief Deserializes arrays from an Apache Arrow RecordBatch using the provided schema.
2627
*
@@ -44,23 +45,21 @@ namespace sparrow_ipc
4445
std::vector<sparrow::array> get_arrays_from_record_batch(
4546
const org::apache::arrow::flatbuf::RecordBatch& record_batch,
4647
const org::apache::arrow::flatbuf::Schema& schema,
47-
const EncapsulatedMessage& encapsulated_message
48+
const EncapsulatedMessage& encapsulated_message,
49+
const std::vector<std::optional<std::vector<sparrow::metadata_pair>>>& field_metadata
4850
)
4951
{
5052
const size_t length = static_cast<size_t>(record_batch.length());
5153
size_t buffer_index = 0;
5254

5355
std::vector<sparrow::array> arrays;
5456
arrays.reserve(schema.fields()->size());
55-
57+
size_t field_idx = 0;
5658
for (const auto field : *(schema.fields()))
5759
{
5860
const ::flatbuffers::Vector<::flatbuffers::Offset<org::apache::arrow::flatbuf::KeyValue>>*
5961
fb_custom_metadata = field->custom_metadata();
60-
const std::optional<std::vector<sparrow::metadata_pair>>
61-
metadata = fb_custom_metadata == nullptr
62-
? std::nullopt
63-
: std::make_optional(to_sparrow_metadata(*fb_custom_metadata));
62+
const std::optional<std::vector<sparrow::metadata_pair>>& metadata = field_metadata[field_idx++];
6463
const auto name = field->name()->string_view();
6564
const auto field_type = field->type_type();
6665
const auto deserialize_non_owning_primitive_array_lambda = [&]<typename T>()
@@ -206,6 +205,7 @@ namespace sparrow_ipc
206205
std::vector<std::string_view> field_names;
207206
std::vector<bool> fields_nullable;
208207
std::vector<sparrow::data_type> field_types;
208+
std::vector<std::optional<std::vector<sparrow::metadata_pair>>> fields_metadata;
209209
do
210210
{
211211
const auto [encapsulated_message, rest] = extract_encapsulated_message(data);
@@ -218,11 +218,19 @@ namespace sparrow_ipc
218218
const size_t size = static_cast<size_t>(schema->fields()->size());
219219
field_names.reserve(size);
220220
fields_nullable.reserve(size);
221+
fields_metadata.reserve(size);
221222

222223
for (const auto field : *(schema->fields()))
223224
{
224225
field_names.emplace_back(field->name()->string_view());
225226
fields_nullable.push_back(field->nullable());
227+
const ::flatbuffers::Vector<::flatbuffers::Offset<org::apache::arrow::flatbuf::KeyValue>>*
228+
fb_custom_metadata = field->custom_metadata();
229+
std::optional<std::vector<sparrow::metadata_pair>>
230+
metadata = fb_custom_metadata == nullptr
231+
? std::nullopt
232+
: std::make_optional(to_sparrow_metadata(*fb_custom_metadata));
233+
fields_metadata.push_back(std::move(metadata));
226234
}
227235
}
228236
break;
@@ -240,7 +248,8 @@ namespace sparrow_ipc
240248
std::vector<sparrow::array> arrays = get_arrays_from_record_batch(
241249
*record_batch,
242250
*schema,
243-
encapsulated_message
251+
encapsulated_message,
252+
fields_metadata
244253
);
245254
std::vector<std::string> field_names_str(field_names.cbegin(), field_names.cend());
246255
record_batches.emplace_back(std::move(field_names_str), std::move(arrays));

0 commit comments

Comments
 (0)