Skip to content

Commit 2edc8bc

Browse files
committed
Add session property for connector optimizer to work on values node
1 parent 0fc0482 commit 2edc8bc

File tree

4 files changed

+35
-4
lines changed

4 files changed

+35
-4
lines changed

presto-main/src/main/java/com/facebook/presto/SystemSessionProperties.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ public final class SystemSessionProperties
324324
public static final String OPTIMIZER_USE_HISTOGRAMS = "optimizer_use_histograms";
325325
public static final String WARN_ON_COMMON_NAN_PATTERNS = "warn_on_common_nan_patterns";
326326
public static final String INLINE_PROJECTIONS_ON_VALUES = "inline_projections_on_values";
327+
public static final String INCLUDE_VALUES_NODE_IN_CONNECTOR_OPTIMIZER = "include_values_node_in_connector_optimizer";
327328

328329
// TODO: Native execution related session properties that are temporarily put here. They will be relocated in the future.
329330
public static final String NATIVE_AGGREGATION_SPILL_ALL = "native_aggregation_spill_all";
@@ -1820,6 +1821,10 @@ public SystemSessionProperties(
18201821
"Whether to evaluate project node on values node",
18211822
featuresConfig.getInlineProjectionsOnValues(),
18221823
false),
1824+
booleanProperty(INCLUDE_VALUES_NODE_IN_CONNECTOR_OPTIMIZER,
1825+
"Include values node for connector optimizer",
1826+
featuresConfig.isIncludeValuesNodeInConnectorOptimizer(),
1827+
false),
18231828
integerProperty(
18241829
NATIVE_MIN_COLUMNAR_ENCODING_CHANNELS_TO_PREFER_ROW_WISE_ENCODING,
18251830
"Minimum number of columnar encoding channels to consider row wise encoding for partitioned exchange. Native execution only",
@@ -3096,6 +3101,11 @@ public static boolean isInlineProjectionsOnValues(Session session)
30963101
return session.getSystemProperty(INLINE_PROJECTIONS_ON_VALUES, Boolean.class);
30973102
}
30983103

