DimFilterUtils: Exit filterShards early when filter is null. (#16774)

When the filter is null, there is no need to run the converter on
all the input objects.
This commit is contained in:
Gian Merlino 2024-07-22 21:17:11 -07:00 committed by GitHub
parent b645d09c5d
commit 8b8ca0d7fc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 8 additions and 1 deletions

View File

@ -20,6 +20,7 @@
package org.apache.druid.query.filter; package org.apache.druid.query.filter;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.RangeSet; import com.google.common.collect.RangeSet;
import org.apache.druid.query.planning.DataSourceAnalysis; import org.apache.druid.query.planning.DataSourceAnalysis;
import org.apache.druid.timeline.partition.ShardSpec; import org.apache.druid.timeline.partition.ShardSpec;
@ -116,13 +117,19 @@ public class DimFilterUtils
final Map<String, Optional<RangeSet<String>>> dimensionRangeCache final Map<String, Optional<RangeSet<String>>> dimensionRangeCache
) )
{ {
if (dimFilter == null) {
// ImmutableSet retains order from "input".
return ImmutableSet.copyOf(input);
}
// LinkedHashSet retains order from "input".
Set<T> retSet = new LinkedHashSet<>(); Set<T> retSet = new LinkedHashSet<>();
for (T obj : input) { for (T obj : input) {
ShardSpec shard = converter.apply(obj); ShardSpec shard = converter.apply(obj);
boolean include = true; boolean include = true;
if (dimFilter != null && shard != null) { if (shard != null) {
Map<String, RangeSet<String>> filterDomain = new HashMap<>(); Map<String, RangeSet<String>> filterDomain = new HashMap<>();
List<String> dimensions = shard.getDomainDimensions(); List<String> dimensions = shard.getDomainDimensions();
for (String dimension : dimensions) { for (String dimension : dimensions) {