Search in sources :

Example 1 with LEFT

use of io.trino.sql.planner.plan.CorrelatedJoinNode.Type.LEFT in project trino by trinodb.

the class TestRemoveUnreferencedScalarSubqueries method testDoNotRemoveInputOfLeftOrFullJoinWhenSubqueryPotentiallyEmpty.

@Test
public void testDoNotRemoveInputOfLeftOrFullJoinWhenSubqueryPotentiallyEmpty() {
    tester().assertThat(new RemoveUnreferencedScalarSubqueries()).on(p -> {
        Symbol b = p.symbol("b");
        return p.correlatedJoin(emptyList(), p.values(emptyList(), ImmutableList.of(emptyList())), LEFT, TRUE_LITERAL, p.filter(new ComparisonExpression(LESS_THAN, b.toSymbolReference(), new LongLiteral("3")), p.values(2, b)));
    }).doesNotFire();
    tester().assertThat(new RemoveUnreferencedScalarSubqueries()).on(p -> {
        Symbol b = p.symbol("b");
        return p.correlatedJoin(emptyList(), p.values(emptyList(), ImmutableList.of(emptyList())), FULL, TRUE_LITERAL, p.filter(new ComparisonExpression(LESS_THAN, b.toSymbolReference(), new LongLiteral("3")), p.values(2, b)));
    }).doesNotFire();
}
Also used : Symbol(io.trino.sql.planner.Symbol) LEFT(io.trino.sql.planner.plan.CorrelatedJoinNode.Type.LEFT) BaseRuleTest(io.trino.sql.planner.iterative.rule.test.BaseRuleTest) RIGHT(io.trino.sql.planner.plan.CorrelatedJoinNode.Type.RIGHT) Collections.emptyList(java.util.Collections.emptyList) Test(org.testng.annotations.Test) PlanMatchPattern.values(io.trino.sql.planner.assertions.PlanMatchPattern.values) TRUE_LITERAL(io.trino.sql.tree.BooleanLiteral.TRUE_LITERAL) LESS_THAN(io.trino.sql.tree.ComparisonExpression.Operator.LESS_THAN) ComparisonExpression(io.trino.sql.tree.ComparisonExpression) BigintType(io.trino.spi.type.BigintType) FULL(io.trino.sql.planner.plan.CorrelatedJoinNode.Type.FULL) ImmutableList(com.google.common.collect.ImmutableList) LongLiteral(io.trino.sql.tree.LongLiteral) ComparisonExpression(io.trino.sql.tree.ComparisonExpression) LongLiteral(io.trino.sql.tree.LongLiteral) Symbol(io.trino.sql.planner.Symbol) BaseRuleTest(io.trino.sql.planner.iterative.rule.test.BaseRuleTest) Test(org.testng.annotations.Test)

Example 2 with LEFT

use of io.trino.sql.planner.plan.CorrelatedJoinNode.Type.LEFT in project trino by trinodb.

the class TestTransformCorrelatedJoinToJoin method testRewriteLeftCorrelatedJoin.

