diff options
Diffstat (limited to 'container-search/src/main/java/com/yahoo/prelude/searcher/QuotingSearcher.java')
-rw-r--r-- | container-search/src/main/java/com/yahoo/prelude/searcher/QuotingSearcher.java | 88 |
1 files changed, 55 insertions, 33 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/searcher/QuotingSearcher.java b/container-search/src/main/java/com/yahoo/prelude/searcher/QuotingSearcher.java index 5dcc533fb1f..d4cad7f1246 100644 --- a/container-search/src/main/java/com/yahoo/prelude/searcher/QuotingSearcher.java +++ b/container-search/src/main/java/com/yahoo/prelude/searcher/QuotingSearcher.java @@ -35,7 +35,6 @@ public class QuotingSearcher extends Searcher { } private static class QuoteTable { - private final int lowerUncachedBound; private final int upperUncachedBound; private final Map<Character, String> quoteMap; @@ -51,10 +50,12 @@ public class QuotingSearcher extends Searcher { boolean newIsEmpty = true; Map<Character, String> newQuoteMap = new HashMap<>(); for (Iterator<?> i = config.character().iterator(); i.hasNext(); ) { - QrQuotetableConfig.Character character = (QrQuotetableConfig.Character)i.next(); + QrQuotetableConfig.Character character + = (QrQuotetableConfig.Character)i.next(); if (character.ordinal() > 256) { newIsEmpty = false; - newQuoteMap.put(new Character((char)character.ordinal()), character.quoting()); + newQuoteMap.put(new Character((char)character.ordinal()), + character.quoting()); newUseMap = true; if (minOrd == 0 || character.ordinal() < minOrd) minOrd = character.ordinal(); @@ -63,7 +64,8 @@ public class QuotingSearcher extends Searcher { } else { newIsEmpty = false; - newLowerTable[character.ordinal()] = character.quoting(); + newLowerTable[character.ordinal()] + = character.quoting(); } } lowerUncachedBound = minOrd; @@ -73,19 +75,22 @@ public class QuotingSearcher extends Searcher { isEmpty = newIsEmpty; lowerTable = newLowerTable; } - public String get(char c) { - if (isEmpty) return null; - + if (isEmpty) + return null; int ord = (int)c; if (ord < 256) { return lowerTable[ord]; } else { - if ((!useMap) || ord < lowerUncachedBound || ord > upperUncachedBound) + if ((!useMap) || ord < lowerUncachedBound + || ord > upperUncachedBound) + { return null; - else + } + else { return quoteMap.get(new Character(c)); + } } } public boolean isEmpty() { @@ -102,29 +107,35 @@ public class QuotingSearcher extends Searcher { Result result = execution.search(query); execution.fill(result); QuoteTable translations = getQuoteTable(); - if (translations == null || translations.isEmpty()) return result; - + if (translations == null || translations.isEmpty()) { + return result; + } for (Iterator<Hit> i = result.hits().deepIterator(); i.hasNext(); ) { Hit h = i.next(); - if (h instanceof FastHit) - quoteFields((FastHit) h, translations); + if (h instanceof FastHit) { + quoteProperties((FastHit)h, translations); + } } return result; } - private void quoteFields(FastHit hit, QuoteTable translations) { - hit.forEachField((fieldName, fieldValue) -> { - if (fieldValue != null) { - Class<?> fieldType = fieldValue.getClass(); - if (fieldType.equals(HitField.class)) - quoteField((HitField) fieldValue, translations); - else if (fieldType.equals(String.class)) - quoteField(hit, fieldName, (String) fieldValue, translations); + private void quoteProperties(FastHit hit, QuoteTable translations) { + for (Iterator<?> i = ((Set<?>) hit.fields().keySet()).iterator(); i.hasNext(); ) { + String propertyName = (String) i.next(); + Object entry = hit.getField(propertyName); + if (entry == null) { + continue; + } + Class<? extends Object> propertyType = entry.getClass(); + if (propertyType.equals(HitField.class)) { + quoteField((HitField) entry, translations); + } else if (propertyType.equals(String.class)) { + quoteProperty(hit, propertyName, (String)entry, translations); } - }); + } } - private void quoteField(Hit hit, String fieldname, String toQuote, QuoteTable translations) { + private void quoteProperty(Hit hit, String fieldname, String toQuote, QuoteTable translations) { List<FieldPart> l = translate(toQuote, translations, true); if (l != null) { HitField hf = new HitField(fieldname, toQuote); @@ -133,11 +144,13 @@ public class QuotingSearcher extends Searcher { } } + private void quoteField(HitField field, QuoteTable translations) { for (ListIterator<FieldPart> i = field.listIterator(); i.hasNext(); ) { FieldPart f = i.next(); - if ( ! f.isFinal()) { - List<FieldPart> newFieldParts = translate(f.getContent(), translations, f.isToken()); + if (!f.isFinal()) { + List<FieldPart> newFieldParts = translate(f.getContent(), translations, + f.isToken()); if (newFieldParts != null) { i.remove(); for (Iterator<FieldPart> j = newFieldParts.iterator(); j.hasNext(); ) { @@ -148,24 +161,33 @@ public class QuotingSearcher extends Searcher { } } - private List<FieldPart> translate(String toQuote, QuoteTable translations, boolean isToken) { + private List<FieldPart> translate(String toQuote, QuoteTable translations, + boolean isToken) { List<FieldPart> newFieldParts = null; int lastIdx = 0; for (int i = 0; i < toQuote.length(); i++) { String quote = translations.get(toQuote.charAt(i)); if (quote != null) { - if (newFieldParts == null) + if (newFieldParts == null) { newFieldParts = new ArrayList<>(); - if (lastIdx != i) - newFieldParts.add(new StringFieldPart(toQuote.substring(lastIdx, i), isToken)); + } + if (lastIdx != i) { + newFieldParts.add( + new StringFieldPart(toQuote.substring(lastIdx, i), + isToken)); + } String initContent = Character.toString(toQuote.charAt(i)); - newFieldParts.add(new ImmutableFieldPart(initContent, quote, isToken)); + newFieldParts.add(new ImmutableFieldPart(initContent, + quote, + isToken)); lastIdx = i+1; } } - if (lastIdx > 0 && lastIdx < toQuote.length()) - newFieldParts.add(new StringFieldPart(toQuote.substring(lastIdx), isToken)); + if (lastIdx > 0 && lastIdx < toQuote.length()) { + newFieldParts.add( + new StringFieldPart(toQuote.substring(lastIdx), + isToken)); + } return newFieldParts; } - } |