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

aokolnychyi 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 04792cf991 Spark 3.5: Remove obsolete conf parsing logic (#10309)
04792cf991 is described below

commit 04792cf991608d836a1ce60651bf65d1b7f67120
Author: Anton Okolnychyi <[email protected]>
AuthorDate: Sat May 11 09:55:09 2024 -0700

    Spark 3.5: Remove obsolete conf parsing logic (#10309)
---
 .../org/apache/iceberg/spark/SparkConfParser.java  | 28 ++++++++++++----------
 .../org/apache/iceberg/spark/SparkReadConf.java    |  2 --
 .../apache/iceberg/spark/TestSparkWriteConf.java   |  9 +++++++
 3 files changed, 25 insertions(+), 14 deletions(-)

diff --git 
a/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkConfParser.java 
b/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkConfParser.java
index e3b01b8375..bdb66bbe3c 100644
--- 
a/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkConfParser.java
+++ 
b/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkConfParser.java
@@ -20,7 +20,6 @@ package org.apache.iceberg.spark;
 
 import java.time.Duration;
 import java.util.List;
-import java.util.Locale;
 import java.util.Map;
 import java.util.function.Function;
 import org.apache.iceberg.Table;
@@ -31,23 +30,24 @@ import org.apache.spark.network.util.JavaUtils;
 import org.apache.spark.sql.RuntimeConfig;
 import org.apache.spark.sql.SparkSession;
 import org.apache.spark.sql.internal.SQLConf;
+import org.apache.spark.sql.util.CaseInsensitiveStringMap;
 
 class SparkConfParser {
 
   private final Map<String, String> properties;
   private final RuntimeConfig sessionConf;
-  private final Map<String, String> options;
+  private final CaseInsensitiveStringMap options;
 
   SparkConfParser() {
     this.properties = ImmutableMap.of();
     this.sessionConf = new RuntimeConfig(SQLConf.get());
-    this.options = ImmutableMap.of();
+    this.options = CaseInsensitiveStringMap.empty();
   }
 
   SparkConfParser(SparkSession spark, Table table, Map<String, String> 
options) {
     this.properties = table.properties();
     this.sessionConf = spark.conf();
-    this.options = options;
+    this.options = asCaseInsensitiveStringMap(options);
   }
 
   public BooleanConfParser booleanConf() {
@@ -70,6 +70,14 @@ class SparkConfParser {
     return new DurationConfParser();
   }
 
+  private static CaseInsensitiveStringMap 
asCaseInsensitiveStringMap(Map<String, String> map) {
+    if (map instanceof CaseInsensitiveStringMap) {
+      return (CaseInsensitiveStringMap) map;
+    } else {
+      return new CaseInsensitiveStringMap(map);
+    }
+  }
+
   class BooleanConfParser extends ConfParser<BooleanConfParser, Boolean> {
     private Boolean defaultValue;
     private boolean negate = false;
@@ -220,14 +228,10 @@ class SparkConfParser {
     }
 
     protected T parse(Function<String, T> conversion, T defaultValue) {
-      if (!optionNames.isEmpty()) {
-        for (String optionName : optionNames) {
-          // use lower case comparison as DataSourceOptions.asMap() in Spark 2 
returns a lower case
-          // map
-          String optionValue = 
options.get(optionName.toLowerCase(Locale.ROOT));
-          if (optionValue != null) {
-            return conversion.apply(optionValue);
-          }
+      for (String optionName : optionNames) {
+        String optionValue = options.get(optionName);
+        if (optionValue != null) {
+          return conversion.apply(optionValue);
         }
       }
 
diff --git 
a/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkReadConf.java 
b/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkReadConf.java
index 2990d981d0..f5127e9cda 100644
--- a/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkReadConf.java
+++ b/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkReadConf.java
@@ -57,7 +57,6 @@ public class SparkReadConf {
   private final SparkSession spark;
   private final Table table;
   private final String branch;
-  private final Map<String, String> readOptions;
   private final SparkConfParser confParser;
 
   public SparkReadConf(SparkSession spark, Table table, Map<String, String> 
readOptions) {
@@ -69,7 +68,6 @@ public class SparkReadConf {
     this.spark = spark;
     this.table = table;
     this.branch = branch;
-    this.readOptions = readOptions;
     this.confParser = new SparkConfParser(spark, table, readOptions);
   }
 
diff --git 
a/spark/v3.5/spark/src/test/java/org/apache/iceberg/spark/TestSparkWriteConf.java
 
b/spark/v3.5/spark/src/test/java/org/apache/iceberg/spark/TestSparkWriteConf.java
index 9f4a4f47bf..bf2f59f1a4 100644
--- 
a/spark/v3.5/spark/src/test/java/org/apache/iceberg/spark/TestSparkWriteConf.java
+++ 
b/spark/v3.5/spark/src/test/java/org/apache/iceberg/spark/TestSparkWriteConf.java
@@ -79,6 +79,15 @@ public class TestSparkWriteConf extends TestBaseWithCatalog {
     sql("DROP TABLE IF EXISTS %s", tableName);
   }
 
+  @TestTemplate
+  public void testOptionCaseInsensitive() {
+    Table table = validationCatalog.loadTable(tableIdent);
+    Map<String, String> options = ImmutableMap.of("option", "value");
+    SparkConfParser parser = new SparkConfParser(spark, table, options);
+    String parsedValue = parser.stringConf().option("oPtIoN").parseOptional();
+    assertThat(parsedValue).isEqualTo("value");
+  }
+
   @TestTemplate
   public void testDurationConf() {
     Table table = validationCatalog.loadTable(tableIdent);

Reply via email to