Search in sources :

Example 1 with LOCAL

use of io.trino.sql.planner.plan.ExchangeNode.Scope.LOCAL in project trino by trinodb.

the class PropertyDerivations method deriveProperties.

public static ActualProperties deriveProperties(PlanNode node, List<ActualProperties> inputProperties, PlannerContext plannerContext, Session session, TypeProvider types, TypeAnalyzer typeAnalyzer) {
    ActualProperties output = node.accept(new Visitor(plannerContext, session, types, typeAnalyzer), inputProperties);
    output.getNodePartitioning().ifPresent(partitioning -> verify(node.getOutputSymbols().containsAll(partitioning.getColumns()), "Node-level partitioning properties contain columns not present in node's output"));
    verify(node.getOutputSymbols().containsAll(output.getConstants().keySet()), "Node-level constant properties contain columns not present in node's output");
    Set<Symbol> localPropertyColumns = output.getLocalProperties().stream().flatMap(property -> property.getColumns().stream()).collect(Collectors.toSet());
    verify(node.getOutputSymbols().containsAll(localPropertyColumns), "Node-level local properties contain columns not present in node's output");
    return output;
}
Also used : GroupingProperty(io.trino.spi.connector.GroupingProperty) ARBITRARY_DISTRIBUTION(io.trino.sql.planner.SystemPartitioningHandle.ARBITRARY_DISTRIBUTION) IndexSourceNode(io.trino.sql.planner.plan.IndexSourceNode) TableWriterNode(io.trino.sql.planner.plan.TableWriterNode) CorrelatedJoinNode(io.trino.sql.planner.plan.CorrelatedJoinNode) FilterNode(io.trino.sql.planner.plan.FilterNode) PlanNode(io.trino.sql.planner.plan.PlanNode) Preconditions.checkArgument(com.google.common.base.Preconditions.checkArgument) TableDeleteNode(io.trino.sql.planner.plan.TableDeleteNode) ONE(io.trino.sql.tree.PatternRecognitionRelation.RowsPerMatch.ONE) Collectors.toMap(java.util.stream.Collectors.toMap) Map(java.util.Map) LOCAL(io.trino.sql.planner.plan.ExchangeNode.Scope.LOCAL) SpatialJoinNode(io.trino.sql.planner.plan.SpatialJoinNode) OutputNode(io.trino.sql.planner.plan.OutputNode) DeleteNode(io.trino.sql.planner.plan.DeleteNode) WINDOW(io.trino.sql.tree.PatternRecognitionRelation.RowsPerMatch.WINDOW) JoinNode(io.trino.sql.planner.plan.JoinNode) AssignUniqueId(io.trino.sql.planner.plan.AssignUniqueId) TableScanNode(io.trino.sql.planner.plan.TableScanNode) TupleDomain.extractFixedValues(io.trino.spi.predicate.TupleDomain.extractFixedValues) ExplainAnalyzeNode(io.trino.sql.planner.plan.ExplainAnalyzeNode) MarkDistinctNode(io.trino.sql.planner.plan.MarkDistinctNode) Global.partitionedOn(io.trino.sql.planner.optimizations.ActualProperties.Global.partitionedOn) ImmutableSet(com.google.common.collect.ImmutableSet) ImmutableMap(com.google.common.collect.ImmutableMap) EnforceSingleRowNode(io.trino.sql.planner.plan.EnforceSingleRowNode) StatisticsWriterNode(io.trino.sql.planner.plan.StatisticsWriterNode) Collection(java.util.Collection) ImmutableList.toImmutableList(com.google.common.collect.ImmutableList.toImmutableList) ExpressionInterpreter(io.trino.sql.planner.ExpressionInterpreter) IndexJoinNode(io.trino.sql.planner.plan.IndexJoinNode) Set(java.util.Set) PAST_LAST(io.trino.sql.tree.SkipTo.Position.PAST_LAST) SemiJoinNode(io.trino.sql.planner.plan.SemiJoinNode) PatternRecognitionNode(io.trino.sql.planner.plan.PatternRecognitionNode) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) Preconditions.checkState(com.google.common.base.Preconditions.checkState) CoalesceExpression(io.trino.sql.tree.CoalesceExpression) List(java.util.List) GATHER(io.trino.sql.planner.plan.ExchangeNode.Type.GATHER) SymbolReference(io.trino.sql.tree.SymbolReference) FIXED_PASSTHROUGH_DISTRIBUTION(io.trino.sql.planner.SystemPartitioningHandle.FIXED_PASSTHROUGH_DISTRIBUTION) ApplyNode(io.trino.sql.planner.plan.ApplyNode) TopNRankingNode(io.trino.sql.planner.plan.TopNRankingNode) Optional(java.util.Optional) Global.arbitraryPartition(io.trino.sql.planner.optimizations.ActualProperties.Global.arbitraryPartition) ExchangeNode(io.trino.sql.planner.plan.ExchangeNode) Expression(io.trino.sql.tree.Expression) ValuesNode(io.trino.sql.planner.plan.ValuesNode) WindowNode(io.trino.sql.planner.plan.WindowNode) Session(io.trino.Session) PlannerContext(io.trino.sql.PlannerContext) TableExecuteNode(io.trino.sql.planner.plan.TableExecuteNode) Iterables(com.google.common.collect.Iterables) ConstantProperty(io.trino.spi.connector.ConstantProperty) Global(io.trino.sql.planner.optimizations.ActualProperties.Global) NullableValue(io.trino.spi.predicate.NullableValue) LimitNode(io.trino.sql.planner.plan.LimitNode) Type(io.trino.spi.type.Type) NoOpSymbolResolver(io.trino.sql.planner.NoOpSymbolResolver) Global.singleStreamPartition(io.trino.sql.planner.optimizations.ActualProperties.Global.singleStreamPartition) HashMap(java.util.HashMap) TableProperties(io.trino.metadata.TableProperties) SortNode(io.trino.sql.planner.plan.SortNode) ImmutableBiMap(com.google.common.collect.ImmutableBiMap) ImmutableList(com.google.common.collect.ImmutableList) RowNumberNode(io.trino.sql.planner.plan.RowNumberNode) Verify.verify(com.google.common.base.Verify.verify) NodeRef(io.trino.sql.tree.NodeRef) Objects.requireNonNull(java.util.Objects.requireNonNull) SystemSessionProperties(io.trino.SystemSessionProperties) RefreshMaterializedViewNode(io.trino.sql.planner.plan.RefreshMaterializedViewNode) ColumnHandle(io.trino.spi.connector.ColumnHandle) AggregationNode(io.trino.sql.planner.plan.AggregationNode) ImmutableSet.toImmutableSet(com.google.common.collect.ImmutableSet.toImmutableSet) ProjectNode(io.trino.sql.planner.plan.ProjectNode) DomainTranslator(io.trino.sql.planner.DomainTranslator) TablePartitioning(io.trino.metadata.TableProperties.TablePartitioning) Symbol(io.trino.sql.planner.Symbol) Global.coordinatorSingleStreamPartition(io.trino.sql.planner.optimizations.ActualProperties.Global.coordinatorSingleStreamPartition) PlanVisitor(io.trino.sql.planner.plan.PlanVisitor) TopNNode(io.trino.sql.planner.plan.TopNNode) OrderingScheme(io.trino.sql.planner.OrderingScheme) UnnestNode(io.trino.sql.planner.plan.UnnestNode) UpdateNode(io.trino.sql.planner.plan.UpdateNode) Global.streamPartitionedOn(io.trino.sql.planner.optimizations.ActualProperties.Global.streamPartitionedOn) LocalProperty(io.trino.spi.connector.LocalProperty) TypeAnalyzer(io.trino.sql.planner.TypeAnalyzer) REMOTE(io.trino.sql.planner.plan.ExchangeNode.Scope.REMOTE) GroupIdNode(io.trino.sql.planner.plan.GroupIdNode) DistinctLimitNode(io.trino.sql.planner.plan.DistinctLimitNode) TypeProvider(io.trino.sql.planner.TypeProvider) TableFinishNode(io.trino.sql.planner.plan.TableFinishNode) SampleNode(io.trino.sql.planner.plan.SampleNode) PlanVisitor(io.trino.sql.planner.plan.PlanVisitor) Symbol(io.trino.sql.planner.Symbol)

