in core/src/main/java/org/apache/iceberg/TableMetadataParser.java [165:281]
public static void toJson(TableMetadata metadata, JsonGenerator generator) throws IOException {
generator.writeStartObject();
generator.writeNumberField(FORMAT_VERSION, metadata.formatVersion());
generator.writeStringField(TABLE_UUID, metadata.uuid());
generator.writeStringField(LOCATION, metadata.location());
if (metadata.formatVersion() > 1) {
generator.writeNumberField(LAST_SEQUENCE_NUMBER, metadata.lastSequenceNumber());
}
generator.writeNumberField(LAST_UPDATED_MILLIS, metadata.lastUpdatedMillis());
generator.writeNumberField(LAST_COLUMN_ID, metadata.lastColumnId());
// 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 (metadata.formatVersion() == 1) {
generator.writeFieldName(SCHEMA);
SchemaParser.toJson(metadata.schema(), generator);
}
// write the current schema ID and schema list
generator.writeNumberField(CURRENT_SCHEMA_ID, metadata.currentSchemaId());
generator.writeArrayFieldStart(SCHEMAS);
for (Schema schema : metadata.schemas()) {
SchemaParser.toJson(schema, generator);
}
generator.writeEndArray();
// for older readers, continue writing the default spec as "partition-spec"
if (metadata.formatVersion() == 1) {
generator.writeFieldName(PARTITION_SPEC);
PartitionSpecParser.toJsonFields(metadata.spec(), generator);
}
// write the default spec ID and spec list
generator.writeNumberField(DEFAULT_SPEC_ID, metadata.defaultSpecId());
generator.writeArrayFieldStart(PARTITION_SPECS);
for (PartitionSpec spec : metadata.specs()) {
PartitionSpecParser.toJson(spec, generator);
}
generator.writeEndArray();
generator.writeNumberField(LAST_PARTITION_ID, metadata.lastAssignedPartitionId());
// write the default order ID and sort order list
generator.writeNumberField(DEFAULT_SORT_ORDER_ID, metadata.defaultSortOrderId());
generator.writeArrayFieldStart(SORT_ORDERS);
for (SortOrder sortOrder : metadata.sortOrders()) {
SortOrderParser.toJson(sortOrder, generator);
}
generator.writeEndArray();
// write properties map
JsonUtil.writeStringMap(PROPERTIES, metadata.properties(), generator);
if (metadata.currentSnapshot() != null) {
generator.writeNumberField(CURRENT_SNAPSHOT_ID, metadata.currentSnapshot().snapshotId());
} else {
if (metadata.formatVersion() >= MIN_NULL_CURRENT_SNAPSHOT_VERSION) {
generator.writeNullField(CURRENT_SNAPSHOT_ID);
} else {
generator.writeNumberField(CURRENT_SNAPSHOT_ID, -1L);
}
}
if (metadata.formatVersion() >= 3) {
generator.writeNumberField(NEXT_ROW_ID, metadata.nextRowId());
}
if (metadata.encryptionKeys() != null && !metadata.encryptionKeys().isEmpty()) {
generator.writeArrayFieldStart(ENCRYPTION_KEYS);
for (EncryptedKey key : metadata.encryptionKeys()) {
EncryptedKeyParser.toJson(key, generator);
}
generator.writeEndArray();
}
toJson(metadata.refs(), generator);
generator.writeArrayFieldStart(SNAPSHOTS);
for (Snapshot snapshot : metadata.snapshots()) {
SnapshotParser.toJson(snapshot, generator);
}
generator.writeEndArray();
generator.writeArrayFieldStart(STATISTICS);
for (StatisticsFile statisticsFile : metadata.statisticsFiles()) {
StatisticsFileParser.toJson(statisticsFile, generator);
}
generator.writeEndArray();
generator.writeArrayFieldStart(PARTITION_STATISTICS);
for (PartitionStatisticsFile partitionStatisticsFile : metadata.partitionStatisticsFiles()) {
PartitionStatisticsFileParser.toJson(partitionStatisticsFile, generator);
}
generator.writeEndArray();
generator.writeArrayFieldStart(SNAPSHOT_LOG);
for (HistoryEntry logEntry : metadata.snapshotLog()) {
generator.writeStartObject();
generator.writeNumberField(TIMESTAMP_MS, logEntry.timestampMillis());
generator.writeNumberField(SNAPSHOT_ID, logEntry.snapshotId());
generator.writeEndObject();
}
generator.writeEndArray();
generator.writeArrayFieldStart(METADATA_LOG);
for (MetadataLogEntry logEntry : metadata.previousFiles()) {
generator.writeStartObject();
generator.writeNumberField(TIMESTAMP_MS, logEntry.timestampMillis());
generator.writeStringField(METADATA_FILE, logEntry.file());
generator.writeEndObject();
}
generator.writeEndArray();
generator.writeEndObject();
}