diff --git a/api/src/main/java/org/apache/iceberg/view/ViewVersion.java b/api/src/main/java/org/apache/iceberg/view/ViewVersion.java index e188a1e8baf5..11dec1ff16c9 100644 --- a/api/src/main/java/org/apache/iceberg/view/ViewVersion.java +++ b/api/src/main/java/org/apache/iceberg/view/ViewVersion.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Map; +import org.apache.iceberg.relocated.com.google.common.base.Preconditions; import org.immutables.value.Value; /** @@ -65,11 +66,17 @@ public interface ViewVersion { * * @return the string operation which produced the view version */ - @Value.Derived + @Value.Lazy default String operation() { return summary().get("operation"); } /** The query output schema at version create time, without aliases */ int schemaId(); + + @Value.Check + default void check() { + Preconditions.checkArgument( + summary().containsKey("operation"), "Invalid view version summary, missing operation"); + } } diff --git a/core/src/main/java/org/apache/iceberg/view/ViewVersionParser.java b/core/src/main/java/org/apache/iceberg/view/ViewVersionParser.java index c3e1667a6e47..a0df4564985d 100644 --- a/core/src/main/java/org/apache/iceberg/view/ViewVersionParser.java +++ b/core/src/main/java/org/apache/iceberg/view/ViewVersionParser.java @@ -31,7 +31,6 @@ class ViewVersionParser { private static final String VERSION_ID = "version-id"; private static final String TIMESTAMP_MS = "timestamp-ms"; private static final String SUMMARY = "summary"; - private static final String OPERATION = "operation"; private static final String REPRESENTATIONS = "representations"; private static final String SCHEMA_ID = "schema-id"; @@ -44,15 +43,7 @@ static void toJson(ViewVersion version, JsonGenerator generator) throws IOExcept generator.writeNumberField(VERSION_ID, version.versionId()); generator.writeNumberField(TIMESTAMP_MS, version.timestampMillis()); generator.writeNumberField(SCHEMA_ID, version.schemaId()); - - generator.writeObjectFieldStart(SUMMARY); - generator.writeStringField(OPERATION, version.operation()); - for (Map.Entry summaryEntry : version.summary().entrySet()) { - if (!summaryEntry.getKey().equals(OPERATION)) { - generator.writeStringField(summaryEntry.getKey(), summaryEntry.getValue()); - } - } - generator.writeEndObject(); + JsonUtil.writeStringMap(SUMMARY, version.summary(), generator); generator.writeArrayFieldStart(REPRESENTATIONS); for (ViewRepresentation representation : version.representations()) { @@ -74,7 +65,6 @@ static ViewVersion fromJson(String json) { static ViewVersion fromJson(JsonNode node) { Preconditions.checkArgument(node != null, "Cannot parse view version from null object"); - Preconditions.checkArgument( node.isObject(), "Cannot parse view version from a non-object: %s", node); @@ -82,8 +72,6 @@ static ViewVersion fromJson(JsonNode node) { int schemaId = JsonUtil.getInt(SCHEMA_ID, node); long timestamp = JsonUtil.getLong(TIMESTAMP_MS, node); Map summary = JsonUtil.getStringMap(SUMMARY, node); - Preconditions.checkArgument( - summary.containsKey(OPERATION), "Invalid view version summary, missing %s", OPERATION); JsonNode serializedRepresentations = node.get(REPRESENTATIONS); ImmutableList.Builder representations = ImmutableList.builder(); diff --git a/core/src/test/java/org/apache/iceberg/view/TestViewVersionParser.java b/core/src/test/java/org/apache/iceberg/view/TestViewVersionParser.java index 587d16dd6ee6..9ecb68377abc 100644 --- a/core/src/test/java/org/apache/iceberg/view/TestViewVersionParser.java +++ b/core/src/test/java/org/apache/iceberg/view/TestViewVersionParser.java @@ -114,6 +114,17 @@ public void testFailParsingMissingOperation() { Assertions.assertThatThrownBy(() -> ViewVersionParser.fromJson(viewVersionMissingOperation)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Invalid view version summary, missing operation"); + + Assertions.assertThatThrownBy( + () -> + ImmutableViewVersion.builder() + .versionId(1) + .timestampMillis(12345) + .schemaId(1) + .summary(ImmutableMap.of("user", "some-user")) + .build()) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Invalid view version summary, missing operation"); } @Test