Example 2 with LOCAL

use of io.trino.sql.planner.plan.ExchangeNode.Scope.LOCAL in project trino by trinodb.

the class TestValidateAggregationsWithDefaultValues method testWithPartialAggregationBelowJoin.

@Test
public void testWithPartialAggregationBelowJoin() {
    Symbol symbol = new Symbol("symbol");
    PlanNode root = builder.aggregation(af -> af.step(FINAL).groupingSets(groupingSets(ImmutableList.of(symbol), 2, ImmutableSet.of(0))).source(builder.join(INNER, builder.exchange(e -> e.type(REPARTITION).scope(LOCAL).fixedHashDistributionParitioningScheme(ImmutableList.of(symbol), ImmutableList.of(symbol)).addInputsSet(symbol).addSource(builder.aggregation(ap -> ap.step(PARTIAL).groupingSets(groupingSets(ImmutableList.of(symbol), 2, ImmutableSet.of(0))).source(tableScanNode)))), builder.values())));
    validatePlan(root, true);
}
Also used : TypeAnalyzer.createTestingTypeAnalyzer(io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer) INNER(io.trino.sql.planner.plan.JoinNode.Type.INNER) Test(org.testng.annotations.Test) PlanNode(io.trino.sql.planner.plan.PlanNode) CatalogName(io.trino.connector.CatalogName) ImmutableList(com.google.common.collect.ImmutableList) Assertions.assertThatThrownBy(org.assertj.core.api.Assertions.assertThatThrownBy) TpchTableHandle(io.trino.plugin.tpch.TpchTableHandle) LOCAL(io.trino.sql.planner.plan.ExchangeNode.Scope.LOCAL) PlanBuilder(io.trino.sql.planner.iterative.rule.test.PlanBuilder) TEST_SESSION(io.trino.SessionTestUtils.TEST_SESSION) REPARTITION(io.trino.sql.planner.plan.ExchangeNode.Type.REPARTITION) BasePlanTest(io.trino.sql.planner.assertions.BasePlanTest) TableScanNode(io.trino.sql.planner.plan.TableScanNode) PARTIAL(io.trino.sql.planner.plan.AggregationNode.Step.PARTIAL) Symbol(io.trino.sql.planner.Symbol) TpchColumnHandle(io.trino.plugin.tpch.TpchColumnHandle) ImmutableSet(com.google.common.collect.ImmutableSet) ImmutableMap(com.google.common.collect.ImmutableMap) BeforeClass(org.testng.annotations.BeforeClass) TestingTransactionHandle(io.trino.testing.TestingTransactionHandle) AggregationNode.groupingSets(io.trino.sql.planner.plan.AggregationNode.groupingSets) TableHandle(io.trino.metadata.TableHandle) BIGINT(io.trino.spi.type.BigintType.BIGINT) REMOTE(io.trino.sql.planner.plan.ExchangeNode.Scope.REMOTE) WarningCollector(io.trino.execution.warnings.WarningCollector) TypeProvider(io.trino.sql.planner.TypeProvider) FINAL(io.trino.sql.planner.plan.AggregationNode.Step.FINAL) PlanNodeIdAllocator(io.trino.sql.planner.PlanNodeIdAllocator) PlannerContext(io.trino.sql.PlannerContext) PlanNode(io.trino.sql.planner.plan.PlanNode) Symbol(io.trino.sql.planner.Symbol) Test(org.testng.annotations.Test) BasePlanTest(io.trino.sql.planner.assertions.BasePlanTest)

