Search in sources :

Example 6 with DynamicFilterPlaceholder

use of com.facebook.presto.expressions.DynamicFilters.DynamicFilterPlaceholder in project presto by prestodb.

the class TestLocalDynamicFilter method testSimple.

@Test
public void testSimple() throws ExecutionException, InterruptedException {
    LocalDynamicFilter filter = new LocalDynamicFilter(ImmutableMultimap.of("123", new DynamicFilterPlaceholder("123", new VariableReferenceExpression(Optional.empty(), "a", INTEGER), EQUAL)), ImmutableMap.of("123", 0), 1);
    assertEquals(filter.getBuildChannels(), ImmutableMap.of("123", 0));
    Consumer<TupleDomain<String>> consumer = filter.getTupleDomainConsumer();
    ListenableFuture<TupleDomain<VariableReferenceExpression>> result = filter.getResultFuture();
    assertFalse(result.isDone());
    consumer.accept(TupleDomain.withColumnDomains(ImmutableMap.of("123", Domain.singleValue(INTEGER, 7L))));
    assertEquals(result.get(), TupleDomain.withColumnDomains(ImmutableMap.of(new VariableReferenceExpression(Optional.empty(), "a", INTEGER), Domain.singleValue(INTEGER, 7L))));
}
Also used : TupleDomain(com.facebook.presto.common.predicate.TupleDomain) VariableReferenceExpression(com.facebook.presto.spi.relation.VariableReferenceExpression) DynamicFilterPlaceholder(com.facebook.presto.expressions.DynamicFilters.DynamicFilterPlaceholder) BasePlanTest(com.facebook.presto.sql.planner.assertions.BasePlanTest) Test(org.testng.annotations.Test)

Example 7 with DynamicFilterPlaceholder

use of com.facebook.presto.expressions.DynamicFilters.DynamicFilterPlaceholder in project presto by prestodb.

the class LocalDynamicFilter method create.

public static Optional<LocalDynamicFilter> create(AbstractJoinNode planNode, int partitionCount) {
    Set<String> joinDynamicFilters = planNode.getDynamicFilters().keySet();
    List<FilterNode> filterNodes = PlanNodeSearcher.searchFrom(planNode.getProbe()).where(LocalDynamicFilter::isFilterAboveTableScan).findAll();
    // Mapping from probe-side dynamic filters' IDs to their matching probe variables.
    ImmutableMultimap.Builder<String, DynamicFilterPlaceholder> probeVariablesBuilder = ImmutableMultimap.builder();
    for (FilterNode filterNode : filterNodes) {
        DynamicFilterExtractResult extractResult = extractDynamicFilters(filterNode.getPredicate());
        for (DynamicFilterPlaceholder placeholder : extractResult.getDynamicConjuncts()) {
            if (placeholder.getInput() instanceof VariableReferenceExpression) {
                // Add descriptors that match the local dynamic filter (from the current join node).
                if (joinDynamicFilters.contains(placeholder.getId())) {
                    probeVariablesBuilder.put(placeholder.getId(), placeholder);
                }
            }
        }
    }
    Multimap<String, DynamicFilterPlaceholder> probeVariables = probeVariablesBuilder.build();
    PlanNode buildNode = planNode.getBuild();
    Map<String, Integer> buildChannels = planNode.getDynamicFilters().entrySet().stream().filter(entry -> probeVariables.containsKey(entry.getKey())).collect(toMap(// Dynamic filter ID
    Map.Entry::getKey, // Build-side channel index
    entry -> {
        VariableReferenceExpression buildVariable = entry.getValue();
        int buildChannelIndex = buildNode.getOutputVariables().indexOf(buildVariable);
        verify(buildChannelIndex >= 0);
        return buildChannelIndex;
    }));
    if (buildChannels.isEmpty()) {
        return Optional.empty();
    }
    return Optional.of(new LocalDynamicFilter(probeVariables, buildChannels, partitionCount));
}
Also used : AbstractJoinNode(com.facebook.presto.sql.planner.plan.AbstractJoinNode) DynamicFilterExtractResult(com.facebook.presto.expressions.DynamicFilters.DynamicFilterExtractResult) ListenableFuture(com.google.common.util.concurrent.ListenableFuture) VariableReferenceExpression(com.facebook.presto.spi.relation.VariableReferenceExpression) Multimap(com.google.common.collect.Multimap) SettableFuture(com.google.common.util.concurrent.SettableFuture) ArrayList(java.util.ArrayList) FilterNode(com.facebook.presto.spi.plan.FilterNode) Collectors.toMap(java.util.stream.Collectors.toMap) Verify.verify(com.google.common.base.Verify.verify) Map(java.util.Map) Objects.requireNonNull(java.util.Objects.requireNonNull) ImmutableMultimap(com.google.common.collect.ImmutableMultimap) DynamicFilterPlaceholder(com.facebook.presto.expressions.DynamicFilters.DynamicFilterPlaceholder) ImmutableMap(com.google.common.collect.ImmutableMap) Set(java.util.Set) PlanNodeSearcher(com.facebook.presto.sql.planner.optimizations.PlanNodeSearcher) Domain(com.facebook.presto.common.predicate.Domain) TupleDomain(com.facebook.presto.common.predicate.TupleDomain) Consumer(java.util.function.Consumer) PlanNode(com.facebook.presto.spi.plan.PlanNode) List(java.util.List) TableScanNode(com.facebook.presto.spi.plan.TableScanNode) Optional(java.util.Optional) DynamicFilters.extractDynamicFilters(com.facebook.presto.expressions.DynamicFilters.extractDynamicFilters) MoreObjects.toStringHelper(com.google.common.base.MoreObjects.toStringHelper) FilterNode(com.facebook.presto.spi.plan.FilterNode) DynamicFilterPlaceholder(com.facebook.presto.expressions.DynamicFilters.DynamicFilterPlaceholder) PlanNode(com.facebook.presto.spi.plan.PlanNode) VariableReferenceExpression(com.facebook.presto.spi.relation.VariableReferenceExpression) DynamicFilterExtractResult(com.facebook.presto.expressions.DynamicFilters.DynamicFilterExtractResult) ImmutableMultimap(com.google.common.collect.ImmutableMultimap) Collectors.toMap(java.util.stream.Collectors.toMap) Map(java.util.Map) ImmutableMap(com.google.common.collect.ImmutableMap)

