/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.facebook.presto.sql.analyzer;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
import io.airlift.configuration.Config;
import io.airlift.configuration.ConfigDescription;
import io.airlift.configuration.DefunctConfig;
import io.airlift.units.DataSize;
import io.airlift.units.Duration;
import javax.validation.constraints.Min;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import static com.facebook.presto.sql.analyzer.RegexLibrary.JONI;
import static com.google.common.collect.ImmutableList.toImmutableList;
import static java.util.concurrent.TimeUnit.MINUTES;
@DefunctConfig({
"resource-group-manager",
"experimental-syntax-enabled",
"analyzer.experimental-syntax-enabled",
"optimizer.processing-optimization"
})
public class FeaturesConfig
{
private boolean distributedIndexJoinsEnabled;
private boolean distributedJoinsEnabled = true;
private boolean colocatedJoinsEnabled;
private boolean fastInequalityJoins = true;
private boolean reorderJoins = true;
private boolean redistributeWrites = true;
private boolean optimizeMetadataQueries;
private boolean optimizeHashGeneration = true;
private boolean optimizeSingleDistinct = true;
private boolean enableIntermediateAggregations = false;
private boolean pushTableWriteThroughUnion = true;
private boolean exchangeCompressionEnabled = false;
private boolean legacyArrayAgg;
private boolean legacyOrderBy;
private boolean legacyMapSubscript;
private boolean optimizeMixedDistinctAggregations;
private boolean dictionaryAggregation;
private boolean resourceGroups;
private int re2JDfaStatesLimit = Integer.MAX_VALUE;
private int re2JDfaRetries = 5;
private RegexLibrary regexLibrary = JONI;
private boolean spillEnabled;
private DataSize operatorMemoryLimitBeforeSpill = new DataSize(4, DataSize.Unit.MEGABYTE);
private List<Path> spillerSpillPaths = ImmutableList.of();
private int spillerThreads = 4;
private double spillMaxUsedSpaceThreshold = 0.9;
private boolean iterativeOptimizerEnabled = true;
private Duration iterativeOptimizerTimeout = new Duration(3, MINUTES); // by default let optimizer wait a long time in case it retrieves some data from ConnectorMetadata
public boolean isResourceGroupsEnabled()
{
return resourceGroups;
}
@Config("experimental.resource-groups-enabled")
public FeaturesConfig setResourceGroupsEnabled(boolean enabled)
{
resourceGroups = enabled;
return this;
}
public boolean isDistributedIndexJoinsEnabled()
{
return distributedIndexJoinsEnabled;
}
@Config("distributed-index-joins-enabled")
public FeaturesConfig setDistributedIndexJoinsEnabled(boolean distributedIndexJoinsEnabled)
{
this.distributedIndexJoinsEnabled = distributedIndexJoinsEnabled;
return this;
}
public boolean isDistributedJoinsEnabled()
{
return distributedJoinsEnabled;
}
@Config("deprecated.legacy-array-agg")
public FeaturesConfig setLegacyArrayAgg(boolean legacyArrayAgg)
{
this.legacyArrayAgg = legacyArrayAgg;
return this;
}
public boolean isLegacyArrayAgg()
{
return legacyArrayAgg;
}
@Config("deprecated.legacy-order-by")
public FeaturesConfig setLegacyOrderBy(boolean value)
{
this.legacyOrderBy = value;
return this;
}
public boolean isLegacyOrderBy()
{
return legacyOrderBy;
}
@Config("deprecated.legacy-map-subscript")
public FeaturesConfig setLegacyMapSubscript(boolean value)
{
this.legacyMapSubscript = value;
return this;
}
public boolean isLegacyMapSubscript()
{
return legacyMapSubscript;
}
@Config("distributed-joins-enabled")
public FeaturesConfig setDistributedJoinsEnabled(boolean distributedJoinsEnabled)
{
this.distributedJoinsEnabled = distributedJoinsEnabled;
return this;
}
public boolean isColocatedJoinsEnabled()
{
return colocatedJoinsEnabled;
}
@Config("colocated-joins-enabled")
@ConfigDescription("Experimental: Use a colocated join when possible")
public FeaturesConfig setColocatedJoinsEnabled(boolean colocatedJoinsEnabled)
{
this.colocatedJoinsEnabled = colocatedJoinsEnabled;
return this;
}
@Config("fast-inequality-joins")
@ConfigDescription("Experimental: Use faster handling of inequality joins if it is possible")
public FeaturesConfig setFastInequalityJoins(boolean fastInequalityJoins)
{
this.fastInequalityJoins = fastInequalityJoins;
return this;
}
public boolean isFastInequalityJoins()
{
return fastInequalityJoins;
}
public boolean isJoinReorderingEnabled()
{
return reorderJoins;
}
@Config("reorder-joins")
@ConfigDescription("Experimental: Reorder joins to optimize plan")
public FeaturesConfig setJoinReorderingEnabled(boolean reorderJoins)
{
this.reorderJoins = reorderJoins;
return this;
}
public boolean isRedistributeWrites()
{
return redistributeWrites;
}
@Config("redistribute-writes")
public FeaturesConfig setRedistributeWrites(boolean redistributeWrites)
{
this.redistributeWrites = redistributeWrites;
return this;
}
public boolean isOptimizeMetadataQueries()
{
return optimizeMetadataQueries;
}
@Config("optimizer.optimize-metadata-queries")
public FeaturesConfig setOptimizeMetadataQueries(boolean optimizeMetadataQueries)
{
this.optimizeMetadataQueries = optimizeMetadataQueries;
return this;
}
public boolean isOptimizeHashGeneration()
{
return optimizeHashGeneration;
}
@Config("optimizer.optimize-hash-generation")
public FeaturesConfig setOptimizeHashGeneration(boolean optimizeHashGeneration)
{
this.optimizeHashGeneration = optimizeHashGeneration;
return this;
}
public boolean isOptimizeSingleDistinct()
{
return optimizeSingleDistinct;
}
@Config("optimizer.optimize-single-distinct")
public FeaturesConfig setOptimizeSingleDistinct(boolean optimizeSingleDistinct)
{
this.optimizeSingleDistinct = optimizeSingleDistinct;
return this;
}
public boolean isPushTableWriteThroughUnion()
{
return pushTableWriteThroughUnion;
}
@Config("optimizer.push-table-write-through-union")
public FeaturesConfig setPushTableWriteThroughUnion(boolean pushTableWriteThroughUnion)
{
this.pushTableWriteThroughUnion = pushTableWriteThroughUnion;
return this;
}
public boolean isDictionaryAggregation()
{
return dictionaryAggregation;
}
@Config("optimizer.dictionary-aggregation")
public FeaturesConfig setDictionaryAggregation(boolean dictionaryAggregation)
{
this.dictionaryAggregation = dictionaryAggregation;
return this;
}
@Min(2)
public int getRe2JDfaStatesLimit()
{
return re2JDfaStatesLimit;
}
@Config("re2j.dfa-states-limit")
public FeaturesConfig setRe2JDfaStatesLimit(int re2JDfaStatesLimit)
{
this.re2JDfaStatesLimit = re2JDfaStatesLimit;
return this;
}
@Min(0)
public int getRe2JDfaRetries()
{
return re2JDfaRetries;
}
@Config("re2j.dfa-retries")
public FeaturesConfig setRe2JDfaRetries(int re2JDfaRetries)
{
this.re2JDfaRetries = re2JDfaRetries;
return this;
}
public RegexLibrary getRegexLibrary()
{
return regexLibrary;
}
@Config("regex-library")
public FeaturesConfig setRegexLibrary(RegexLibrary regexLibrary)
{
this.regexLibrary = regexLibrary;
return this;
}
public boolean isSpillEnabled()
{
return spillEnabled;
}
@Config("experimental.spill-enabled")
public FeaturesConfig setSpillEnabled(boolean spillEnabled)
{
this.spillEnabled = spillEnabled;
return this;
}
public boolean isIterativeOptimizerEnabled()
{
return iterativeOptimizerEnabled;
}
@Config("experimental.iterative-optimizer-enabled")
public FeaturesConfig setIterativeOptimizerEnabled(boolean value)
{
this.iterativeOptimizerEnabled = value;
return this;
}
public Duration getIterativeOptimizerTimeout()
{
return iterativeOptimizerTimeout;
}
@Config("experimental.iterative-optimizer-timeout")
public FeaturesConfig setIterativeOptimizerTimeout(Duration timeout)
{
this.iterativeOptimizerTimeout = timeout;
return this;
}
public DataSize getOperatorMemoryLimitBeforeSpill()
{
return operatorMemoryLimitBeforeSpill;
}
@Config("experimental.operator-memory-limit-before-spill")
public FeaturesConfig setOperatorMemoryLimitBeforeSpill(DataSize operatorMemoryLimitBeforeSpill)
{
this.operatorMemoryLimitBeforeSpill = operatorMemoryLimitBeforeSpill;
return this;
}
public List<Path> getSpillerSpillPaths()
{
return spillerSpillPaths;
}
@Config("experimental.spiller-spill-path")
public FeaturesConfig setSpillerSpillPaths(String spillPaths)
{
List<String> spillPathsSplit = ImmutableList.copyOf(Splitter.on(",").trimResults().omitEmptyStrings().split(spillPaths));
this.spillerSpillPaths = spillPathsSplit.stream().map(path -> Paths.get(path)).collect(toImmutableList());
return this;
}
public int getSpillerThreads()
{
return spillerThreads;
}
@Config("experimental.spiller-threads")
public FeaturesConfig setSpillerThreads(int spillerThreads)
{
this.spillerThreads = spillerThreads;
return this;
}
public double getSpillMaxUsedSpaceThreshold()
{
return spillMaxUsedSpaceThreshold;
}
@Config("experimental.spiller-max-used-space-threshold")
public FeaturesConfig setSpillMaxUsedSpaceThreshold(double spillMaxUsedSpaceThreshold)
{
this.spillMaxUsedSpaceThreshold = spillMaxUsedSpaceThreshold;
return this;
}
public boolean isOptimizeMixedDistinctAggregations()
{
return optimizeMixedDistinctAggregations;
}
@Config("optimizer.optimize-mixed-distinct-aggregations")
public FeaturesConfig setOptimizeMixedDistinctAggregations(boolean value)
{
this.optimizeMixedDistinctAggregations = value;
return this;
}
public boolean isExchangeCompressionEnabled()
{
return exchangeCompressionEnabled;
}
@Config("exchange.compression-enabled")
public FeaturesConfig setExchangeCompressionEnabled(boolean exchangeCompressionEnabled)
{
this.exchangeCompressionEnabled = exchangeCompressionEnabled;
return this;
}
public boolean isEnableIntermediateAggregations()
{
return enableIntermediateAggregations;
}
@Config("optimizer.enable-intermediate-aggregations")
public FeaturesConfig setEnableIntermediateAggregations(boolean enableIntermediateAggregations)
{
this.enableIntermediateAggregations = enableIntermediateAggregations;
return this;
}
}