@Test
public void testRewriteLeftCorrelatedJoin() {
    tester().assertThat(new TransformCorrelatedJoinToJoin(tester().getPlannerContext())).on(p -> {
        Symbol a = p.symbol("a");
        Symbol b = p.symbol("b");
        return p.correlatedJoin(ImmutableList.of(a), p.values(a), LEFT, TRUE_LITERAL, p.filter(new ComparisonExpression(GREATER_THAN, b.toSymbolReference(), a.toSymbolReference()), p.values(b)));
    }).matches(join(JoinNode.Type.LEFT, ImmutableList.of(), Optional.of("b > a"), values("a"), filter(TRUE_LITERAL, values("b"))));
    tester().assertThat(new TransformCorrelatedJoinToJoin(tester().getPlannerContext())).on(p -> {
        Symbol a = p.symbol("a");
        Symbol b = p.symbol("b");
        return p.correlatedJoin(ImmutableList.of(a), p.values(a), LEFT, new ComparisonExpression(LESS_THAN, b.toSymbolReference(), new LongLiteral("3")), p.filter(new ComparisonExpression(GREATER_THAN, b.toSymbolReference(), a.toSymbolReference()), p.values(b)));
    }).matches(join(JoinNode.Type.LEFT, ImmutableList.of(), Optional.of("b > a AND b < 3"), values("a"), filter(TRUE_LITERAL, values("b"))));
}
Also used : Symbol(io.trino.sql.planner.Symbol) INNER(io.trino.sql.planner.plan.CorrelatedJoinNode.Type.INNER) LEFT(io.trino.sql.planner.plan.CorrelatedJoinNode.Type.LEFT) BaseRuleTest(io.trino.sql.planner.iterative.rule.test.BaseRuleTest) Test(org.testng.annotations.Test) PlanMatchPattern.filter(io.trino.sql.planner.assertions.PlanMatchPattern.filter) PlanMatchPattern.values(io.trino.sql.planner.assertions.PlanMatchPattern.values) TRUE_LITERAL(io.trino.sql.tree.BooleanLiteral.TRUE_LITERAL) LESS_THAN(io.trino.sql.tree.ComparisonExpression.Operator.LESS_THAN) ComparisonExpression(io.trino.sql.tree.ComparisonExpression) ImmutableList(com.google.common.collect.ImmutableList) LongLiteral(io.trino.sql.tree.LongLiteral) GREATER_THAN(io.trino.sql.tree.ComparisonExpression.Operator.GREATER_THAN) Optional(java.util.Optional) JoinNode(io.trino.sql.planner.plan.JoinNode) PlanMatchPattern.join(io.trino.sql.planner.assertions.PlanMatchPattern.join) ComparisonExpression(io.trino.sql.tree.ComparisonExpression) LongLiteral(io.trino.sql.tree.LongLiteral) Symbol(io.trino.sql.planner.Symbol) BaseRuleTest(io.trino.sql.planner.iterative.rule.test.BaseRuleTest) Test(org.testng.annotations.Test)

Example 3 with LEFT

use of io.trino.sql.planner.plan.CorrelatedJoinNode.Type.LEFT in project trino by trinodb.

the class TestPruneCorrelatedJoinColumns method testRemoveUnusedCorrelatedJoinNode.

