Search in sources :

Example 16 with Plan

use of io.trino.sql.planner.Plan in project trino by trinodb.

the class TestUnion method testUnionOnProbeSide.

@Test
public void testUnionOnProbeSide() {
    Plan plan = plan("SELECT * FROM (SELECT * FROM nation UNION ALL SELECT * from nation) n, region r WHERE n.regionkey=r.regionkey", OPTIMIZED_AND_VALIDATED, false);
    assertPlanIsFullyDistributed(plan);
}
Also used : Plan(io.trino.sql.planner.Plan) Test(org.testng.annotations.Test) BasePlanTest(io.trino.sql.planner.assertions.BasePlanTest)

Example 17 with Plan

use of io.trino.sql.planner.Plan in project trino by trinodb.

the class TestUnion method testUnionUnderTopN.

@Test
public void testUnionUnderTopN() {
    Plan plan = plan("SELECT * FROM (" + "   SELECT regionkey FROM nation " + "   UNION ALL " + "   SELECT nationkey FROM nation" + ") t(a) " + "ORDER BY a LIMIT 1", OPTIMIZED_AND_VALIDATED, false);
    List<PlanNode> remotes = searchFrom(plan.getRoot()).where(TestUnion::isRemoteExchange).findAll();
    assertEquals(remotes.size(), 1, "There should be exactly one RemoteExchange");
    assertEquals(((ExchangeNode) Iterables.getOnlyElement(remotes)).getType(), GATHER);
    int numberOfpartialTopN = searchFrom(plan.getRoot()).where(planNode -> planNode instanceof TopNNode && ((TopNNode) planNode).getStep() == TopNNode.Step.PARTIAL).count();
    assertEquals(numberOfpartialTopN, 2, "There should be exactly two partial TopN nodes");
    assertPlanIsFullyDistributed(plan);
}
Also used : Iterables(com.google.common.collect.Iterables) PlanNodeSearcher.searchFrom(io.trino.sql.planner.optimizations.PlanNodeSearcher.searchFrom) TopNNode(io.trino.sql.planner.plan.TopNNode) OPTIMIZED_AND_VALIDATED(io.trino.sql.planner.LogicalPlanner.Stage.OPTIMIZED_AND_VALIDATED) Assert.assertEquals(org.testng.Assert.assertEquals) Test(org.testng.annotations.Test) PlanNode(io.trino.sql.planner.plan.PlanNode) List(java.util.List) Collectors.toList(java.util.stream.Collectors.toList) GATHER(io.trino.sql.planner.plan.ExchangeNode.Type.GATHER) REMOTE(io.trino.sql.planner.plan.ExchangeNode.Scope.REMOTE) Map(java.util.Map) AggregationNode(io.trino.sql.planner.plan.AggregationNode) REPARTITION(io.trino.sql.planner.plan.ExchangeNode.Type.REPARTITION) Assert.assertTrue(org.testng.Assert.assertTrue) ExchangeNode(io.trino.sql.planner.plan.ExchangeNode) Plan(io.trino.sql.planner.Plan) JoinNode(io.trino.sql.planner.plan.JoinNode) BasePlanTest(io.trino.sql.planner.assertions.BasePlanTest) Assert.assertFalse(org.testng.Assert.assertFalse) PlanNode(io.trino.sql.planner.plan.PlanNode) Plan(io.trino.sql.planner.Plan) TopNNode(io.trino.sql.planner.plan.TopNNode) Test(org.testng.annotations.Test) BasePlanTest(io.trino.sql.planner.assertions.BasePlanTest)

Example 18 with Plan

use of io.trino.sql.planner.Plan in project trino by trinodb.

the class TestUnion method testSimpleUnion.

@Test
public void testSimpleUnion() {
    Plan plan = plan("SELECT suppkey FROM supplier UNION ALL SELECT nationkey FROM nation", OPTIMIZED_AND_VALIDATED, false);
    List<PlanNode> remotes = searchFrom(plan.getRoot()).where(TestUnion::isRemoteExchange).findAll();
    assertEquals(remotes.size(), 1, "There should be exactly one RemoteExchange");
    assertEquals(((ExchangeNode) Iterables.getOnlyElement(remotes)).getType(), GATHER);
    assertPlanIsFullyDistributed(plan);
}
Also used : PlanNode(io.trino.sql.planner.plan.PlanNode) Plan(io.trino.sql.planner.Plan) Test(org.testng.annotations.Test) BasePlanTest(io.trino.sql.planner.assertions.BasePlanTest)