Example 3 with LOCAL

use of io.trino.sql.planner.plan.ExchangeNode.Scope.LOCAL in project trino by trinodb.

the class TestValidateAggregationsWithDefaultValues method testWithPartialAggregationBelowJoinWithoutSeparatingExchange.

@Test
public void testWithPartialAggregationBelowJoinWithoutSeparatingExchange() {
    Symbol symbol = new Symbol("symbol");
    PlanNode root = builder.aggregation(af -> af.step(FINAL).groupingSets(groupingSets(ImmutableList.of(symbol), 2, ImmutableSet.of(0))).source(builder.join(INNER, builder.aggregation(ap -> ap.step(PARTIAL).groupingSets(groupingSets(ImmutableList.of(symbol), 2, ImmutableSet.of(0))).source(tableScanNode)), builder.values())));
    assertThatThrownBy(() -> validatePlan(root, true)).isInstanceOf(IllegalArgumentException.class).hasMessage("Final aggregation with default value not separated from partial aggregation by local hash exchange");
}
Also used : TypeAnalyzer.createTestingTypeAnalyzer(io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer) INNER(io.trino.sql.planner.plan.JoinNode.Type.INNER) Test(org.testng.annotations.Test) PlanNode(io.trino.sql.planner.plan.PlanNode) CatalogName(io.trino.connector.CatalogName) ImmutableList(com.google.common.collect.ImmutableList) Assertions.assertThatThrownBy(org.assertj.core.api.Assertions.assertThatThrownBy) TpchTableHandle(io.trino.plugin.tpch.TpchTableHandle) LOCAL(io.trino.sql.planner.plan.ExchangeNode.Scope.LOCAL) PlanBuilder(io.trino.sql.planner.iterative.rule.test.PlanBuilder) TEST_SESSION(io.trino.SessionTestUtils.TEST_SESSION) REPARTITION(io.trino.sql.planner.plan.ExchangeNode.Type.REPARTITION) BasePlanTest(io.trino.sql.planner.assertions.BasePlanTest) TableScanNode(io.trino.sql.planner.plan.TableScanNode) PARTIAL(io.trino.sql.planner.plan.AggregationNode.Step.PARTIAL) Symbol(io.trino.sql.planner.Symbol) TpchColumnHandle(io.trino.plugin.tpch.TpchColumnHandle) ImmutableSet(com.google.common.collect.ImmutableSet) ImmutableMap(com.google.common.collect.ImmutableMap) BeforeClass(org.testng.annotations.BeforeClass) TestingTransactionHandle(io.trino.testing.TestingTransactionHandle) AggregationNode.groupingSets(io.trino.sql.planner.plan.AggregationNode.groupingSets) TableHandle(io.trino.metadata.TableHandle) BIGINT(io.trino.spi.type.BigintType.BIGINT) REMOTE(io.trino.sql.planner.plan.ExchangeNode.Scope.REMOTE) WarningCollector(io.trino.execution.warnings.WarningCollector) TypeProvider(io.trino.sql.planner.TypeProvider) FINAL(io.trino.sql.planner.plan.AggregationNode.Step.FINAL) PlanNodeIdAllocator(io.trino.sql.planner.PlanNodeIdAllocator) PlannerContext(io.trino.sql.PlannerContext) PlanNode(io.trino.sql.planner.plan.PlanNode) Symbol(io.trino.sql.planner.Symbol) Test(org.testng.annotations.Test) BasePlanTest(io.trino.sql.planner.assertions.BasePlanTest)

