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

richox pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/auron.git


The following commit(s) were added to refs/heads/master by this push:
     new ae479902 [AURON #1621] Introduces dynamic default value for 
ConfigOption (#1622)
ae479902 is described below

commit ae4799023572b5862ed38737fac33f598d65312a
Author: zhangmang <[email protected]>
AuthorDate: Thu Nov 13 14:20:23 2025 +0800

    [AURON #1621] Introduces dynamic default value for ConfigOption (#1622)
    
    * [AURON #1621] Introduces dynamic default value for ConfigOption
    
    * fix checkstyle
---
 .../auron/configuration/AuronConfiguration.java    | 28 ++++++++++++++-----
 .../apache/auron/configuration/ConfigOption.java   | 31 +++++++++++++++++++++-
 .../apache/auron/configuration/ConfigOptions.java  | 10 +++++--
 .../configuration/AuronConfigurationTest.java      |  2 ++
 .../configuration/MockAuronConfiguration.java      |  7 ++++-
 .../configuration/SparkAuronConfiguration.java     | 15 +++--------
 6 files changed, 71 insertions(+), 22 deletions(-)

diff --git 
a/auron-core/src/main/java/org/apache/auron/configuration/AuronConfiguration.java
 
b/auron-core/src/main/java/org/apache/auron/configuration/AuronConfiguration.java
index cd04569e..19ecab7e 100644
--- 
a/auron-core/src/main/java/org/apache/auron/configuration/AuronConfiguration.java
+++ 
b/auron-core/src/main/java/org/apache/auron/configuration/AuronConfiguration.java
@@ -44,7 +44,7 @@ public abstract class AuronConfiguration {
     public abstract <T> Optional<T> getOptional(String key);
 
     public <T> T get(ConfigOption<T> option) {
-        return getOptional(option).orElseGet(option::defaultValue);
+        return getOptional(option).orElseGet(() -> 
getOptionDefaultValue(option));
     }
 
     /**
@@ -54,7 +54,7 @@ public abstract class AuronConfiguration {
      * @return the (default) value associated with the given config option
      */
     public String getString(ConfigOption<String> configOption) {
-        return getOptional(configOption).orElseGet(configOption::defaultValue);
+        return getOptional(configOption).orElseGet(() -> 
getOptionDefaultValue(configOption));
     }
 
     /**
@@ -76,7 +76,7 @@ public abstract class AuronConfiguration {
      * @return the (default) value associated with the given config option
      */
     public int getInteger(ConfigOption<Integer> configOption) {
-        return getOptional(configOption).orElseGet(configOption::defaultValue);
+        return getOptional(configOption).orElseGet(() -> 
getOptionDefaultValue(configOption));
     }
 
     /**
@@ -99,7 +99,7 @@ public abstract class AuronConfiguration {
      * @return the (default) value associated with the given config option
      */
     public long getLong(ConfigOption<Long> configOption) {
-        return getOptional(configOption).orElseGet(configOption::defaultValue);
+        return getOptional(configOption).orElseGet(() -> 
getOptionDefaultValue(configOption));
     }
 
     /**
@@ -122,7 +122,7 @@ public abstract class AuronConfiguration {
      * @return the (default) value associated with the given config option
      */
     public boolean getBoolean(ConfigOption<Boolean> configOption) {
-        return getOptional(configOption).orElseGet(configOption::defaultValue);
+        return getOptional(configOption).orElseGet(() -> 
getOptionDefaultValue(configOption));
     }
 
     /**
@@ -145,7 +145,7 @@ public abstract class AuronConfiguration {
      * @return the (default) value associated with the given config option
      */
     public float getFloat(ConfigOption<Float> configOption) {
-        return getOptional(configOption).orElseGet(configOption::defaultValue);
+        return getOptional(configOption).orElseGet(() -> 
getOptionDefaultValue(configOption));
     }
 
     /**
@@ -168,7 +168,7 @@ public abstract class AuronConfiguration {
      * @return the (default) value associated with the given config option
      */
     public double getDouble(ConfigOption<Double> configOption) {
-        return getOptional(configOption).orElseGet(configOption::defaultValue);
+        return getOptional(configOption).orElseGet(() -> 
getOptionDefaultValue(configOption));
     }
 
     /**
@@ -183,4 +183,18 @@ public abstract class AuronConfiguration {
     public double getDouble(ConfigOption<Double> configOption, double 
overrideDefault) {
         return getOptional(configOption).orElse(overrideDefault);
     }
+
+    /**
+     * Returns the value associated with the given config option as a {@code 
double}.
+     *
+     * @param configOption The configuration option
+     * @return the (default) value associated with the given config option
+     */
+    protected <T> T getOptionDefaultValue(ConfigOption<T> configOption) {
+        if (configOption.hasDynamicDefaultValue()) {
+            return configOption.dynamicDefaultValueFunction().apply(this);
+        } else {
+            return configOption.defaultValue();
+        }
+    }
 }
diff --git 
a/auron-core/src/main/java/org/apache/auron/configuration/ConfigOption.java 
b/auron-core/src/main/java/org/apache/auron/configuration/ConfigOption.java
index 5c566fc5..925f3ddd 100644
--- a/auron-core/src/main/java/org/apache/auron/configuration/ConfigOption.java
+++ b/auron-core/src/main/java/org/apache/auron/configuration/ConfigOption.java
@@ -18,6 +18,8 @@ package org.apache.auron.configuration;
 
 import static org.apache.auron.util.Preconditions.checkNotNull;
 
+import java.util.function.Function;
+
 /**
  * A {@code ConfigOption} describes a configuration parameter. It encapsulates 
the configuration
  * key, and an optional default value for the configuration parameter.
@@ -41,6 +43,9 @@ public class ConfigOption<T> {
     /** The description for this option. */
     private final String description;
 
+    /** The function to compute the default value. */
+    private final Function<AuronConfiguration, T> dynamicDefaultValueFunction;
+
     /**
      * Type of the value that this ConfigOption describes.
      *
@@ -60,11 +65,17 @@ public class ConfigOption<T> {
      * @param description Description for that option
      * @param defaultValue The default value for this option
      */
-    ConfigOption(String key, Class<?> clazz, T defaultValue, String 
description) {
+    ConfigOption(
+            String key,
+            Class<?> clazz,
+            T defaultValue,
+            String description,
+            Function<AuronConfiguration, T> dynamicDefaultValueFunction) {
         this.key = checkNotNull(key);
         this.description = description;
         this.defaultValue = defaultValue;
         this.clazz = checkNotNull(clazz);
+        this.dynamicDefaultValueFunction = dynamicDefaultValueFunction;
     }
 
     /**
@@ -102,4 +113,22 @@ public class ConfigOption<T> {
     public T defaultValue() {
         return defaultValue;
     }
+
+    /**
+     * Checks if this option has a dynamic default value.
+     *
+     * @return True if it has a dynamic default value, false if not.
+     */
+    public boolean hasDynamicDefaultValue() {
+        return dynamicDefaultValueFunction != null;
+    }
+
+    /**
+     * Returns the dynamic default value function, or null, if there is no 
dynamic default value.
+     *
+     * @return The dynamic default value function, or null.
+     */
+    public Function<AuronConfiguration, T> dynamicDefaultValueFunction() {
+        return dynamicDefaultValueFunction;
+    }
 }
diff --git 
a/auron-core/src/main/java/org/apache/auron/configuration/ConfigOptions.java 
b/auron-core/src/main/java/org/apache/auron/configuration/ConfigOptions.java
index e872528c..47efc98e 100644
--- a/auron-core/src/main/java/org/apache/auron/configuration/ConfigOptions.java
+++ b/auron-core/src/main/java/org/apache/auron/configuration/ConfigOptions.java
@@ -18,6 +18,8 @@ package org.apache.auron.configuration;
 
 import static org.apache.auron.util.Preconditions.checkNotNull;
 
+import java.util.function.Function;
+
 /**
  * Refer to the design of the Flink engine.
  * {@code ConfigOptions} are used to build a {@link ConfigOption}. The option 
is typically built in
@@ -148,7 +150,7 @@ public class ConfigOptions {
          * @return The config option with the default value.
          */
         public ConfigOption<T> defaultValue(T value) {
-            return new ConfigOption<>(key, clazz, value, description);
+            return new ConfigOption<>(key, clazz, value, description, null);
         }
 
         /**
@@ -157,7 +159,11 @@ public class ConfigOptions {
          * @return The config option without a default value.
          */
         public ConfigOption<T> noDefaultValue() {
-            return new ConfigOption<>(key, clazz, null, description);
+            return new ConfigOption<>(key, clazz, null, description, null);
+        }
+
+        public ConfigOption<T> 
dynamicDefaultValue(Function<AuronConfiguration, T> 
dynamicDefaultValueFunction) {
+            return new ConfigOption<>(key, clazz, null, description, 
dynamicDefaultValueFunction);
         }
     }
 
diff --git 
a/auron-core/src/test/java/org/apache/auron/configuration/AuronConfigurationTest.java
 
b/auron-core/src/test/java/org/apache/auron/configuration/AuronConfigurationTest.java
index 63e1427e..afee2f59 100644
--- 
a/auron-core/src/test/java/org/apache/auron/configuration/AuronConfigurationTest.java
+++ 
b/auron-core/src/test/java/org/apache/auron/configuration/AuronConfigurationTest.java
@@ -48,5 +48,7 @@ public class AuronConfigurationTest {
         assertEquals(99.9, 
config.get(MockAuronConfiguration.DOUBLE_CONFIG_OPTION), 0.0000000001);
         assertEquals(10000000000L, 
config.getLong(MockAuronConfiguration.LONG_CONFIG_OPTION));
         assertEquals(1.2f, 
config.get(MockAuronConfiguration.FLOAT_CONFIG_OPTION), 0.0000000001);
+        // test dynamic default value
+        assertEquals(500, 
config.getInteger(MockAuronConfiguration.INT_WITH_DYNAMIC_DEFAULT_CONFIG_OPTION));
     }
 }
diff --git 
a/auron-core/src/test/java/org/apache/auron/configuration/MockAuronConfiguration.java
 
b/auron-core/src/test/java/org/apache/auron/configuration/MockAuronConfiguration.java
index 85fbbd88..eb14c38c 100644
--- 
a/auron-core/src/test/java/org/apache/auron/configuration/MockAuronConfiguration.java
+++ 
b/auron-core/src/test/java/org/apache/auron/configuration/MockAuronConfiguration.java
@@ -43,6 +43,11 @@ public class MockAuronConfiguration extends 
AuronConfiguration {
     public static final ConfigOption<Float> FLOAT_CONFIG_OPTION =
             ConfigOptions.key("float").floatType().defaultValue(1.0f);
 
+    public static final ConfigOption<Integer> 
INT_WITH_DYNAMIC_DEFAULT_CONFIG_OPTION = ConfigOptions.key(
+                    "int_with_dynamic_default")
+            .intType()
+            .dynamicDefaultValue(config -> 
config.getInteger(INT_CONFIG_OPTION) * 5);
+
     private Map<String, Object> configMap = new HashMap<>();
 
     public MockAuronConfiguration() {}
@@ -53,7 +58,7 @@ public class MockAuronConfiguration extends 
AuronConfiguration {
 
     @Override
     public <T> Optional<T> getOptional(ConfigOption<T> option) {
-        return Optional.ofNullable((T) configMap.get(option.key()));
+        return Optional.ofNullable((T) configMap.getOrDefault(option.key(), 
getOptionDefaultValue(option)));
     }
 
     @Override
diff --git 
a/spark-extension/src/main/java/org/apache/auron/spark/configuration/SparkAuronConfiguration.java
 
b/spark-extension/src/main/java/org/apache/auron/spark/configuration/SparkAuronConfiguration.java
index e425c012..5d6f2905 100644
--- 
a/spark-extension/src/main/java/org/apache/auron/spark/configuration/SparkAuronConfiguration.java
+++ 
b/spark-extension/src/main/java/org/apache/auron/spark/configuration/SparkAuronConfiguration.java
@@ -22,7 +22,6 @@ import java.util.Optional;
 import org.apache.auron.configuration.AuronConfiguration;
 import org.apache.auron.configuration.ConfigOption;
 import org.apache.auron.configuration.ConfigOptions;
-import org.apache.auron.jni.AuronAdaptor;
 import org.apache.spark.SparkConf;
 import org.apache.spark.internal.config.ConfigEntry;
 import org.apache.spark.internal.config.ConfigEntryWithDefault;
@@ -114,14 +113,8 @@ public class SparkAuronConfiguration extends 
AuronConfiguration {
                     "auron.partialAggSkipping.minRows")
             .description("minimum number of rows to trigger partial aggregate 
skipping.")
             .intType()
-            .defaultValue(
-                    AuronAdaptor.getInstance() != null
-                            ? AuronAdaptor.getInstance()
-                                            .getAuronConfiguration()
-                                            
.getOptional(AuronConfiguration.BATCH_SIZE)
-                                            .get()
-                                    * 5
-                            : AuronConfiguration.BATCH_SIZE.defaultValue() * 
5);
+            .dynamicDefaultValue(
+                    config -> 
config.getOptional(AuronConfiguration.BATCH_SIZE).get() * 5);
 
     public static final ConfigOption<Boolean> PARTIAL_AGG_SKIPPING_SKIP_SPILL 
= ConfigOptions.key(
                     "auron.partialAggSkipping.skipSpill")
@@ -249,9 +242,9 @@ public class SparkAuronConfiguration extends 
AuronConfiguration {
     @Override
     public <T> Optional<T> getOptional(ConfigOption<T> option) {
         if (option.key().startsWith(SPARK_PREFIX)) {
-            return Optional.ofNullable(getSparkConf(option.key(), 
option.defaultValue()));
+            return Optional.ofNullable(getSparkConf(option.key(), 
getOptionDefaultValue(option)));
         } else {
-            return Optional.ofNullable(getSparkConf(SPARK_PREFIX + 
option.key(), option.defaultValue()));
+            return Optional.ofNullable(getSparkConf(SPARK_PREFIX + 
option.key(), getOptionDefaultValue(option)));
         }
     }
 

Reply via email to