Search in sources :

Example 56 with Symbol

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

the class TestSqlStage method createExchangePlanFragment.

private static PlanFragment createExchangePlanFragment() {
    PlanNode planNode = new RemoteSourceNode(new PlanNodeId("exchange"), ImmutableList.of(new PlanFragmentId("source")), ImmutableList.of(new Symbol("column")), Optional.empty(), REPARTITION, RetryPolicy.NONE);
    ImmutableMap.Builder<Symbol, Type> types = ImmutableMap.builder();
    for (Symbol symbol : planNode.getOutputSymbols()) {
        types.put(symbol, VARCHAR);
    }
    return new PlanFragment(new PlanFragmentId("exchange_fragment_id"), planNode, types.buildOrThrow(), SOURCE_DISTRIBUTION, ImmutableList.of(planNode.getId()), new PartitioningScheme(Partitioning.create(SINGLE_DISTRIBUTION, ImmutableList.of()), planNode.getOutputSymbols()), ungroupedExecution(), StatsAndCosts.empty(), Optional.empty());
}
Also used : PlanNodeId(io.trino.sql.planner.plan.PlanNodeId) RemoteSourceNode(io.trino.sql.planner.plan.RemoteSourceNode) Type(io.trino.spi.type.Type) PlanNode(io.trino.sql.planner.plan.PlanNode) Symbol(io.trino.sql.planner.Symbol) PartitioningScheme(io.trino.sql.planner.PartitioningScheme) PlanFragmentId(io.trino.sql.planner.plan.PlanFragmentId) ImmutableMap(com.google.common.collect.ImmutableMap) PlanFragment(io.trino.sql.planner.PlanFragment)

Example 57 with Symbol

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

the class ColumnReference method getAssignedSymbol.

@Override
public Optional<Symbol> getAssignedSymbol(PlanNode node, Session session, Metadata metadata, SymbolAliases symbolAliases) {
    TableHandle tableHandle;
    Map<Symbol, ColumnHandle> assignments;
    if (node instanceof TableScanNode) {
        TableScanNode tableScanNode = (TableScanNode) node;
        tableHandle = tableScanNode.getTable();
        assignments = tableScanNode.getAssignments();
    } else if (node instanceof IndexSourceNode) {
        IndexSourceNode indexSourceNode = (IndexSourceNode) node;
        tableHandle = indexSourceNode.getTableHandle();
        assignments = indexSourceNode.getAssignments();
    } else {
        return Optional.empty();
    }
    TableMetadata tableMetadata = metadata.getTableMetadata(session, tableHandle);
    String actualTableName = tableMetadata.getTable().getTableName();
    // Wrong table -> doesn't match.
    if (!tableName.equalsIgnoreCase(actualTableName)) {
        return Optional.empty();
    }
    Optional<ColumnHandle> columnHandle = getColumnHandle(tableHandle, session, metadata);
    checkState(columnHandle.isPresent(), "Table %s doesn't have column %s. Typo in test?", tableName, columnName);
    return getAssignedSymbol(assignments, columnHandle.get());
}
Also used : TableMetadata(io.trino.metadata.TableMetadata) ColumnHandle(io.trino.spi.connector.ColumnHandle) TableScanNode(io.trino.sql.planner.plan.TableScanNode) Symbol(io.trino.sql.planner.Symbol) IndexSourceNode(io.trino.sql.planner.plan.IndexSourceNode) TableHandle(io.trino.metadata.TableHandle)

Example 58 with Symbol

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

the class ExchangeMatcher method detailMatches.

@Override
public MatchResult detailMatches(PlanNode node, StatsProvider stats, Session session, Metadata metadata, SymbolAliases symbolAliases) {
    checkState(shapeMatches(node), "Plan testing framework error: shapeMatches returned false in detailMatches in %s", this.getClass().getName());
    ExchangeNode exchangeNode = (ExchangeNode) node;
    if (!orderBy.isEmpty()) {
        if (exchangeNode.getOrderingScheme().isEmpty()) {
            return NO_MATCH;
        }
        if (!orderingSchemeMatches(orderBy, exchangeNode.getOrderingScheme().get(), symbolAliases)) {
            return NO_MATCH;
        }
    }
    if (!partitionedBy.isEmpty()) {
        Set<Symbol> partitionedColumns = exchangeNode.getPartitioningScheme().getPartitioning().getColumns();
        if (!partitionedBy.stream().map(symbolAliases::get).map(Symbol::from).allMatch(partitionedColumns::contains)) {
            return NO_MATCH;
        }
    }
    if (inputs.isPresent()) {
        if (inputs.get().size() != exchangeNode.getInputs().size()) {
            return NO_MATCH;
        }
        for (int i = 0; i < exchangeNode.getInputs().size(); i++) {
            if (!inputs.get().get(i).stream().map(symbolAliases::get).map(Symbol::from).collect(toImmutableList()).equals(exchangeNode.getInputs().get(i))) {
                return NO_MATCH;
            }
        }
    }
    return MatchResult.match();
}
Also used : ExchangeNode(io.trino.sql.planner.plan.ExchangeNode) Symbol(io.trino.sql.planner.Symbol)

Example 59 with Symbol

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

the class TestPushPredicateThroughProjectIntoRowNumber method testPredicateSatisfied.