Aggregations

ImmutableList (com.google.common.collect.ImmutableList)3 ImmutableMap (com.google.common.collect.ImmutableMap)3 ImmutableSet (com.google.common.collect.ImmutableSet)3 PlannerContext (io.trino.sql.PlannerContext)3 Symbol (io.trino.sql.planner.Symbol)3 TypeProvider (io.trino.sql.planner.TypeProvider)3 LOCAL (io.trino.sql.planner.plan.ExchangeNode.Scope.LOCAL)3 REMOTE (io.trino.sql.planner.plan.ExchangeNode.Scope.REMOTE)3 PlanNode (io.trino.sql.planner.plan.PlanNode)3 TableScanNode (io.trino.sql.planner.plan.TableScanNode)3 TEST_SESSION (io.trino.SessionTestUtils.TEST_SESSION)2 CatalogName (io.trino.connector.CatalogName)2 WarningCollector (io.trino.execution.warnings.WarningCollector)2 TableHandle (io.trino.metadata.TableHandle)2 TpchColumnHandle (io.trino.plugin.tpch.TpchColumnHandle)2 TpchTableHandle (io.trino.plugin.tpch.TpchTableHandle)2 BIGINT (io.trino.spi.type.BigintType.BIGINT)2 PlanNodeIdAllocator (io.trino.sql.planner.PlanNodeIdAllocator)2 TypeAnalyzer.createTestingTypeAnalyzer (io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer)2 BasePlanTest (io.trino.sql.planner.assertions.BasePlanTest)2