@@ -106,29 +106,31 @@ public synchronized Supplier<FilterEvaluator> createDynamicPageFilterEvaluator(C
106
106
if (compiledDynamicFilter == null || isBlocked .isDone ()) {
107
107
isBlocked = dynamicFilter .isBlocked ();
108
108
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 ());
121
110
if (!isAwaitable ) {
122
111
isBlocked = null ; // Dynamic filter will not narrow down anymore
123
112
}
124
113
}
125
114
return compiledDynamicFilter ;
126
115
}
127
116
128
- private static Supplier <FilterEvaluator > createDynamicFilterEvaluator (List < RowExpression > rowExpressions , ColumnarFilterCompiler compiler , double selectivityThreshold )
117
+ private Supplier <FilterEvaluator > createDynamicFilterEvaluator (ColumnarFilterCompiler compiler , TupleDomain < ColumnHandle > currentPredicate )
129
118
{
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
+ })
132
134
.filter (Optional ::isPresent )
133
135
.map (Optional ::get )
134
136
.collect (toImmutableList ());
0 commit comments