LikeFilter: Read value lazily when doing a prefix-based match. (#3880)

This speeds up cases where we don't actually need to read the value,
such as "LIKE 'foo%'".
This commit is contained in:
Gian Merlino 2017-01-25 13:22:07 -08:00 committed by Jonathan Wei
parent b3dae0efc3
commit 3136dfa421
2 changed files with 8 additions and 4 deletions

View File

@ -29,6 +29,7 @@ import com.google.common.io.BaseEncoding;
import com.google.common.primitives.Chars;
import io.druid.java.util.common.StringUtils;
import io.druid.query.extraction.ExtractionFn;
import io.druid.segment.data.Indexed;
import io.druid.segment.filter.LikeFilter;
import javax.annotation.Nullable;
@ -154,17 +155,20 @@ public class LikeDimFilter implements DimFilter
}
/**
* Checks if the suffix of "s" matches the suffix of this matcher. The first prefix.length characters
* of s are ignored. This method is useful if you've already independently verified the prefix.
* Checks if the suffix of strings.get(i) matches the suffix of this matcher. The first prefix.length characters
* of s are ignored. This method is useful if you've already independently verified the prefix. This method
* evalutes strings.get(i) lazily to save time when it isn't necessary to actually look at the string.
*/
public boolean matchesSuffixOnly(@Nullable final String s)
public boolean matchesSuffixOnly(final Indexed<String> strings, final int i)
{
if (suffixMatch == SuffixMatch.MATCH_ANY) {
return true;
} else if (suffixMatch == SuffixMatch.MATCH_EMPTY) {
final String s = strings.get(i);
return (s == null ? 0 : s.length()) == prefix.length();
} else {
// suffixMatch is MATCH_PATTERN
final String s = strings.get(i);
return matches(s);
}
}

View File

@ -99,7 +99,7 @@ public class LikeFilter implements Filter
@Override
public ImmutableBitmap next()
{
while (currIndex < endIndex && !likeMatcher.matchesSuffixOnly(dimValues.get(currIndex))) {
while (currIndex < endIndex && !likeMatcher.matchesSuffixOnly(dimValues, currIndex)) {
currIndex++;
}