blob: 7244dcd162e0b6dbc4a46a67bee4bccdad7e9664 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.iceberg;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonNode;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.apache.iceberg.relocated.com.google.common.base.Preconditions;
import org.apache.iceberg.relocated.com.google.common.collect.ImmutableList;
import org.apache.iceberg.relocated.com.google.common.collect.ImmutableMap;
import org.apache.iceberg.util.JsonUtil;
public class StatisticsFileParser {
private static final String SNAPSHOT_ID = "snapshot-id";
private static final String STATISTICS_PATH = "statistics-path";
private static final String FILE_SIZE_IN_BYTES = "file-size-in-bytes";
private static final String FILE_FOOTER_SIZE_IN_BYTES = "file-footer-size-in-bytes";
private static final String BLOB_METADATA = "blob-metadata";
private static final String TYPE = "type";
private static final String SEQUENCE_NUMBER = "sequence-number";
private static final String FIELDS = "fields";
private static final String PROPERTIES = "properties";
private StatisticsFileParser() {}
public static String toJson(StatisticsFile statisticsFile) {
return toJson(statisticsFile, false);
}
public static String toJson(StatisticsFile statisticsFile, boolean pretty) {
return JsonUtil.generate(gen -> toJson(statisticsFile, gen), pretty);
}
public static void toJson(StatisticsFile statisticsFile, JsonGenerator generator)
throws IOException {
generator.writeStartObject();
generator.writeNumberField(SNAPSHOT_ID, statisticsFile.snapshotId());
generator.writeStringField(STATISTICS_PATH, statisticsFile.path());
generator.writeNumberField(FILE_SIZE_IN_BYTES, statisticsFile.fileSizeInBytes());
generator.writeNumberField(FILE_FOOTER_SIZE_IN_BYTES, statisticsFile.fileFooterSizeInBytes());
generator.writeArrayFieldStart(BLOB_METADATA);
for (BlobMetadata blobMetadata : statisticsFile.blobMetadata()) {
toJson(blobMetadata, generator);
}
generator.writeEndArray();
generator.writeEndObject();
}
static StatisticsFile fromJson(JsonNode node) {
long snapshotId = JsonUtil.getLong(SNAPSHOT_ID, node);
String path = JsonUtil.getString(STATISTICS_PATH, node);
long fileSizeInBytes = JsonUtil.getLong(FILE_SIZE_IN_BYTES, node);
long fileFooterSizeInBytes = JsonUtil.getLong(FILE_FOOTER_SIZE_IN_BYTES, node);
ImmutableList.Builder<BlobMetadata> blobMetadata = ImmutableList.builder();
JsonNode blobsJson = node.get(BLOB_METADATA);
Preconditions.checkArgument(
blobsJson != null && blobsJson.isArray(),
"Cannot parse blob metadata from non-array: %s",
blobsJson);
for (JsonNode blobJson : blobsJson) {
blobMetadata.add(blobMetadataFromJson(blobJson));
}
return new GenericStatisticsFile(
snapshotId, path, fileSizeInBytes, fileFooterSizeInBytes, blobMetadata.build());
}
private static void toJson(BlobMetadata blobMetadata, JsonGenerator generator)
throws IOException {
generator.writeStartObject();
generator.writeStringField(TYPE, blobMetadata.type());
generator.writeNumberField(SNAPSHOT_ID, blobMetadata.sourceSnapshotId());
generator.writeNumberField(SEQUENCE_NUMBER, blobMetadata.sourceSnapshotSequenceNumber());
generator.writeArrayFieldStart(FIELDS);
for (int field : blobMetadata.fields()) {
generator.writeNumber(field);
}
generator.writeEndArray();
if (!blobMetadata.properties().isEmpty()) {
JsonUtil.writeStringMap(PROPERTIES, blobMetadata.properties(), generator);
}
generator.writeEndObject();
}
private static BlobMetadata blobMetadataFromJson(JsonNode node) {
String type = JsonUtil.getString(TYPE, node);
long sourceSnapshotId = JsonUtil.getLong(SNAPSHOT_ID, node);
long sourceSnapshotSequenceNumber = JsonUtil.getLong(SEQUENCE_NUMBER, node);
List<Integer> fields = JsonUtil.getIntegerList(FIELDS, node);
Map<String, String> properties;
if (node.has(PROPERTIES)) {
properties = JsonUtil.getStringMap(PROPERTIES, node);
} else {
properties = ImmutableMap.of();
}
return new GenericBlobMetadata(
type, sourceSnapshotId, sourceSnapshotSequenceNumber, fields, properties);
}
}