use of io.trino.spi.predicate.Domain in project trino by trinodb.
the class TestInformationSchemaMetadata method testInformationSchemaPredicatePushdownWithoutSchemaPredicate.
@Test
public void testInformationSchemaPredicatePushdownWithoutSchemaPredicate() {
TransactionId transactionId = transactionManager.beginTransaction(false);
// predicate without schema predicates should cause schemas to be enumerated when table predicates are present
ImmutableMap.Builder<ColumnHandle, Domain> domains = ImmutableMap.builder();
domains.put(new InformationSchemaColumnHandle("table_name"), Domain.singleValue(VARCHAR, Slices.utf8Slice("test_view")));
Constraint constraint = new Constraint(TupleDomain.withColumnDomains(domains.buildOrThrow()));
ConnectorSession session = createNewSession(transactionId);
ConnectorMetadata metadata = new InformationSchemaMetadata("test_catalog", this.metadata);
InformationSchemaTableHandle tableHandle = (InformationSchemaTableHandle) metadata.getTableHandle(session, new SchemaTableName("information_schema", "views"));
tableHandle = metadata.applyFilter(session, tableHandle, constraint).map(ConstraintApplicationResult::getHandle).map(InformationSchemaTableHandle.class::cast).orElseThrow(AssertionError::new);
// filter blindly applies filter to all visible schemas, so information_schema must be included
assertEquals(tableHandle.getPrefixes(), ImmutableSet.of(new QualifiedTablePrefix("test_catalog", "test_schema", "test_view"), new QualifiedTablePrefix("test_catalog", "information_schema", "test_view")));
}
use of io.trino.spi.predicate.Domain in project trino by trinodb.
the class TestDynamicFilterService method testDynamicFilterConsumerCallbackCount.
@Test
public void testDynamicFilterConsumerCallbackCount() {
DynamicFilterService dynamicFilterService = createDynamicFilterService();
DynamicFilterId filterId1 = new DynamicFilterId("df1");
DynamicFilterId filterId2 = new DynamicFilterId("df2");
Set<DynamicFilterId> dynamicFilters = ImmutableSet.of(filterId1, filterId2);
QueryId queryId = new QueryId("query");
StageId stageId = new StageId(queryId, 0);
dynamicFilterService.registerQuery(queryId, session, dynamicFilters, dynamicFilters, ImmutableSet.of());
dynamicFilterService.stageCannotScheduleMoreTasks(stageId, 0, 2);
Map<DynamicFilterId, Domain> consumerCollectedFilters = new HashMap<>();
AtomicInteger callbackCount = new AtomicInteger();
dynamicFilterService.registerDynamicFilterConsumer(queryId, 0, dynamicFilters, domains -> {
callbackCount.getAndIncrement();
domains.forEach((filter, domain) -> assertNull(consumerCollectedFilters.put(filter, domain)));
});
assertTrue(consumerCollectedFilters.isEmpty());
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId, 0, 0), ImmutableMap.of(filterId1, singleValue(INTEGER, 1L), filterId2, singleValue(INTEGER, 2L)));
assertTrue(consumerCollectedFilters.isEmpty());
// complete both filterId1 and filterId2
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId, 1, 0), ImmutableMap.of(filterId1, singleValue(INTEGER, 3L), filterId2, singleValue(INTEGER, 4L)));
assertEquals(consumerCollectedFilters, ImmutableMap.of(filterId1, multipleValues(INTEGER, ImmutableList.of(1L, 3L)), filterId2, multipleValues(INTEGER, ImmutableList.of(2L, 4L))));
// both filters should be received in single callback
assertEquals(callbackCount.get(), 1);
// register another consumer after both filters have been collected
Map<DynamicFilterId, Domain> secondConsumerCollectedFilters = new HashMap<>();
AtomicInteger secondCallbackCount = new AtomicInteger();
dynamicFilterService.registerDynamicFilterConsumer(queryId, 0, dynamicFilters, domains -> {
secondCallbackCount.getAndIncrement();
domains.forEach((filter, domain) -> assertNull(secondConsumerCollectedFilters.put(filter, domain)));
});
assertEquals(secondConsumerCollectedFilters, ImmutableMap.of(filterId1, multipleValues(INTEGER, ImmutableList.of(1L, 3L)), filterId2, multipleValues(INTEGER, ImmutableList.of(2L, 4L))));
// both filters should be received by second consumer in single callback
assertEquals(secondCallbackCount.get(), 1);
// first consumer should not receive callback again since it already got the completed filter
assertEquals(callbackCount.get(), 1);
}
use of io.trino.spi.predicate.Domain in project trino by trinodb.
the class TestDynamicFilterService method testMultipleColumnMapping.
@Test
public void testMultipleColumnMapping() {
DynamicFilterService dynamicFilterService = createDynamicFilterService();
DynamicFilterId filterId1 = new DynamicFilterId("df1");
SymbolAllocator symbolAllocator = new SymbolAllocator();
Symbol symbol1 = symbolAllocator.newSymbol("DF_SYMBOL1", INTEGER);
Symbol symbol2 = symbolAllocator.newSymbol("DF_SYMBOL2", INTEGER);
Expression df1 = symbol1.toSymbolReference();
Expression df2 = symbol2.toSymbolReference();
QueryId queryId = new QueryId("query");
StageId stageId1 = new StageId(queryId, 1);
dynamicFilterService.registerQuery(queryId, session, ImmutableSet.of(filterId1), ImmutableSet.of(filterId1), ImmutableSet.of());
dynamicFilterService.stageCannotScheduleMoreTasks(stageId1, 0, 1);
TestingColumnHandle column1 = new TestingColumnHandle("probeColumnA");
TestingColumnHandle column2 = new TestingColumnHandle("probeColumnB");
DynamicFilter dynamicFilter = dynamicFilterService.createDynamicFilter(queryId, ImmutableList.of(new DynamicFilters.Descriptor(filterId1, df1), new DynamicFilters.Descriptor(filterId1, df2)), ImmutableMap.of(symbol1, column1, symbol2, column2), symbolAllocator.getTypes());
assertEquals(dynamicFilter.getColumnsCovered(), Set.of(column1, column2), "columns covered");
Domain domain = singleValue(INTEGER, 1L);
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId1, 0, 0), ImmutableMap.of(filterId1, domain));
assertEquals(dynamicFilter.getCurrentPredicate(), TupleDomain.withColumnDomains(ImmutableMap.of(column1, domain, column2, domain)));
}
use of io.trino.spi.predicate.Domain in project trino by trinodb.
the class TestDynamicFilterService method testDynamicFilterConsumer.
@Test
public void testDynamicFilterConsumer() {
DynamicFilterService dynamicFilterService = createDynamicFilterService();
DynamicFilterId filterId1 = new DynamicFilterId("df1");
DynamicFilterId filterId2 = new DynamicFilterId("df2");
Set<DynamicFilterId> dynamicFilters = ImmutableSet.of(filterId1, filterId2);
QueryId queryId = new QueryId("query");
StageId stageId = new StageId(queryId, 0);
dynamicFilterService.registerQuery(queryId, session, dynamicFilters, dynamicFilters, ImmutableSet.of());
dynamicFilterService.stageCannotScheduleMoreTasks(stageId, 0, 2);
Map<DynamicFilterId, Domain> consumerCollectedFilters = new HashMap<>();
dynamicFilterService.registerDynamicFilterConsumer(queryId, 0, dynamicFilters, domains -> domains.forEach((filter, domain) -> assertNull(consumerCollectedFilters.put(filter, domain))));
assertTrue(consumerCollectedFilters.isEmpty());
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId, 0, 0), ImmutableMap.of(filterId1, singleValue(INTEGER, 1L)));
assertTrue(consumerCollectedFilters.isEmpty());
// complete only filterId1
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId, 1, 0), ImmutableMap.of(filterId1, singleValue(INTEGER, 3L), filterId2, singleValue(INTEGER, 2L)));
assertEquals(consumerCollectedFilters, ImmutableMap.of(filterId1, multipleValues(INTEGER, ImmutableList.of(1L, 3L))));
// register another consumer only for filterId1 after completion of filterId1
Map<DynamicFilterId, Domain> secondConsumerCollectedFilters = new HashMap<>();
dynamicFilterService.registerDynamicFilterConsumer(queryId, 0, ImmutableSet.of(filterId1), domains -> domains.forEach((filter, domain) -> assertNull(secondConsumerCollectedFilters.put(filter, domain))));
assertEquals(secondConsumerCollectedFilters, ImmutableMap.of(filterId1, multipleValues(INTEGER, ImmutableList.of(1L, 3L))));
// complete filterId2
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId, 0, 0), ImmutableMap.of(filterId2, singleValue(INTEGER, 4L)));
assertEquals(consumerCollectedFilters, ImmutableMap.of(filterId1, multipleValues(INTEGER, ImmutableList.of(1L, 3L)), filterId2, multipleValues(INTEGER, ImmutableList.of(2L, 4L))));
assertEquals(secondConsumerCollectedFilters, ImmutableMap.of(filterId1, multipleValues(INTEGER, ImmutableList.of(1L, 3L))));
}
use of io.trino.spi.predicate.Domain in project trino by trinodb.
the class Util method domainsMatch.
static boolean domainsMatch(TupleDomain<Predicate<ColumnHandle>> expected, TupleDomain<ColumnHandle> actual) {
Optional<Map<Predicate<ColumnHandle>, Domain>> expectedDomains = expected.getDomains();
Optional<Map<ColumnHandle, Domain>> actualDomains = actual.getDomains();
if (expectedDomains.isPresent() != actualDomains.isPresent()) {
return false;
}
if (expectedDomains.isPresent()) {
if (expectedDomains.get().size() != actualDomains.get().size()) {
return false;
}
for (Map.Entry<Predicate<ColumnHandle>, Domain> entry : expectedDomains.get().entrySet()) {
// There should be exactly one column matching the expected column matcher
ColumnHandle actualColumn = Iterables.getOnlyElement(actualDomains.get().keySet().stream().filter(x -> entry.getKey().test(x)).collect(toImmutableList()));
if (!actualDomains.get().get(actualColumn).contains(entry.getValue())) {
return false;
}
}
}
return true;
}
Aggregations