This is an automated email from the ASF dual-hosted git repository.

amoghj pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg.git


The following commit(s) were added to refs/heads/main by this push:
     new cc4fe4cc50 Core: Ensure current and newly added view versions are 
retained in ViewMetadata build (#12401)
cc4fe4cc50 is described below

commit cc4fe4cc50043ccba89700f7948090ff87a5baee
Author: Leon Lin <lianglin....@gmail.com>
AuthorDate: Wed Mar 5 08:18:01 2025 -0800

    Core: Ensure current and newly added view versions are retained in 
ViewMetadata build (#12401)
---
 .../java/org/apache/iceberg/view/ViewMetadata.java | 16 +++++++++++---
 .../org/apache/iceberg/view/TestViewMetadata.java  | 25 ++++++++++++++++++++++
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/core/src/main/java/org/apache/iceberg/view/ViewMetadata.java 
b/core/src/main/java/org/apache/iceberg/view/ViewMetadata.java
index cedbd31fb9..05c6ef3750 100644
--- a/core/src/main/java/org/apache/iceberg/view/ViewMetadata.java
+++ b/core/src/main/java/org/apache/iceberg/view/ViewMetadata.java
@@ -35,6 +35,7 @@ import org.apache.iceberg.exceptions.ValidationException;
 import 
org.apache.iceberg.relocated.com.google.common.annotations.VisibleForTesting;
 import org.apache.iceberg.relocated.com.google.common.base.Preconditions;
 import org.apache.iceberg.relocated.com.google.common.collect.ImmutableMap;
+import org.apache.iceberg.relocated.com.google.common.collect.ImmutableSet;
 import org.apache.iceberg.relocated.com.google.common.collect.Lists;
 import org.apache.iceberg.relocated.com.google.common.collect.Maps;
 import org.apache.iceberg.relocated.com.google.common.collect.Sets;
@@ -462,9 +463,18 @@ public interface ViewMetadata extends Serializable {
           ViewProperties.VERSION_HISTORY_SIZE,
           historySize);
 
-      // expire old versions, but keep at least the versions added in this 
builder
-      int numAddedVersions = (int) 
changes(MetadataUpdate.AddViewVersion.class).count();
-      int numVersionsToKeep = Math.max(numAddedVersions, historySize);
+      // expire old versions, but keep at least the versions added in this 
builder and the current
+      // version
+      int numVersions =
+          ImmutableSet.builder()
+              .addAll(
+                  changes(MetadataUpdate.AddViewVersion.class)
+                      .map(v -> v.viewVersion().versionId())
+                      .collect(Collectors.toSet()))
+              .add(currentVersionId)
+              .build()
+              .size();
+      int numVersionsToKeep = Math.max(numVersions, historySize);
 
       List<ViewVersion> retainedVersions;
       List<ViewHistoryEntry> retainedHistory;
diff --git a/core/src/test/java/org/apache/iceberg/view/TestViewMetadata.java 
b/core/src/test/java/org/apache/iceberg/view/TestViewMetadata.java
index fc22a2d891..3a713d061b 100644
--- a/core/src/test/java/org/apache/iceberg/view/TestViewMetadata.java
+++ b/core/src/test/java/org/apache/iceberg/view/TestViewMetadata.java
@@ -396,6 +396,31 @@ public class TestViewMetadata {
         .hasMessage("Cannot set current version to unknown version: 1");
   }
 
+  @Test
+  public void versionsAddedInCurrentBuildAreRetained() {
+    ViewVersion v1 = newViewVersion(1, "select 1 as count");
+    ViewVersion v2 = newViewVersion(2, "select count from t1");
+    ViewVersion v3 = newViewVersion(3, "select count(1) as count from t2");
+
+    ViewMetadata metadata =
+        ViewMetadata.builder()
+            .setLocation("location")
+            .addSchema(new Schema(Types.NestedField.required(1, "x", 
Types.LongType.get())))
+            .addVersion(v1)
+            .setCurrentVersionId(v1.versionId())
+            
.setProperties(ImmutableMap.of(ViewProperties.VERSION_HISTORY_SIZE, "2"))
+            .build();
+    assertThat(metadata.versions()).containsOnly(v1);
+
+    // make sure all currently added versions are retained
+    ViewMetadata updated = 
ViewMetadata.buildFrom(metadata).addVersion(v2).addVersion(v3).build();
+    assertThat(updated.versions()).containsExactlyInAnyOrder(v1, v2, v3);
+
+    // rebuild the metadata to expire older versions
+    updated = ViewMetadata.buildFrom(updated).build();
+    assertThat(updated.versions()).containsExactlyInAnyOrder(v1, v3);
+  }
+
   @Test
   public void viewMetadataAndMetadataChanges() {
     Map<String, String> properties = ImmutableMap.of("key1", "prop1", "key2", 
"prop2");

Reply via email to