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)));
}
}