Search in sources :

Example 1 with REMOTE_STREAMING

use of com.facebook.presto.sql.planner.plan.ExchangeNode.Scope.REMOTE_STREAMING in project presto by prestodb.

the class TestLogicalPlanner method testBroadcastCorrelatedSubqueryAvoidsRemoteExchangeBeforeAggregation.

@Test
public void testBroadcastCorrelatedSubqueryAvoidsRemoteExchangeBeforeAggregation() {
    Session broadcastJoin = Session.builder(this.getQueryRunner().getDefaultSession()).setSystemProperty(JOIN_DISTRIBUTION_TYPE, JoinDistributionType.BROADCAST.name()).setSystemProperty(FORCE_SINGLE_NODE_OUTPUT, Boolean.toString(false)).build();
    // make sure there is a remote exchange on the build side
    PlanMatchPattern joinBuildSideWithRemoteExchange = anyTree(node(JoinNode.class, anyTree(node(TableScanNode.class)), anyTree(exchange(REMOTE_STREAMING, ExchangeNode.Type.REPLICATE, anyTree(node(TableScanNode.class))))));
    // validates that there exists only one remote exchange
    Consumer<Plan> validateSingleRemoteExchange = plan -> assertEquals(countOfMatchingNodes(plan, node -> node instanceof ExchangeNode && ((ExchangeNode) node).getScope().isRemote()), 1);
    Consumer<Plan> validateSingleStreamingAggregation = plan -> assertEquals(countOfMatchingNodes(plan, node -> node instanceof AggregationNode && ((AggregationNode) node).getGroupingKeys().contains(new VariableReferenceExpression(Optional.empty(), "unique", BIGINT)) && ((AggregationNode) node).isStreamable()), 1);
    // region is unpartitioned, AssignUniqueId should provide satisfying partitioning for count(*) after LEFT JOIN
    assertPlanWithSession("SELECT (SELECT COUNT(*) FROM region r2 WHERE r2.regionkey > r1.regionkey) FROM region r1", broadcastJoin, false, joinBuildSideWithRemoteExchange, validateSingleRemoteExchange.andThen(validateSingleStreamingAggregation));
    // orders is naturally partitioned, AssignUniqueId should not overwrite its natural partitioning
    assertPlanWithSession("SELECT COUNT(COUNT) " + "FROM (SELECT o1.orderkey orderkey, (SELECT COUNT(*) FROM orders o2 WHERE o2.orderkey > o1.orderkey) COUNT FROM orders o1) " + "GROUP BY orderkey", broadcastJoin, false, joinBuildSideWithRemoteExchange, validateSingleRemoteExchange.andThen(validateSingleStreamingAggregation));
}
Also used : FORCE_SINGLE_NODE_OUTPUT(com.facebook.presto.SystemSessionProperties.FORCE_SINGLE_NODE_OUTPUT) PlanMatchPattern.filter(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.filter) PlanMatchPattern.anyTree(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.anyTree) REPLICATE(com.facebook.presto.sql.planner.plan.ExchangeNode.Type.REPLICATE) PlanMatchPattern.anyNot(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.anyNot) Test(org.testng.annotations.Test) DESCENDING(com.facebook.presto.sql.tree.SortItem.Ordering.DESCENDING) ValuesNode(com.facebook.presto.spi.plan.ValuesNode) PlanMatchPattern(com.facebook.presto.sql.planner.assertions.PlanMatchPattern) PlanMatchPattern.join(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.join) ASC_NULLS_LAST(com.facebook.presto.common.block.SortOrder.ASC_NULLS_LAST) IndexJoinNode(com.facebook.presto.sql.planner.plan.IndexJoinNode) PlanMatchPattern.expression(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.expression) Slices.utf8Slice(io.airlift.slice.Slices.utf8Slice) Assert.assertFalse(org.testng.Assert.assertFalse) PARTIAL(com.facebook.presto.spi.plan.AggregationNode.Step.PARTIAL) LateralJoinNode(com.facebook.presto.sql.planner.plan.LateralJoinNode) SUBQUERY_MULTIPLE_ROWS(com.facebook.presto.spi.StandardErrorCode.SUBQUERY_MULTIPLE_ROWS) PlanMatchPattern.semiJoin(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.semiJoin) LAST(com.facebook.presto.sql.tree.SortItem.NullOrdering.LAST) PlanMatchPattern.apply(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.apply) PlanMatchPattern.rowNumber(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.rowNumber) JOIN_DISTRIBUTION_TYPE(com.facebook.presto.SystemSessionProperties.JOIN_DISTRIBUTION_TYPE) TASK_CONCURRENCY(com.facebook.presto.SystemSessionProperties.TASK_CONCURRENCY) REPLICATED(com.facebook.presto.sql.planner.plan.JoinNode.DistributionType.REPLICATED) OPTIMIZE_NULLS_IN_JOINS(com.facebook.presto.SystemSessionProperties.OPTIMIZE_NULLS_IN_JOINS) LongLiteral(com.facebook.presto.sql.tree.LongLiteral) ApplyNode(com.facebook.presto.sql.planner.plan.ApplyNode) PlanMatchPattern.strictProject(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.strictProject) PlanMatchPattern.node(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.node) PlanMatchPattern.specification(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.specification) PlanOptimizer(com.facebook.presto.sql.planner.optimizations.PlanOptimizer) GATHER(com.facebook.presto.sql.planner.plan.ExchangeNode.Type.GATHER) OFFSET_CLAUSE_ENABLED(com.facebook.presto.SystemSessionProperties.OFFSET_CLAUSE_ENABLED) DistinctLimitNode(com.facebook.presto.spi.plan.DistinctLimitNode) AddLocalExchanges(com.facebook.presto.sql.planner.optimizations.AddLocalExchanges) ASCENDING(com.facebook.presto.sql.tree.SortItem.Ordering.ASCENDING) PlanMatchPattern.functionCall(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.functionCall) BIGINT(com.facebook.presto.common.type.BigintType.BIGINT) Session(com.facebook.presto.Session) ELIMINATE_CROSS_JOINS(com.facebook.presto.sql.analyzer.FeaturesConfig.JoinReorderingStrategy.ELIMINATE_CROSS_JOINS) PlanMatchPattern.exchange(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.exchange) RIGHT(com.facebook.presto.sql.planner.plan.JoinNode.Type.RIGHT) OPTIMIZE_JOINS_WITH_EMPTY_SOURCES(com.facebook.presto.SystemSessionProperties.OPTIMIZE_JOINS_WITH_EMPTY_SOURCES) TableScanNode(com.facebook.presto.spi.plan.TableScanNode) SemiJoinNode(com.facebook.presto.sql.planner.plan.SemiJoinNode) AggregationNode(com.facebook.presto.spi.plan.AggregationNode) QueryTemplate.queryTemplate(com.facebook.presto.tests.QueryTemplate.queryTemplate) BasePlanTest(com.facebook.presto.sql.planner.assertions.BasePlanTest) PlanMatchPattern.output(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.output) VariableReferenceExpression(com.facebook.presto.spi.relation.VariableReferenceExpression) MorePredicates.isInstanceOfAny(com.facebook.presto.util.MorePredicates.isInstanceOfAny) PlanMatchPattern.window(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.window) JoinDistributionType(com.facebook.presto.sql.analyzer.FeaturesConfig.JoinDistributionType) PlanMatchPattern.aggregation(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.aggregation) PlanMatchPattern.sort(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.sort) OPTIMIZE_HASH_GENERATION(com.facebook.presto.SystemSessionProperties.OPTIMIZE_HASH_GENERATION) PlanMatchPattern.project(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.project) ImmutableMap(com.google.common.collect.ImmutableMap) PlanMatchPattern.topN(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.topN) Predicate(java.util.function.Predicate) Domain.singleValue(com.facebook.presto.common.predicate.Domain.singleValue) PlanMatchPattern.constrainedTableScan(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.constrainedTableScan) String.format(java.lang.String.format) REMOTE_STREAMING(com.facebook.presto.sql.planner.plan.ExchangeNode.Scope.REMOTE_STREAMING) List(java.util.List) RowNumberSymbolMatcher(com.facebook.presto.sql.planner.assertions.RowNumberSymbolMatcher) ExpressionMatcher(com.facebook.presto.sql.planner.assertions.ExpressionMatcher) MorePredicates(com.facebook.presto.util.MorePredicates) JOIN_REORDERING_STRATEGY(com.facebook.presto.SystemSessionProperties.JOIN_REORDERING_STRATEGY) PlanMatchPattern.markDistinct(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.markDistinct) Optional(java.util.Optional) INNER(com.facebook.presto.sql.planner.plan.JoinNode.Type.INNER) PlanMatchPattern.assignUniqueId(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.assignUniqueId) Assert.assertEquals(org.testng.Assert.assertEquals) SINGLE(com.facebook.presto.spi.plan.AggregationNode.Step.SINGLE) VarcharType.createVarcharType(com.facebook.presto.common.type.VarcharType.createVarcharType) DISTRIBUTED_SORT(com.facebook.presto.SystemSessionProperties.DISTRIBUTED_SORT) ENFORCE_FIXED_DISTRIBUTION_FOR_OUTPUT_OPERATOR(com.facebook.presto.SystemSessionProperties.ENFORCE_FIXED_DISTRIBUTION_FOR_OUTPUT_OPERATOR) PlanMatchPattern.singleGroupingSet(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.singleGroupingSet) FilterNode(com.facebook.presto.spi.plan.FilterNode) QueryTemplate(com.facebook.presto.tests.QueryTemplate) ImmutableList(com.google.common.collect.ImmutableList) LOCAL(com.facebook.presto.sql.planner.plan.ExchangeNode.Scope.LOCAL) REPARTITION(com.facebook.presto.sql.planner.plan.ExchangeNode.Type.REPARTITION) PlanMatchPattern.equiJoinClause(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.equiJoinClause) FINAL(com.facebook.presto.spi.plan.AggregationNode.Step.FINAL) PlanMatchPattern.topNRowNumber(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.topNRowNumber) PlanMatchPattern.any(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.any) PlanMatchPattern.strictTableScan(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.strictTableScan) PlanNodeSearcher.searchFrom(com.facebook.presto.sql.planner.optimizations.PlanNodeSearcher.searchFrom) JoinNode(com.facebook.presto.sql.planner.plan.JoinNode) PlanMatchPattern.constrainedTableScanWithTableLayout(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.constrainedTableScanWithTableLayout) PlanMatchPattern.limit(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.limit) PlanMatchPattern.tableScan(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.tableScan) Consumer(java.util.function.Consumer) PlanNode(com.facebook.presto.spi.plan.PlanNode) LEFT(com.facebook.presto.sql.planner.plan.JoinNode.Type.LEFT) PlanMatchPattern.values(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.values) PARTITIONED(com.facebook.presto.sql.planner.plan.JoinNode.DistributionType.PARTITIONED) EnforceSingleRowNode(com.facebook.presto.sql.planner.plan.EnforceSingleRowNode) ExchangeNode(com.facebook.presto.sql.planner.plan.ExchangeNode) StatisticsWriterNode(com.facebook.presto.sql.planner.plan.StatisticsWriterNode) TableScanNode(com.facebook.presto.spi.plan.TableScanNode) ExchangeNode(com.facebook.presto.sql.planner.plan.ExchangeNode) IndexJoinNode(com.facebook.presto.sql.planner.plan.IndexJoinNode) LateralJoinNode(com.facebook.presto.sql.planner.plan.LateralJoinNode) SemiJoinNode(com.facebook.presto.sql.planner.plan.SemiJoinNode) JoinNode(com.facebook.presto.sql.planner.plan.JoinNode) VariableReferenceExpression(com.facebook.presto.spi.relation.VariableReferenceExpression) PlanMatchPattern(com.facebook.presto.sql.planner.assertions.PlanMatchPattern) AggregationNode(com.facebook.presto.spi.plan.AggregationNode) Session(com.facebook.presto.Session) Test(org.testng.annotations.Test) BasePlanTest(com.facebook.presto.sql.planner.assertions.BasePlanTest)

