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

etudenhoefner 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 ce7c2c150c API, Core, Kafka, Spark: Reduce enum array allocation 
(#10126)
ce7c2c150c is described below

commit ce7c2c150ce449666cd690612d075fa9893f3118
Author: sullis <git...@seansullivan.com>
AuthorDate: Fri Apr 12 08:51:09 2024 -0700

    API, Core, Kafka, Spark: Reduce enum array allocation (#10126)
---
 api/src/main/java/org/apache/iceberg/FileFormat.java                  | 4 +++-
 core/src/main/java/org/apache/iceberg/BaseFile.java                   | 3 ++-
 core/src/main/java/org/apache/iceberg/CachingCatalog.java             | 3 ++-
 core/src/main/java/org/apache/iceberg/GenericManifestEntry.java       | 3 ++-
 core/src/main/java/org/apache/iceberg/GenericManifestFile.java        | 3 ++-
 .../main/java/org/apache/iceberg/hadoop/HadoopTableOperations.java    | 4 +++-
 .../src/main/java/org/apache/iceberg/connect/events/Event.java        | 3 ++-
 .../src/main/java/org/apache/iceberg/spark/SparkContentFile.java      | 4 +++-
 .../src/main/java/org/apache/iceberg/spark/SparkContentFile.java      | 4 +++-
 9 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/api/src/main/java/org/apache/iceberg/FileFormat.java 
b/api/src/main/java/org/apache/iceberg/FileFormat.java
index 892475780b..d662437d5d 100644
--- a/api/src/main/java/org/apache/iceberg/FileFormat.java
+++ b/api/src/main/java/org/apache/iceberg/FileFormat.java
@@ -32,6 +32,8 @@ public enum FileFormat {
   private final String ext;
   private final boolean splittable;
 
+  private static final FileFormat[] VALUES = values();
+
   FileFormat(String ext, boolean splittable) {
     this.ext = "." + ext;
     this.splittable = splittable;
@@ -55,7 +57,7 @@ public enum FileFormat {
   }
 
   public static FileFormat fromFileName(CharSequence filename) {
-    for (FileFormat format : FileFormat.values()) {
+    for (FileFormat format : VALUES) {
       int extStart = filename.length() - format.ext.length();
       if (Comparators.charSequences()
               .compare(format.ext, filename.subSequence(extStart, 
filename.length()))
diff --git a/core/src/main/java/org/apache/iceberg/BaseFile.java 
b/core/src/main/java/org/apache/iceberg/BaseFile.java
index 6fe2fcc149..d4583b31c7 100644
--- a/core/src/main/java/org/apache/iceberg/BaseFile.java
+++ b/core/src/main/java/org/apache/iceberg/BaseFile.java
@@ -45,6 +45,7 @@ abstract class BaseFile<F>
         StructLike,
         SpecificData.SchemaConstructable,
         Serializable {
+  private static final FileContent[] FILE_CONTENT_VALUES = 
FileContent.values();
   static final Types.StructType EMPTY_STRUCT_TYPE = Types.StructType.of();
   static final PartitionData EMPTY_PARTITION_DATA =
       new PartitionData(EMPTY_STRUCT_TYPE) {
@@ -268,7 +269,7 @@ abstract class BaseFile<F>
     }
     switch (pos) {
       case 0:
-        this.content = value != null ? FileContent.values()[(Integer) value] : 
FileContent.DATA;
+        this.content = value != null ? FILE_CONTENT_VALUES[(Integer) value] : 
FileContent.DATA;
         return;
       case 1:
         // always coerce to String for Serializable
diff --git a/core/src/main/java/org/apache/iceberg/CachingCatalog.java 
b/core/src/main/java/org/apache/iceberg/CachingCatalog.java
index f6c3657ff1..1043e3e720 100644
--- a/core/src/main/java/org/apache/iceberg/CachingCatalog.java
+++ b/core/src/main/java/org/apache/iceberg/CachingCatalog.java
@@ -45,6 +45,7 @@ import org.slf4j.LoggerFactory;
  */
 public class CachingCatalog implements Catalog {
   private static final Logger LOG = 
LoggerFactory.getLogger(CachingCatalog.class);
+  private static final MetadataTableType[] METADATA_TABLE_TYPE_VALUES = 
MetadataTableType.values();
 
   public static Catalog wrap(Catalog catalog) {
     return wrap(catalog, CatalogProperties.CACHE_EXPIRATION_INTERVAL_MS_OFF);
@@ -197,7 +198,7 @@ public class CachingCatalog implements Catalog {
   private Iterable<TableIdentifier> metadataTableIdentifiers(TableIdentifier 
ident) {
     ImmutableList.Builder<TableIdentifier> builder = ImmutableList.builder();
 
-    for (MetadataTableType type : MetadataTableType.values()) {
+    for (MetadataTableType type : METADATA_TABLE_TYPE_VALUES) {
       // metadata table resolution is case insensitive right now
       builder.add(TableIdentifier.parse(ident + "." + type.name()));
       builder.add(TableIdentifier.parse(ident + "." + 
type.name().toLowerCase(Locale.ROOT)));
diff --git a/core/src/main/java/org/apache/iceberg/GenericManifestEntry.java 
b/core/src/main/java/org/apache/iceberg/GenericManifestEntry.java
index 96a475881d..959e2446c7 100644
--- a/core/src/main/java/org/apache/iceberg/GenericManifestEntry.java
+++ b/core/src/main/java/org/apache/iceberg/GenericManifestEntry.java
@@ -26,6 +26,7 @@ import org.apache.iceberg.types.Types;
 
 class GenericManifestEntry<F extends ContentFile<F>>
     implements ManifestEntry<F>, IndexedRecord, 
SpecificData.SchemaConstructable, StructLike {
+  private static final Status[] STATUS_VALUES = Status.values();
   private final org.apache.avro.Schema schema;
   private Status status = Status.EXISTING;
   private Long snapshotId = null;
@@ -151,7 +152,7 @@ class GenericManifestEntry<F extends ContentFile<F>>
   public void put(int i, Object v) {
     switch (i) {
       case 0:
-        this.status = Status.values()[(Integer) v];
+        this.status = STATUS_VALUES[(Integer) v];
         return;
       case 1:
         this.snapshotId = (Long) v;
diff --git a/core/src/main/java/org/apache/iceberg/GenericManifestFile.java 
b/core/src/main/java/org/apache/iceberg/GenericManifestFile.java
index d6b7636d3a..ed94da5e17 100644
--- a/core/src/main/java/org/apache/iceberg/GenericManifestFile.java
+++ b/core/src/main/java/org/apache/iceberg/GenericManifestFile.java
@@ -39,6 +39,7 @@ public class GenericManifestFile
     implements ManifestFile, StructLike, IndexedRecord, SchemaConstructable, 
Serializable {
   private static final Schema AVRO_SCHEMA =
       AvroSchemaUtil.convert(ManifestFile.schema(), "manifest_file");
+  private static final ManifestContent[] MANIFEST_CONTENT_VALUES = 
ManifestContent.values();
 
   private transient Schema avroSchema; // not final for Java serialization
   private int[] fromProjectionPos;
@@ -339,7 +340,7 @@ public class GenericManifestFile
         return;
       case 3:
         this.content =
-            value != null ? ManifestContent.values()[(Integer) value] : 
ManifestContent.DATA;
+            value != null ? MANIFEST_CONTENT_VALUES[(Integer) value] : 
ManifestContent.DATA;
         return;
       case 4:
         this.sequenceNumber = value != null ? (Long) value : 0;
diff --git 
a/core/src/main/java/org/apache/iceberg/hadoop/HadoopTableOperations.java 
b/core/src/main/java/org/apache/iceberg/hadoop/HadoopTableOperations.java
index 9ef2c63e26..4e815ceff5 100644
--- a/core/src/main/java/org/apache/iceberg/hadoop/HadoopTableOperations.java
+++ b/core/src/main/java/org/apache/iceberg/hadoop/HadoopTableOperations.java
@@ -60,6 +60,8 @@ import org.slf4j.LoggerFactory;
 public class HadoopTableOperations implements TableOperations {
   private static final Logger LOG = 
LoggerFactory.getLogger(HadoopTableOperations.class);
   private static final Pattern VERSION_PATTERN = 
Pattern.compile("v([^\\.]*)\\..*");
+  private static final TableMetadataParser.Codec[] 
TABLE_METADATA_PARSER_CODEC_VALUES =
+      TableMetadataParser.Codec.values();
 
   private final Configuration conf;
   private final Path location;
@@ -235,7 +237,7 @@ public class HadoopTableOperations implements 
TableOperations {
 
   @VisibleForTesting
   Path getMetadataFile(int metadataVersion) throws IOException {
-    for (TableMetadataParser.Codec codec : TableMetadataParser.Codec.values()) 
{
+    for (TableMetadataParser.Codec codec : TABLE_METADATA_PARSER_CODEC_VALUES) 
{
       Path metadataFile = metadataFilePath(metadataVersion, codec);
       FileSystem fs = getFileSystem(metadataFile, conf);
       if (fs.exists(metadataFile)) {
diff --git 
a/kafka-connect/kafka-connect-events/src/main/java/org/apache/iceberg/connect/events/Event.java
 
b/kafka-connect/kafka-connect-events/src/main/java/org/apache/iceberg/connect/events/Event.java
index 8b6dbc0f45..72d7e22d18 100644
--- 
a/kafka-connect/kafka-connect-events/src/main/java/org/apache/iceberg/connect/events/Event.java
+++ 
b/kafka-connect/kafka-connect-events/src/main/java/org/apache/iceberg/connect/events/Event.java
@@ -41,6 +41,7 @@ import org.apache.iceberg.util.DateTimeUtil;
  */
 public class Event implements IndexedRecord {
 
+  private static final PayloadType[] PAYLOAD_TYPE_VALUES = 
PayloadType.values();
   private UUID id;
   private PayloadType type;
   private OffsetDateTime timestamp;
@@ -115,7 +116,7 @@ public class Event implements IndexedRecord {
         this.id = (UUID) v;
         return;
       case TYPE:
-        this.type = v == null ? null : PayloadType.values()[(Integer) v];
+        this.type = v == null ? null : PAYLOAD_TYPE_VALUES[(Integer) v];
         return;
       case TIMESTAMP:
         this.timestamp = v == null ? null : 
DateTimeUtil.timestamptzFromMicros((Long) v);
diff --git 
a/spark/v3.4/spark/src/main/java/org/apache/iceberg/spark/SparkContentFile.java 
b/spark/v3.4/spark/src/main/java/org/apache/iceberg/spark/SparkContentFile.java
index 3dd8049c13..f756c4cde0 100644
--- 
a/spark/v3.4/spark/src/main/java/org/apache/iceberg/spark/SparkContentFile.java
+++ 
b/spark/v3.4/spark/src/main/java/org/apache/iceberg/spark/SparkContentFile.java
@@ -35,6 +35,8 @@ import org.apache.spark.sql.types.StructType;
 
 public abstract class SparkContentFile<F> implements ContentFile<F> {
 
+  private static final FileContent[] FILE_CONTENT_VALUES = 
FileContent.values();
+
   private final int fileContentPosition;
   private final int filePathPosition;
   private final int fileFormatPosition;
@@ -126,7 +128,7 @@ public abstract class SparkContentFile<F> implements 
ContentFile<F> {
     if (wrapped.isNullAt(fileContentPosition)) {
       return null;
     }
-    return FileContent.values()[wrapped.getInt(fileContentPosition)];
+    return FILE_CONTENT_VALUES[wrapped.getInt(fileContentPosition)];
   }
 
   @Override
diff --git 
a/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkContentFile.java 
b/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkContentFile.java
index 3dd8049c13..f756c4cde0 100644
--- 
a/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkContentFile.java
+++ 
b/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkContentFile.java
@@ -35,6 +35,8 @@ import org.apache.spark.sql.types.StructType;
 
 public abstract class SparkContentFile<F> implements ContentFile<F> {
 
+  private static final FileContent[] FILE_CONTENT_VALUES = 
FileContent.values();
+
   private final int fileContentPosition;
   private final int filePathPosition;
   private final int fileFormatPosition;
@@ -126,7 +128,7 @@ public abstract class SparkContentFile<F> implements 
ContentFile<F> {
     if (wrapped.isNullAt(fileContentPosition)) {
       return null;
     }
-    return FileContent.values()[wrapped.getInt(fileContentPosition)];
+    return FILE_CONTENT_VALUES[wrapped.getInt(fileContentPosition)];
   }
 
   @Override

Reply via email to