3104+
public static boolean isIncludeValuesNodeInConnectorOptimizer(Session session)
3105+
{
3106+
return session.getSystemProperty(INCLUDE_VALUES_NODE_IN_CONNECTOR_OPTIMIZER, Boolean.class);
3107+
}
3108+
30993109
public static int getMinColumnarEncodingChannelsToPreferRowWiseEncoding(Session session)
31003110
{
31013111
return session.getSystemProperty(NATIVE_MIN_COLUMNAR_ENCODING_CHANNELS_TO_PREFER_ROW_WISE_ENCODING, Integer.class);

presto-main/src/main/java/com/facebook/presto/sql/analyzer/FeaturesConfig.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@ public class FeaturesConfig
283283
private boolean useHistograms;
284284

285285
private boolean isInlineProjectionsOnValuesEnabled;
286+
private boolean includeValuesNodeInConnectorOptimizer = true;
286287

287288
private boolean eagerPlanValidationEnabled;
288289
private int eagerPlanValidationThreadPoolSize = 20;
@@ -2810,6 +2811,19 @@ public FeaturesConfig setInlineProjectionsOnValues(boolean isInlineProjectionsOn
28102811
return this;
28112812
}
28122813

2814+
public boolean isIncludeValuesNodeInConnectorOptimizer()
2815+
{
2816+
return includeValuesNodeInConnectorOptimizer;
2817+
}
2818+
2819+
@Config("optimizer.include-values-node-in-connector-optimizer")
2820+
@ConfigDescription("Include values node in connector optimizer")
2821+
public FeaturesConfig setIncludeValuesNodeInConnectorOptimizer(boolean includeValuesNodeInConnectorOptimizer)
2822+
{
2823+
this.includeValuesNodeInConnectorOptimizer = includeValuesNodeInConnectorOptimizer;
2824+
return this;
2825+
}
2826+
28132827
@Config("eager-plan-validation-enabled")
28142828
@ConfigDescription("Enable eager building and validation of logical plan before queueing")
28152829
public FeaturesConfig setEagerPlanValidationEnabled(boolean eagerPlanValidationEnabled)

presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/ApplyConnectorOptimization.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,13 @@
5757
import java.util.Queue;
5858
import java.util.Set;
5959

60+
import static com.facebook.presto.SystemSessionProperties.isIncludeValuesNodeInConnectorOptimizer;
6061
import static com.facebook.presto.common.RuntimeUnit.NANO;
6162
import static com.facebook.presto.sql.OptimizerRuntimeTrackUtil.getOptimizerNameForLog;
6263
import static com.facebook.presto.sql.OptimizerRuntimeTrackUtil.trackOptimizerRuntime;
6364
import static com.google.common.base.Preconditions.checkArgument;
6465
import static com.google.common.base.Preconditions.checkState;
66+
import static com.google.common.collect.ImmutableSet.toImmutableSet;
6567
import static java.util.Objects.requireNonNull;
6668

6769
public class ApplyConnectorOptimization
@@ -144,9 +146,9 @@ public PlanOptimizerResult optimize(PlanNode plan, Session session, TypeProvider
144146
// * The subtree with root `node` is a closure.
145147
// * `node` has no parent, or the subtree with root as `node`'s parent is not a closure.
146148
ConnectorPlanNodeContext context = contextMap.get(node);
147-
if (!context.isClosure(connectorId) ||
149+
if (!context.isClosure(connectorId, session) ||
148150
!context.getParent().isPresent() ||
149-
contextMap.get(context.getParent().get()).isClosure(connectorId)) {
151+
contextMap.get(context.getParent().get()).isClosure(connectorId, session)) {
150152
continue;
151153
}
152154

@@ -293,10 +295,12 @@ public Set<Class<? extends PlanNode>> getReachablePlanNodeTypes()
293295
return reachablePlanNodeTypes;
294296
}
295297

296-
boolean isClosure(ConnectorId connectorId)
298+
boolean isClosure(ConnectorId connectorId, Session session)
297299
{
298300
// check if all children can reach the only connector
299-
if (reachableConnectors.size() != 1 || !reachableConnectors.contains(connectorId)) {
301+
boolean includeValuesNode = isIncludeValuesNodeInConnectorOptimizer(session);
302+
Set<ConnectorId> connectorIds = includeValuesNode ? reachableConnectors.stream().filter(x -> !x.equals(EMPTY_CONNECTOR_ID)).collect(toImmutableSet()) : reachableConnectors;
303+
if (connectorIds.size() != 1 || !connectorIds.contains(connectorId)) {
300304
return false;
301305
}
302306

presto-main/src/test/java/com/facebook/presto/sql/analyzer/TestFeaturesConfig.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ public void testDefaults()
244244
.setRemoveCrossJoinWithSingleConstantRow(true)
245245
.setUseHistograms(false)
246246
.setInlineProjectionsOnValues(false)
247+
.setIncludeValuesNodeInConnectorOptimizer(true)
247248
.setEagerPlanValidationEnabled(false)
248249
.setEagerPlanValidationThreadPoolSize(20)
249250
.setPrestoSparkExecutionEnvironment(false));
@@ -439,6 +440,7 @@ public void testExplicitPropertyMappings()
439440
.put("optimizer.remove-cross-join-with-single-constant-row", "false")
440441
.put("optimizer.use-histograms", "true")
441442
.put("optimizer.inline-projections-on-values", "true")
443+
.put("optimizer.include-values-node-in-connector-optimizer", "false")
442444
.put("eager-plan-validation-enabled", "true")
443445
.put("eager-plan-validation-thread-pool-size", "2")
444446
.put("presto-spark-execution-environment", "true")
@@ -632,6 +634,7 @@ public void testExplicitPropertyMappings()
632634
.setRemoveCrossJoinWithSingleConstantRow(false)
633635
.setUseHistograms(true)
634636
.setInlineProjectionsOnValues(true)
637+
.setIncludeValuesNodeInConnectorOptimizer(false)
635638
.setEagerPlanValidationEnabled(true)
636639
.setEagerPlanValidationThreadPoolSize(2)
637640
.setPrestoSparkExecutionEnvironment(true);

0 commit comments

Comments
 (0)