Example 19 with Plan

use of io.trino.sql.planner.Plan in project trino by trinodb.

the class RuleAssert method matches.

public void matches(PlanMatchPattern pattern) {
    RuleApplication ruleApplication = applyRule();
    TypeProvider types = ruleApplication.types;
    if (!ruleApplication.wasRuleApplied()) {
        fail(format("%s did not fire for:\n%s", rule, formatPlan(plan, types)));
    }
    PlanNode actual = ruleApplication.getTransformedPlan();
    if (actual == plan) {
        // plans are not comparable, so we can only ensure they are not the same instance
        fail(format("%s: rule fired but return the original plan:\n%s", rule, formatPlan(plan, types)));
    }
    if (!ImmutableSet.copyOf(plan.getOutputSymbols()).equals(ImmutableSet.copyOf(actual.getOutputSymbols()))) {
        fail(format("%s: output schema of transformed and original plans are not equivalent\n" + "\texpected: %s\n" + "\tactual:   %s", rule, plan.getOutputSymbols(), actual.getOutputSymbols()));
    }
    inTransaction(session -> {
        assertPlan(session, metadata, functionManager, ruleApplication.statsProvider, new Plan(actual, types, StatsAndCosts.empty()), ruleApplication.lookup, pattern);
        return null;
    });
}
Also used : PlanNode(io.trino.sql.planner.plan.PlanNode) TypeProvider(io.trino.sql.planner.TypeProvider) PlanAssert.assertPlan(io.trino.sql.planner.assertions.PlanAssert.assertPlan) PlanPrinter.textLogicalPlan(io.trino.sql.planner.planprinter.PlanPrinter.textLogicalPlan) Plan(io.trino.sql.planner.Plan)

Example 20 with Plan

use of io.trino.sql.planner.Plan in project trino by trinodb.

the class BasePlanTest method assertPlanWithSession.

protected void assertPlanWithSession(@Language("SQL") String sql, Session session, boolean forceSingleNode, PlanMatchPattern pattern, Consumer<Plan> planValidator) {
    queryRunner.inTransaction(session, transactionSession -> {
        Plan actualPlan = queryRunner.createPlan(transactionSession, sql, OPTIMIZED_AND_VALIDATED, forceSingleNode, WarningCollector.NOOP);
        PlanAssert.assertPlan(transactionSession, queryRunner.getMetadata(), queryRunner.getFunctionManager(), queryRunner.getStatsCalculator(), actualPlan, pattern);
        planValidator.accept(actualPlan);
        return null;
    });
}
Also used : SubPlan(io.trino.sql.planner.SubPlan) Plan(io.trino.sql.planner.Plan)

Aggregations

Plan (io.trino.sql.planner.Plan)26 Test (org.testng.annotations.Test)9 BasePlanTest (io.trino.sql.planner.assertions.BasePlanTest)8 PlanNode (io.trino.sql.planner.plan.PlanNode)8 SubPlan (io.trino.sql.planner.SubPlan)7 PlanNodeIdAllocator (io.trino.sql.planner.PlanNodeIdAllocator)4 Duration (io.airlift.units.Duration)3 OPTIMIZED_AND_VALIDATED (io.trino.sql.planner.LogicalPlanner.Stage.OPTIMIZED_AND_VALIDATED)3 PlanAssert.assertPlan (io.trino.sql.planner.assertions.PlanAssert.assertPlan)3 PlanNodeSearcher.searchFrom (io.trino.sql.planner.optimizations.PlanNodeSearcher.searchFrom)3 ImmutableList (com.google.common.collect.ImmutableList)2 ImmutableMap (com.google.common.collect.ImmutableMap)2 Iterables (com.google.common.collect.Iterables)2 Session (io.trino.Session)2 PlannerContext (io.trino.sql.PlannerContext)2 LogicalPlanner (io.trino.sql.planner.LogicalPlanner)2 Symbol (io.trino.sql.planner.Symbol)2 TypeProvider (io.trino.sql.planner.TypeProvider)2 PlanBuilder (io.trino.sql.planner.iterative.rule.test.PlanBuilder)2 JoinNode (io.trino.sql.planner.plan.JoinNode)2