@Test
public void testRemoveUnusedCorrelatedJoinNode() {
    // retain input of INNER join
    tester().assertThat(new PruneCorrelatedJoinColumns()).on(p -> {
        Symbol a = p.symbol("a");
        Symbol correlationSymbol = p.symbol("correlation_symbol");
        Symbol b = p.symbol("b");
        return p.project(Assignments.identity(a), p.correlatedJoin(ImmutableList.of(correlationSymbol), p.values(a, correlationSymbol), p.values(1, b)));
    }).matches(project(ImmutableMap.of("a", PlanMatchPattern.expression("a")), values("a", "correlationSymbol")));
    // retain input of LEFT join
    tester().assertThat(new PruneCorrelatedJoinColumns()).on(p -> {
        Symbol a = p.symbol("a");
        Symbol correlationSymbol = p.symbol("correlation_symbol");
        Symbol b = p.symbol("b");
        return p.project(Assignments.identity(a), p.correlatedJoin(ImmutableList.of(correlationSymbol), p.values(a, correlationSymbol), LEFT, new ComparisonExpression(GREATER_THAN, b.toSymbolReference(), correlationSymbol.toSymbolReference()), p.values(1, b)));
    }).matches(project(ImmutableMap.of("a", PlanMatchPattern.expression("a")), values("a", "correlationSymbol")));
    // retain subquery of INNER join
    tester().assertThat(new PruneCorrelatedJoinColumns()).on(p -> {
        Symbol a = p.symbol("a");
        Symbol b = p.symbol("b");
        return p.project(Assignments.identity(b), p.correlatedJoin(ImmutableList.of(), p.values(1, a), p.values(b)));
    }).matches(project(ImmutableMap.of("b", PlanMatchPattern.expression("b")), values("b")));
    // retain subquery of RIGHT join
    tester().assertThat(new PruneCorrelatedJoinColumns()).on(p -> {
        Symbol a = p.symbol("a");
        Symbol b = p.symbol("b");
        return p.project(Assignments.identity(b), p.correlatedJoin(ImmutableList.of(), p.values(1, a), RIGHT, new ComparisonExpression(GREATER_THAN, b.toSymbolReference(), a.toSymbolReference()), p.values(b)));
    }).matches(project(ImmutableMap.of("b", PlanMatchPattern.expression("b")), values("b")));
}
Also used : Symbol(io.trino.sql.planner.Symbol) PlanMatchPattern.correlatedJoin(io.trino.sql.planner.assertions.PlanMatchPattern.correlatedJoin) LEFT(io.trino.sql.planner.plan.CorrelatedJoinNode.Type.LEFT) ImmutableMap(com.google.common.collect.ImmutableMap) BaseRuleTest(io.trino.sql.planner.iterative.rule.test.BaseRuleTest) RIGHT(io.trino.sql.planner.plan.CorrelatedJoinNode.Type.RIGHT) Assignments(io.trino.sql.planner.plan.Assignments) PlanMatchPattern(io.trino.sql.planner.assertions.PlanMatchPattern) Test(org.testng.annotations.Test) PlanMatchPattern.values(io.trino.sql.planner.assertions.PlanMatchPattern.values) TRUE_LITERAL(io.trino.sql.tree.BooleanLiteral.TRUE_LITERAL) FilterNode(io.trino.sql.planner.plan.FilterNode) ComparisonExpression(io.trino.sql.tree.ComparisonExpression) PlanMatchPattern.node(io.trino.sql.planner.assertions.PlanMatchPattern.node) ImmutableList(com.google.common.collect.ImmutableList) PlanMatchPattern.project(io.trino.sql.planner.assertions.PlanMatchPattern.project) GREATER_THAN(io.trino.sql.tree.ComparisonExpression.Operator.GREATER_THAN) GREATER_THAN_OR_EQUAL(io.trino.sql.tree.ComparisonExpression.Operator.GREATER_THAN_OR_EQUAL) ComparisonExpression(io.trino.sql.tree.ComparisonExpression) Symbol(io.trino.sql.planner.Symbol) BaseRuleTest(io.trino.sql.planner.iterative.rule.test.BaseRuleTest) Test(org.testng.annotations.Test)

Aggregations

ImmutableList (com.google.common.collect.ImmutableList)3 Symbol (io.trino.sql.planner.Symbol)3 PlanMatchPattern.values (io.trino.sql.planner.assertions.PlanMatchPattern.values)3 BaseRuleTest (io.trino.sql.planner.iterative.rule.test.BaseRuleTest)3 LEFT (io.trino.sql.planner.plan.CorrelatedJoinNode.Type.LEFT)3 TRUE_LITERAL (io.trino.sql.tree.BooleanLiteral.TRUE_LITERAL)3 ComparisonExpression (io.trino.sql.tree.ComparisonExpression)3 Test (org.testng.annotations.Test)3 RIGHT (io.trino.sql.planner.plan.CorrelatedJoinNode.Type.RIGHT)2 GREATER_THAN (io.trino.sql.tree.ComparisonExpression.Operator.GREATER_THAN)2 LESS_THAN (io.trino.sql.tree.ComparisonExpression.Operator.LESS_THAN)2 LongLiteral (io.trino.sql.tree.LongLiteral)2 ImmutableMap (com.google.common.collect.ImmutableMap)1 BigintType (io.trino.spi.type.BigintType)1 PlanMatchPattern (io.trino.sql.planner.assertions.PlanMatchPattern)1 PlanMatchPattern.correlatedJoin (io.trino.sql.planner.assertions.PlanMatchPattern.correlatedJoin)1 PlanMatchPattern.filter (io.trino.sql.planner.assertions.PlanMatchPattern.filter)1 PlanMatchPattern.join (io.trino.sql.planner.assertions.PlanMatchPattern.join)1 PlanMatchPattern.node (io.trino.sql.planner.assertions.PlanMatchPattern.node)1 PlanMatchPattern.project (io.trino.sql.planner.assertions.PlanMatchPattern.project)1