Example 8 with DynamicFilterPlaceholder

use of com.facebook.presto.expressions.DynamicFilters.DynamicFilterPlaceholder in project presto by prestodb.

the class LocalDynamicFilter method convertTupleDomain.

private TupleDomain<VariableReferenceExpression> convertTupleDomain(TupleDomain<String> result) {
    if (result.isNone()) {
        return TupleDomain.none();
    }
    // Convert the predicate to use probe variables (instead dynamic filter IDs).
    // Note that in case of a probe-side union, a single dynamic filter may match multiple probe variables.
    ImmutableMap.Builder<VariableReferenceExpression, Domain> builder = ImmutableMap.builder();
    for (Map.Entry<String, Domain> entry : result.getDomains().get().entrySet()) {
        Domain domain = entry.getValue();
        // Store all matching variables for each build channel index.
        for (DynamicFilterPlaceholder placeholder : probeVariables.get(entry.getKey())) {
            Domain updatedDomain = placeholder.applyComparison(domain);
            builder.put((VariableReferenceExpression) placeholder.getInput(), updatedDomain);
        }
    }
    return TupleDomain.withColumnDomains(builder.build());
}
Also used : VariableReferenceExpression(com.facebook.presto.spi.relation.VariableReferenceExpression) Domain(com.facebook.presto.common.predicate.Domain) TupleDomain(com.facebook.presto.common.predicate.TupleDomain) Collectors.toMap(java.util.stream.Collectors.toMap) Map(java.util.Map) ImmutableMap(com.google.common.collect.ImmutableMap) DynamicFilterPlaceholder(com.facebook.presto.expressions.DynamicFilters.DynamicFilterPlaceholder) ImmutableMap(com.google.common.collect.ImmutableMap)

Aggregations

TupleDomain (com.facebook.presto.common.predicate.TupleDomain)8 DynamicFilterPlaceholder (com.facebook.presto.expressions.DynamicFilters.DynamicFilterPlaceholder)8 VariableReferenceExpression (com.facebook.presto.spi.relation.VariableReferenceExpression)8 BasePlanTest (com.facebook.presto.sql.planner.assertions.BasePlanTest)6 Test (org.testng.annotations.Test)6 Domain (com.facebook.presto.common.predicate.Domain)2 ImmutableMap (com.google.common.collect.ImmutableMap)2 Map (java.util.Map)2 Collectors.toMap (java.util.stream.Collectors.toMap)2 DynamicFilterExtractResult (com.facebook.presto.expressions.DynamicFilters.DynamicFilterExtractResult)1 DynamicFilters.extractDynamicFilters (com.facebook.presto.expressions.DynamicFilters.extractDynamicFilters)1 FilterNode (com.facebook.presto.spi.plan.FilterNode)1 PlanNode (com.facebook.presto.spi.plan.PlanNode)1 TableScanNode (com.facebook.presto.spi.plan.TableScanNode)1 PlanNodeSearcher (com.facebook.presto.sql.planner.optimizations.PlanNodeSearcher)1 AbstractJoinNode (com.facebook.presto.sql.planner.plan.AbstractJoinNode)1 MoreObjects.toStringHelper (com.google.common.base.MoreObjects.toStringHelper)1 Verify.verify (com.google.common.base.Verify.verify)1 ImmutableMultimap (com.google.common.collect.ImmutableMultimap)1 Multimap (com.google.common.collect.Multimap)1