Skip to content

Commit da94e07

Browse files
committed
Simplify building of DynamicFilterEvaluator in DynamicPageFilter
1 parent 9001570 commit da94e07

File tree

2 files changed

+19
-17
lines changed

2 files changed

+19
-17
lines changed

core/trino-main/src/main/java/io/trino/sql/gen/columnar/DynamicPageFilter.java

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -106,29 +106,31 @@ public synchronized Supplier<FilterEvaluator> createDynamicPageFilterEvaluator(C
106106
if (compiledDynamicFilter == null || isBlocked.isDone()) {
107107
isBlocked = dynamicFilter.isBlocked();
108108
boolean isAwaitable = dynamicFilter.isAwaitable();
109-
TupleDomain<Symbol> currentPredicate = dynamicFilter.getCurrentPredicate().transformKeys(columnHandles::get);
110-
List<Expression> expressionConjuncts = domainTranslator.toPredicateConjuncts(currentPredicate)
111-
.stream()
112-
// Run the expression derived from TupleDomain through IR optimizer to simplify predicates. E.g. SimplifyContinuousInValues
113-
.map(expression -> irExpressionOptimizer.process(expression, session, ImmutableMap.of()).orElse(expression))
114-
.collect(toImmutableList());
115-
// We translate each conjunct into separate RowExpression to make it easy to profile selectivity
116-
// of dynamic filter per column and drop them if they're ineffective
117-
List<RowExpression> rowExpression = expressionConjuncts.stream()
118-
.map(expression -> translate(expression, sourceLayout, metadata, typeManager))
119-
.collect(toImmutableList());
120-
compiledDynamicFilter = createDynamicFilterEvaluator(rowExpression, compiler, selectivityThreshold);
109+
compiledDynamicFilter = createDynamicFilterEvaluator(compiler, dynamicFilter.getCurrentPredicate());
121110
if (!isAwaitable) {
122111
isBlocked = null; // Dynamic filter will not narrow down anymore
123112
}
124113
}
125114
return compiledDynamicFilter;
126115
}
127116

128-
private static Supplier<FilterEvaluator> createDynamicFilterEvaluator(List<RowExpression> rowExpressions, ColumnarFilterCompiler compiler, double selectivityThreshold)
117+
private Supplier<FilterEvaluator> createDynamicFilterEvaluator(ColumnarFilterCompiler compiler, TupleDomain<ColumnHandle> currentPredicate)
129118
{
130-
List<Supplier<FilterEvaluator>> subExpressionEvaluators = rowExpressions.stream()
131-
.map(expression -> createColumnarFilterEvaluator(expression, compiler))
119+
if (currentPredicate.isNone()) {
120+
return SelectNoneEvaluator::new;
121+
}
122+
// We translate each conjunct into separate FilterEvaluator to make it easy to profile selectivity
123+
// of dynamic filter per column and drop them if they're ineffective
124+
List<Supplier<FilterEvaluator>> subExpressionEvaluators = currentPredicate.getDomains().orElseThrow()
125+
.entrySet().stream()
126+
.map(entry -> {
127+
Symbol symbol = columnHandles.get(entry.getKey());
128+
Expression expression = domainTranslator.toPredicate(entry.getValue(), symbol.toSymbolReference());
129+
// Run the expression derived from TupleDomain through IR optimizer to simplify predicates. E.g. SimplifyContinuousInValues
130+
expression = irExpressionOptimizer.process(expression, session, ImmutableMap.of()).orElse(expression);
131+
RowExpression rowExpression = translate(expression, sourceLayout, metadata, typeManager);
132+
return createColumnarFilterEvaluator(rowExpression, compiler);
133+
})
132134
.filter(Optional::isPresent)
133135
.map(Optional::get)
134136
.collect(toImmutableList());

core/trino-main/src/main/java/io/trino/sql/planner/DomainTranslator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public Expression toPredicate(TupleDomain<Symbol> tupleDomain)
119119
return IrUtils.combineConjuncts(toPredicateConjuncts(tupleDomain));
120120
}
121121

122-
public List<Expression> toPredicateConjuncts(TupleDomain<Symbol> tupleDomain)
122+
private List<Expression> toPredicateConjuncts(TupleDomain<Symbol> tupleDomain)
123123
{
124124
if (tupleDomain.isNone()) {
125125
return ImmutableList.of(FALSE);
@@ -132,7 +132,7 @@ public List<Expression> toPredicateConjuncts(TupleDomain<Symbol> tupleDomain)
132132
.collect(toImmutableList());
133133
}
134134

135-
private Expression toPredicate(Domain domain, Reference reference)
135+
public Expression toPredicate(Domain domain, Reference reference)
136136
{
137137
if (domain.getValues().isNone()) {
138138
return domain.isNullAllowed() ? new IsNull(reference) : FALSE;

0 commit comments

Comments
 (0)