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());
}
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());
}
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();
}
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())));
}
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();
}
}
Aggregations