in src/iceberg/json_internal.cc [886:956]
nlohmann::json ToJson(const TableMetadata& table_metadata) {
nlohmann::json json;
json[kFormatVersion] = table_metadata.format_version;
json[kTableUuid] = table_metadata.table_uuid;
json[kLocation] = table_metadata.location;
if (table_metadata.format_version > 1) {
json[kLastSequenceNumber] = table_metadata.last_sequence_number;
}
json[kLastUpdatedMs] = UnixMsFromTimePointMs(table_metadata.last_updated_ms);
json[kLastColumnId] = table_metadata.last_column_id;
// for older readers, continue writing the current schema as "schema".
// this is only needed for v1 because support for schemas and current-schema-id
// is required in v2 and later.
if (table_metadata.format_version == 1) {
for (const auto& schema : table_metadata.schemas) {
if (schema->schema_id() == table_metadata.current_schema_id) {
json[kSchema] = ToJson(*schema);
break;
}
}
}
// write the current schema ID and schema list
SetOptionalField(json, kCurrentSchemaId, table_metadata.current_schema_id);
json[kSchemas] = ToJsonList(table_metadata.schemas);
// for older readers, continue writing the default spec as "partition-spec"
if (table_metadata.format_version == 1) {
for (const auto& partition_spec : table_metadata.partition_specs) {
if (partition_spec->spec_id() == table_metadata.default_spec_id) {
json[kPartitionSpec] = ToJson(*partition_spec);
break;
}
}
}
// write the default spec ID and spec list
json[kDefaultSpecId] = table_metadata.default_spec_id;
json[kPartitionSpecs] = ToJsonList(table_metadata.partition_specs);
json[kLastPartitionId] = table_metadata.last_partition_id;
// write the default order ID and sort order list
json[kDefaultSortOrderId] = table_metadata.default_sort_order_id;
json[kSortOrders] = ToJsonList(table_metadata.sort_orders);
// write properties map
json[kProperties] = table_metadata.properties;
if (std::ranges::find_if(table_metadata.snapshots, [&](const auto& snapshot) {
return snapshot->snapshot_id == table_metadata.current_snapshot_id;
}) != table_metadata.snapshots.cend()) {
json[kCurrentSnapshotId] = table_metadata.current_snapshot_id;
} else {
json[kCurrentSnapshotId] = nlohmann::json::value_t::null;
}
if (table_metadata.format_version >= 3) {
json[kNextRowId] = table_metadata.next_row_id;
}
json[kRefs] = ToJsonMap(table_metadata.refs);
json[kSnapshots] = ToJsonList(table_metadata.snapshots);
json[kStatistics] = ToJsonList(table_metadata.statistics);
json[kPartitionStatistics] = ToJsonList(table_metadata.partition_statistics);
json[kSnapshotLog] = ToJsonList(table_metadata.snapshot_log);
json[kMetadataLog] = ToJsonList(table_metadata.metadata_log);
return json;
}