Example 2 with REMOTE_STREAMING

use of com.facebook.presto.sql.planner.plan.ExchangeNode.Scope.REMOTE_STREAMING in project presto by prestodb.

the class TestAddExchangesPlans method assertPlanWithMergePartitionStrategy.

private void assertPlanWithMergePartitionStrategy(String sql, String partitionMergingStrategy, int remoteRepartitionExchangeCount, PlanMatchPattern pattern) {
    Session session = Session.builder(this.getQueryRunner().getDefaultSession()).setSystemProperty(AGGREGATION_PARTITIONING_MERGING_STRATEGY, partitionMergingStrategy).setSystemProperty(TASK_CONCURRENCY, "2").build();
    BiConsumer<Plan, Integer> validateMultipleRemoteRepartitionExchange = (plan, count) -> assertEquals(searchFrom(plan.getRoot()).where(node -> node instanceof ExchangeNode && ((ExchangeNode) node).getScope() == REMOTE_STREAMING && ((ExchangeNode) node).getType() == REPARTITION).count(), count.intValue());
    assertPlanWithSession(sql, session, false, pattern, plan -> validateMultipleRemoteRepartitionExchange.accept(plan, remoteRepartitionExchangeCount));
}
Also used : ALL(com.facebook.presto.execution.QueryManagerConfig.ExchangeMaterializationStrategy.ALL) AggregationNode(com.facebook.presto.spi.plan.AggregationNode) BasePlanTest(com.facebook.presto.sql.planner.assertions.BasePlanTest) PlanMatchPattern.anyTree(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.anyTree) GroupIdNode(com.facebook.presto.sql.planner.plan.GroupIdNode) Assert.assertEquals(org.testng.Assert.assertEquals) Test(org.testng.annotations.Test) SINGLE(com.facebook.presto.spi.plan.AggregationNode.Step.SINGLE) TestingSession(com.facebook.presto.testing.TestingSession) PlanMatchPattern(com.facebook.presto.sql.planner.assertions.PlanMatchPattern) PlanMatchPattern.join(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.join) PlanMatchPattern.singleGroupingSet(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.singleGroupingSet) AGGREGATION_PARTITIONING_MERGING_STRATEGY(com.facebook.presto.SystemSessionProperties.AGGREGATION_PARTITIONING_MERGING_STRATEGY) ImmutableList(com.google.common.collect.ImmutableList) PREFER_EXACT_PARTITIONING(com.facebook.presto.sql.analyzer.FeaturesConfig.PartitioningPrecisionStrategy.PREFER_EXACT_PARTITIONING) LOCAL(com.facebook.presto.sql.planner.plan.ExchangeNode.Scope.LOCAL) REPARTITION(com.facebook.presto.sql.planner.plan.ExchangeNode.Type.REPARTITION) PlanMatchPattern.equiJoinClause(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.equiJoinClause) BiConsumer(java.util.function.BiConsumer) Plan(com.facebook.presto.sql.planner.Plan) PlanMatchPattern.aggregation(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.aggregation) PlanNodeSearcher.searchFrom(com.facebook.presto.sql.planner.optimizations.PlanNodeSearcher.searchFrom) FunctionCall(com.facebook.presto.sql.tree.FunctionCall) EXCHANGE_MATERIALIZATION_STRATEGY(com.facebook.presto.SystemSessionProperties.EXCHANGE_MATERIALIZATION_STRATEGY) ImmutableMap(com.google.common.collect.ImmutableMap) PlanMatchPattern.semiJoin(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.semiJoin) Session(com.facebook.presto.Session) ELIMINATE_CROSS_JOINS(com.facebook.presto.sql.analyzer.FeaturesConfig.JoinReorderingStrategy.ELIMINATE_CROSS_JOINS) PlanMatchPattern.tableScan(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.tableScan) PlanMatchPattern.anySymbol(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.anySymbol) PlanMatchPattern.exchange(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.exchange) JOIN_DISTRIBUTION_TYPE(com.facebook.presto.SystemSessionProperties.JOIN_DISTRIBUTION_TYPE) USE_STREAMING_EXCHANGE_FOR_MARK_DISTINCT(com.facebook.presto.SystemSessionProperties.USE_STREAMING_EXCHANGE_FOR_MARK_DISTINCT) PARTITIONING_PRECISION_STRATEGY(com.facebook.presto.SystemSessionProperties.PARTITIONING_PRECISION_STRATEGY) TASK_CONCURRENCY(com.facebook.presto.SystemSessionProperties.TASK_CONCURRENCY) PARTITIONED(com.facebook.presto.sql.analyzer.FeaturesConfig.JoinDistributionType.PARTITIONED) REMOTE_STREAMING(com.facebook.presto.sql.planner.plan.ExchangeNode.Scope.REMOTE_STREAMING) JOIN_REORDERING_STRATEGY(com.facebook.presto.SystemSessionProperties.JOIN_REORDERING_STRATEGY) REMOTE_MATERIALIZED(com.facebook.presto.sql.planner.plan.ExchangeNode.Scope.REMOTE_MATERIALIZED) Optional(java.util.Optional) PlanMatchPattern.values(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.values) ExpectedValueProvider(com.facebook.presto.sql.planner.assertions.ExpectedValueProvider) ExchangeNode(com.facebook.presto.sql.planner.plan.ExchangeNode) PlanMatchPattern.node(com.facebook.presto.sql.planner.assertions.PlanMatchPattern.node) INNER(com.facebook.presto.sql.planner.plan.JoinNode.Type.INNER) ExchangeNode(com.facebook.presto.sql.planner.plan.ExchangeNode) Plan(com.facebook.presto.sql.planner.Plan) TestingSession(com.facebook.presto.testing.TestingSession) Session(com.facebook.presto.Session)

