@@ -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