You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iceberg.apache.org by dw...@apache.org on 2026/10/08 21:49:48 UTC

(iceberg) branch main updated: Core: Keep metrics field IDs immutable (#18382)

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

danielcweeks 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 32b3d20b8a Core: Keep metrics field IDs immutable (#18382)
32b3d20b8a is described below

commit 32b3d20b8ada6c349c58cb0fd2f4305fed6997b2
Author: Akash Malbari <ak...@gmail.com>
AuthorDate: Thu Oct 8 17:49:42 2026 -0400

    Core: Keep metrics field IDs immutable (#18382)
    
    * Core: Keep metrics field IDs immutable
    
    * Core: Avoid asserting iterator exception message
---
 core/src/main/java/org/apache/iceberg/MetricsConfig.java    |  3 ++-
 .../src/test/java/org/apache/iceberg/TestMetricsConfig.java | 13 +++++++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/core/src/main/java/org/apache/iceberg/MetricsConfig.java b/core/src/main/java/org/apache/iceberg/MetricsConfig.java
index d7bb2430be..f438c1bc56 100644
--- a/core/src/main/java/org/apache/iceberg/MetricsConfig.java
+++ b/core/src/main/java/org/apache/iceberg/MetricsConfig.java
@@ -25,6 +25,7 @@ import static org.apache.iceberg.TableProperties.METRICS_MAX_INFERRED_COLUMN_DEF
 import static org.apache.iceberg.TableProperties.METRICS_MODE_COLUMN_CONF_PREFIX;
 
 import java.io.Serializable;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
@@ -112,7 +113,7 @@ public final class MetricsConfig implements Serializable {
 
   public Iterable<Integer> metricsFieldIds() {
     Preconditions.checkState(idToName != null, "Cannot resolve column mode by ID: missing schema");
-    return idToName.keySet();
+    return Collections.unmodifiableSet(idToName.keySet());
   }
 
   public MetricsMode columnMode(int id) {
diff --git a/core/src/test/java/org/apache/iceberg/TestMetricsConfig.java b/core/src/test/java/org/apache/iceberg/TestMetricsConfig.java
index f046f08ad9..c7812b4462 100644
--- a/core/src/test/java/org/apache/iceberg/TestMetricsConfig.java
+++ b/core/src/test/java/org/apache/iceberg/TestMetricsConfig.java
@@ -21,7 +21,9 @@ package org.apache.iceberg;
 import static org.apache.iceberg.types.Types.NestedField.optional;
 import static org.apache.iceberg.types.Types.NestedField.required;
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -289,6 +291,17 @@ public class TestMetricsConfig {
         .isEqualTo(MetricsModes.Truncate.withLength(16));
   }
 
+  @Test
+  @SuppressWarnings("checkstyle:AssertThatThrownByWithMessageCheck")
+  void metricsFieldIdsCannotBeModified() {
+    MetricsConfig config = MetricsTestUtil.from(ImmutableMap.of(), SCHEMA);
+    Iterator<Integer> fieldIds = config.metricsFieldIds().iterator();
+
+    assertThat(fieldIds.next()).isEqualTo(ID);
+    assertThatThrownBy(fieldIds::remove).isInstanceOf(UnsupportedOperationException.class);
+    assertThat(config.metricsFieldIds()).containsExactly(ID, EVENT_TIME, CATEGORY, DATA);
+  }
+
   @Test
   public void testNestedStruct() {
     Schema schema =