@Test
public void testPredicateSatisfied() {
    tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getPlannerContext())).on(p -> {
        Symbol a = p.symbol("a");
        Symbol rowNumber = p.symbol("row_number");
        return p.filter(PlanBuilder.expression("row_number < 5"), p.project(Assignments.identity(rowNumber), p.rowNumber(ImmutableList.of(), Optional.of(3), rowNumber, p.values(a))));
    }).matches(project(ImmutableMap.of("row_number", expression("row_number")), rowNumber(pattern -> pattern.maxRowCountPerPartition(Optional.of(3)), values(ImmutableList.of("a"))).withAlias("row_number", new RowNumberSymbolMatcher())));
    tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getPlannerContext())).on(p -> {
        Symbol a = p.symbol("a");
        Symbol rowNumber = p.symbol("row_number");
        return p.filter(PlanBuilder.expression("row_number < 3"), p.project(Assignments.identity(rowNumber), p.rowNumber(ImmutableList.of(), Optional.of(5), rowNumber, p.values(a))));
    }).matches(project(ImmutableMap.of("row_number", expression("row_number")), rowNumber(pattern -> pattern.maxRowCountPerPartition(Optional.of(2)), values(ImmutableList.of("a"))).withAlias("row_number", new RowNumberSymbolMatcher())));
}
Also used : Symbol(io.trino.sql.planner.Symbol) RowNumberSymbolMatcher(io.trino.sql.planner.assertions.RowNumberSymbolMatcher) PlanMatchPattern.expression(io.trino.sql.planner.assertions.PlanMatchPattern.expression) ImmutableMap(com.google.common.collect.ImmutableMap) BaseRuleTest(io.trino.sql.planner.iterative.rule.test.BaseRuleTest) Assignments(io.trino.sql.planner.plan.Assignments) Test(org.testng.annotations.Test) PlanMatchPattern.filter(io.trino.sql.planner.assertions.PlanMatchPattern.filter) PlanMatchPattern.values(io.trino.sql.planner.assertions.PlanMatchPattern.values) ImmutableList(com.google.common.collect.ImmutableList) PlanMatchPattern.project(io.trino.sql.planner.assertions.PlanMatchPattern.project) PlanBuilder(io.trino.sql.planner.iterative.rule.test.PlanBuilder) Optional(java.util.Optional) PlanMatchPattern.rowNumber(io.trino.sql.planner.assertions.PlanMatchPattern.rowNumber) Symbol(io.trino.sql.planner.Symbol) RowNumberSymbolMatcher(io.trino.sql.planner.assertions.RowNumberSymbolMatcher) BaseRuleTest(io.trino.sql.planner.iterative.rule.test.BaseRuleTest) Test(org.testng.annotations.Test)

Example 60 with Symbol

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

the class TestPushProjectionIntoTableScan method testDoesNotFire.

@Test
public void testDoesNotFire() {
    try (RuleTester ruleTester = defaultRuleTester()) {
        String columnName = "input_column";
        Type columnType = ROW_TYPE;
        ColumnHandle inputColumnHandle = column(columnName, columnType);
        MockConnectorFactory factory = createMockFactory(ImmutableMap.of(columnName, inputColumnHandle), Optional.empty());
        ruleTester.getQueryRunner().createCatalog(MOCK_CATALOG, factory, ImmutableMap.of());
        PushProjectionIntoTableScan optimizer = createRule(ruleTester);
        ruleTester.assertThat(optimizer).on(p -> {
            Symbol symbol = p.symbol(columnName, columnType);
            return p.project(Assignments.of(p.symbol("symbol_dereference", BIGINT), new SubscriptExpression(symbol.toSymbolReference(), new LongLiteral("1"))), p.tableScan(TEST_TABLE_HANDLE, ImmutableList.of(symbol), ImmutableMap.of(symbol, inputColumnHandle)));
        }).withSession(MOCK_SESSION).doesNotFire();
    }
}
Also used : TpchColumnHandle(io.trino.plugin.tpch.TpchColumnHandle) ColumnHandle(io.trino.spi.connector.ColumnHandle) MockConnectorFactory(io.trino.connector.MockConnectorFactory) RowType(io.trino.spi.type.RowType) Type(io.trino.spi.type.Type) LongLiteral(io.trino.sql.tree.LongLiteral) RuleTester.defaultRuleTester(io.trino.sql.planner.iterative.rule.test.RuleTester.defaultRuleTester) RuleTester(io.trino.sql.planner.iterative.rule.test.RuleTester) Symbol(io.trino.sql.planner.Symbol) SubscriptExpression(io.trino.sql.tree.SubscriptExpression) Test(org.testng.annotations.Test)

Aggregations

Symbol (io.trino.sql.planner.Symbol)366 Test (org.testng.annotations.Test)171 ImmutableList (com.google.common.collect.ImmutableList)124 ImmutableMap (com.google.common.collect.ImmutableMap)106 Optional (java.util.Optional)96 PlanNode (io.trino.sql.planner.plan.PlanNode)85 Expression (io.trino.sql.tree.Expression)85 Map (java.util.Map)66 Assignments (io.trino.sql.planner.plan.Assignments)65 JoinNode (io.trino.sql.planner.plan.JoinNode)64 ProjectNode (io.trino.sql.planner.plan.ProjectNode)61 PlanMatchPattern.values (io.trino.sql.planner.assertions.PlanMatchPattern.values)56 SymbolReference (io.trino.sql.tree.SymbolReference)55 BIGINT (io.trino.spi.type.BigintType.BIGINT)52 Type (io.trino.spi.type.Type)51 Session (io.trino.Session)46 List (java.util.List)46 RuleTester (io.trino.sql.planner.iterative.rule.test.RuleTester)43 RuleTester.defaultRuleTester (io.trino.sql.planner.iterative.rule.test.RuleTester.defaultRuleTester)43 PlanNodeId (io.trino.sql.planner.plan.PlanNodeId)43