[ASTERIXDB-3225][CONF] Fixing extension support in cc.conf
- user model changes: no
- storage format changes: no
- interface changes: no
This patch adds back support for specifying custom key-value pairs for
statement executor extensions in the cc.conf file.
Change-Id: Icdee8bfd9eda3947b0dfe34d88d418803345bbb2
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17645
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Ian Maxon <imaxon@uci.edu>
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
index afdcee4..10f118c0 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
@@ -214,8 +214,8 @@
ICcApplicationContext ccAppContext = metadataProvider.getApplicationContext();
CompilerProperties compilerProperties = ccAppContext.getCompilerProperties();
Map<String, Object> querySpecificConfig = validateConfig(metadataProvider.getConfig(), sourceLoc);
- final PhysicalOptimizationConfig physOptConf =
- OptimizationConfUtil.createPhysicalOptimizationConf(compilerProperties, querySpecificConfig, sourceLoc);
+ final PhysicalOptimizationConfig physOptConf = OptimizationConfUtil.createPhysicalOptimizationConf(
+ compilerProperties, querySpecificConfig, configurableParameterNames, sourceLoc);
boolean cboMode = physOptConf.getCBOMode() || physOptConf.getCBOTestMode();
HeuristicCompilerFactoryBuilder builder =
new HeuristicCompilerFactoryBuilder(OptimizationContextFactory.INSTANCE);
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/OptimizationConfUtil.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/OptimizationConfUtil.java
index c103b50..ad31281 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/OptimizationConfUtil.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/OptimizationConfUtil.java
@@ -18,7 +18,11 @@
*/
package org.apache.asterix.common.config;
+import java.util.Arrays;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
import org.apache.asterix.common.exceptions.AsterixException;
import org.apache.asterix.common.exceptions.ErrorCode;
@@ -28,6 +32,7 @@
import org.apache.hyracks.algebricks.core.algebra.operators.physical.AbstractStableSortPOperator;
import org.apache.hyracks.algebricks.core.algebra.operators.physical.WindowPOperator;
import org.apache.hyracks.algebricks.core.rewriter.base.PhysicalOptimizationConfig;
+import org.apache.hyracks.api.config.IOption;
import org.apache.hyracks.api.config.IOptionType;
import org.apache.hyracks.api.exceptions.SourceLocation;
import org.apache.hyracks.control.common.config.OptionTypes;
@@ -44,7 +49,8 @@
}
public static PhysicalOptimizationConfig createPhysicalOptimizationConf(CompilerProperties compilerProperties,
- Map<String, Object> querySpecificConfig, SourceLocation sourceLoc) throws AlgebricksException {
+ Map<String, Object> querySpecificConfig, Set<String> parameterNames, SourceLocation sourceLoc)
+ throws AlgebricksException {
int frameSize = compilerProperties.getFrameSize();
int sortFrameLimit = getSortNumFrames(compilerProperties, querySpecificConfig, sourceLoc);
int groupFrameLimit = getFrameLimit(CompilerProperties.COMPILER_GROUPMEMORY_KEY,
@@ -113,6 +119,17 @@
physOptConf.setForceJoinOrderMode(forceJoinOrder);
physOptConf.setQueryPlanShapeMode(queryPlanShape);
physOptConf.setColumnFilter(columnFilter);
+
+ // We should have already validated the parameter names at this point...
+ Set<String> filteredParameterNames = new HashSet<>(parameterNames);
+ filteredParameterNames.removeAll(
+ Arrays.stream(CompilerProperties.Option.values()).map(IOption::ini).collect(Collectors.toSet()));
+ for (String parameterName : filteredParameterNames) {
+ Object parameterValue = querySpecificConfig.get(parameterName);
+ if (parameterValue != null) {
+ physOptConf.setExtensionProperty(parameterName, parameterValue);
+ }
+ }
return physOptConf;
}
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/PhysicalOptimizationConfig.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/PhysicalOptimizationConfig.java
index 3e51a80..d167153 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/PhysicalOptimizationConfig.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/PhysicalOptimizationConfig.java
@@ -303,6 +303,24 @@
return getBoolean(COLUMN_FILTER, AlgebricksConfig.COLUMN_FILTER_DEFAULT);
}
+ public void setExtensionProperty(String property, Object value) {
+ if (value instanceof Integer) {
+ setInt(property, (Integer) value);
+ } else if (value instanceof Double) {
+ setDouble(property, (Double) value);
+ } else if (value instanceof Boolean) {
+ setBoolean(property, (Boolean) value);
+ } else if (value instanceof String) {
+ setString(property, (String) value);
+ } else {
+ throw new IllegalArgumentException();
+ }
+ }
+
+ public Object getExtensionProperty(String property) {
+ return properties.getProperty(property);
+ }
+
private void setInt(String property, int value) {
properties.setProperty(property, Integer.toString(value));
}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/application/ConfigManagerApplicationConfig.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/application/ConfigManagerApplicationConfig.java
index 44f57fa..f5f508a 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/application/ConfigManagerApplicationConfig.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/application/ConfigManagerApplicationConfig.java
@@ -72,11 +72,13 @@
@Override
public Set<String> getKeys(String section) {
- return configManager.getOptionNames(section);
+ Set<String> keys = configManager.getOptionNames(section);
+ return keys.isEmpty() ? configManager.getExtensionKeys(section) : keys;
}
private Object get(String section, String key) {
- return get(configManager.lookupOption(section, key));
+ IOption option = configManager.lookupOption(section, key);
+ return option != null ? get(option) : configManager.getExtensionValue(section, key);
}
@Override
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java
index 85661fe..a2e43a2f 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java
@@ -453,6 +453,23 @@
return optionNames;
}
+ public Set<String> getExtensionKeys(String sectionName) {
+ Set<String> extensionKeys = new HashSet<>();
+ for (Map.Entry<String, String> entry : extensionOptions.get(sectionName)) {
+ extensionKeys.add(entry.getKey());
+ }
+ return extensionKeys;
+ }
+
+ public Object getExtensionValue(String sectionName, String entryKey) {
+ for (Map.Entry<String, String> entry : extensionOptions.get(sectionName)) {
+ if (entry.getKey().equals(entryKey)) {
+ return entry.getValue();
+ }
+ }
+ return null;
+ }
+
@Override
public Set<IOption> getOptions(Section section) {
return new HashSet<>(getSectionOptionMap(section).values());