diff --git a/processing/src/main/java/io/druid/query/filter/ExtractionDimFilter.java b/processing/src/main/java/io/druid/query/filter/ExtractionDimFilter.java index 81bf20e4c9b8..6f3a4eb36e48 100644 --- a/processing/src/main/java/io/druid/query/filter/ExtractionDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/ExtractionDimFilter.java @@ -22,6 +22,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Preconditions; +import com.google.common.base.Strings; import com.metamx.common.StringUtils; import io.druid.query.extraction.ExtractionFn; import io.druid.query.lookup.LookupExtractionFn; @@ -98,7 +99,12 @@ public DimFilter optimize() { if (this.getExtractionFn() instanceof LookupExtractionFn && ((LookupExtractionFn) this.getExtractionFn()).isOptimize()) { - LookupExtractor lookup = ((LookupExtractionFn) this.getExtractionFn()).getLookup(); + // case ReplaceMissingValueWith matching the value we can not optimize + final LookupExtractionFn lookupExtractionFn = (LookupExtractionFn) this.getExtractionFn(); + if (Strings.emptyToNull(lookupExtractionFn.getReplaceMissingValueWith()) == Strings.emptyToNull(value)) { + return this; + } + final LookupExtractor lookup = lookupExtractionFn.getLookup(); final List keys = lookup.unapply(this.getValue()); final String dimensionName = this.getDimension(); if (!keys.isEmpty()) { diff --git a/processing/src/main/java/io/druid/query/lookup/LookupExtractionFn.java b/processing/src/main/java/io/druid/query/lookup/LookupExtractionFn.java index 02459f5de7ae..f5ee90228bbc 100644 --- a/processing/src/main/java/io/druid/query/lookup/LookupExtractionFn.java +++ b/processing/src/main/java/io/druid/query/lookup/LookupExtractionFn.java @@ -90,7 +90,8 @@ public boolean isInjective() @JsonProperty("optimize") public boolean isOptimize() { - return optimize; + // case retainMissingValue == true we can not optimize need to push down the filter + return !isRetainMissingValue() && optimize; } @Override