use of com.facebook.presto.spi.plan.FilterNode 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));
}
use of com.facebook.presto.spi.plan.FilterNode in project presto by prestodb.
the class TestPinotPlanOptimizer method testPartialPredicatePushdown.
@Test
public void testPartialPredicatePushdown() {
PlanBuilder planBuilder = createPlanBuilder(defaultSessionHolder);
TableScanNode tableScanNode = tableScan(planBuilder, pinotTable, regionId, city, fare, secondsSinceEpoch);
FilterNode filter = filter(planBuilder, tableScanNode, getRowExpression("lower(substr(city, 0, 3)) = 'del' AND fare > 100", defaultSessionHolder));
PlanNode originalPlan = limit(planBuilder, 50L, filter);
PlanNode optimized = getOptimizedPlan(planBuilder, originalPlan);
PlanMatchPattern tableScanMatcher = PinotTableScanMatcher.match(pinotTable, Optional.of("SELECT regionId, city, fare, secondsSinceEpoch FROM hybrid__TABLE_NAME_SUFFIX_TEMPLATE__ WHERE \\(fare > 100\\).*"), Optional.of(true), filter.getOutputVariables(), useSqlSyntax());
assertPlanMatch(optimized, PlanMatchPattern.limit(50L, PlanMatchPattern.filter("lower(substr(city, 0, 3)) = 'del'", tableScanMatcher)), typeProvider);
}
use of com.facebook.presto.spi.plan.FilterNode in project presto by prestodb.
the class TestPinotPlanOptimizer method testDatePredicatePushdown.
@Test
public void testDatePredicatePushdown() {
PlanBuilder planBuilder = createPlanBuilder(defaultSessionHolder);
FilterNode filter = filter(planBuilder, tableScan(planBuilder, pinotTable, regionId, city, fare, daysSinceEpoch), getRowExpression("dayssinceepoch < DATE '2014-01-31'", defaultSessionHolder));
PlanNode originalPlan = limit(planBuilder, 50L, filter);
PlanNode optimized = getOptimizedPlan(planBuilder, originalPlan);
assertPlanMatch(optimized, PinotTableScanMatcher.match(pinotTable, Optional.of("SELECT regionId, city, fare, daysSinceEpoch FROM hybrid WHERE \\(daysSinceEpoch < 16101\\) LIMIT 50"), Optional.of(false), originalPlan.getOutputVariables(), useSqlSyntax()), typeProvider);
}
use of com.facebook.presto.spi.plan.FilterNode in project presto by prestodb.
the class TestPinotPlanOptimizer method testTimestampPredicatePushdown.
@Test
public void testTimestampPredicatePushdown() {
PlanBuilder planBuilder = createPlanBuilder(defaultSessionHolder);
FilterNode filter = filter(planBuilder, tableScan(planBuilder, pinotTable, regionId, city, fare, millisSinceEpoch), getRowExpression("millissinceepoch < TIMESTAMP '2014-01-31 00:00:00 UTC'", defaultSessionHolder));
PlanNode originalPlan = limit(planBuilder, 50L, filter);
PlanNode optimized = getOptimizedPlan(planBuilder, originalPlan);
assertPlanMatch(optimized, PinotTableScanMatcher.match(pinotTable, Optional.of("SELECT regionId, city, fare, millisSinceEpoch FROM hybrid WHERE \\(millisSinceEpoch < 1391126400000\\) LIMIT 50"), Optional.of(false), originalPlan.getOutputVariables(), useSqlSyntax()), typeProvider);
}
use of com.facebook.presto.spi.plan.FilterNode in project presto by prestodb.
the class TestPinotPlanOptimizer method testTimestampFieldCompareToDateLiteralPredicatePushdown.
@Test
public void testTimestampFieldCompareToDateLiteralPredicatePushdown() {
PlanBuilder planBuilder = createPlanBuilder(defaultSessionHolder);
FilterNode filter = filter(planBuilder, tableScan(planBuilder, pinotTable, regionId, city, fare, millisSinceEpoch), getRowExpression("millissinceepoch < DATE '2014-01-31'", defaultSessionHolder));
PlanNode originalPlan = limit(planBuilder, 50L, filter);
PlanNode optimized = getOptimizedPlan(planBuilder, originalPlan);
assertPlanMatch(optimized, PinotTableScanMatcher.match(pinotTable, Optional.of("SELECT regionId, city, fare, millisSinceEpoch FROM hybrid WHERE \\(millisSinceEpoch < 1391126400000\\) LIMIT 50"), Optional.of(false), originalPlan.getOutputVariables(), useSqlSyntax()), typeProvider);
}
Aggregations