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 =