Aggregations

Session (com.facebook.presto.Session)2 JOIN_DISTRIBUTION_TYPE (com.facebook.presto.SystemSessionProperties.JOIN_DISTRIBUTION_TYPE)2 JOIN_REORDERING_STRATEGY (com.facebook.presto.SystemSessionProperties.JOIN_REORDERING_STRATEGY)2 TASK_CONCURRENCY (com.facebook.presto.SystemSessionProperties.TASK_CONCURRENCY)2 AggregationNode (com.facebook.presto.spi.plan.AggregationNode)2 SINGLE (com.facebook.presto.spi.plan.AggregationNode.Step.SINGLE)2 ELIMINATE_CROSS_JOINS (com.facebook.presto.sql.analyzer.FeaturesConfig.JoinReorderingStrategy.ELIMINATE_CROSS_JOINS)2 BasePlanTest (com.facebook.presto.sql.planner.assertions.BasePlanTest)2 PlanMatchPattern (com.facebook.presto.sql.planner.assertions.PlanMatchPattern)2 PlanMatchPattern.aggregation (com.facebook.presto.sql.planner.assertions.PlanMatchPattern.aggregation)2 PlanMatchPattern.anyTree (com.facebook.presto.sql.planner.assertions.PlanMatchPattern.anyTree)2 PlanMatchPattern.equiJoinClause (com.facebook.presto.sql.planner.assertions.PlanMatchPattern.equiJoinClause)2 PlanMatchPattern.exchange (com.facebook.presto.sql.planner.assertions.PlanMatchPattern.exchange)2 PlanMatchPattern.join (com.facebook.presto.sql.planner.assertions.PlanMatchPattern.join)2 PlanMatchPattern.node (com.facebook.presto.sql.planner.assertions.PlanMatchPattern.node)2 PlanMatchPattern.semiJoin (com.facebook.presto.sql.planner.assertions.PlanMatchPattern.semiJoin)2 PlanMatchPattern.singleGroupingSet (com.facebook.presto.sql.planner.assertions.PlanMatchPattern.singleGroupingSet)2 PlanMatchPattern.tableScan (com.facebook.presto.sql.planner.assertions.PlanMatchPattern.tableScan)2 PlanMatchPattern.values (com.facebook.presto.sql.planner.assertions.PlanMatchPattern.values)2 PlanNodeSearcher.searchFrom (com.facebook.presto.sql.planner.optimizations.PlanNodeSearcher.searchFrom)2