diff options
Diffstat (limited to 'container-search/src/main/java/com/yahoo/prelude/query/parser/AbstractParser.java')
-rw-r--r-- | container-search/src/main/java/com/yahoo/prelude/query/parser/AbstractParser.java | 79 |
1 files changed, 31 insertions, 48 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/AbstractParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/AbstractParser.java index 9f57512f657..38d09c3ddf4 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/parser/AbstractParser.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/AbstractParser.java @@ -5,12 +5,19 @@ import com.yahoo.language.Language; import com.yahoo.language.process.Segmenter; import com.yahoo.prelude.Index; import com.yahoo.prelude.IndexFacts; -import com.yahoo.prelude.query.*; +import com.yahoo.prelude.query.AndSegmentItem; +import com.yahoo.prelude.query.CompositeItem; +import com.yahoo.prelude.query.Item; +import com.yahoo.prelude.query.NullItem; +import com.yahoo.prelude.query.PhraseItem; +import com.yahoo.prelude.query.PhraseSegmentItem; +import com.yahoo.prelude.query.WordItem; import com.yahoo.search.query.QueryTree; import com.yahoo.search.query.parser.Parsable; import com.yahoo.search.query.parser.ParserEnvironment; -import java.util.*; +import java.util.List; +import java.util.ListIterator; /** * The Vespa query parser. @@ -20,6 +27,7 @@ import java.util.*; */ public abstract class AbstractParser implements CustomParser { + /** The current submodes of this parser */ protected Submodes submodes = new Submodes(); @@ -32,6 +40,8 @@ public abstract class AbstractParser implements CustomParser { /** The IndexFacts.Session of this query */ protected IndexFacts.Session indexFacts; + protected String defaultIndex; + /** * The counter for braces in URLs, braces in URLs are accepted so long as * they are balanced. @@ -125,41 +135,38 @@ public abstract class AbstractParser implements CustomParser { @Override public final Item parse(String queryToParse, String filterToParse, Language parsingLanguage, - IndexFacts.Session indexFacts, String defaultIndexName) { - return parse(queryToParse, filterToParse, parsingLanguage, indexFacts, defaultIndexName, null); + IndexFacts.Session indexFacts, String defaultIndex) { + return parse(queryToParse, filterToParse, parsingLanguage, indexFacts, defaultIndex, null); } private Item parse(String queryToParse, String filterToParse, Language parsingLanguage, - IndexFacts.Session indexFacts, String defaultIndexName, Parsable parsable) { + IndexFacts.Session indexFacts, String defaultIndex, Parsable parsable) { if (queryToParse == null) return null; if (defaultIndexName != null) - defaultIndexName = indexFacts.getCanonicName(defaultIndexName); + defaultIndexName = indexFacts.getCanonicName(defaultIndex); - tokenize(queryToParse, defaultIndexName, indexFacts, parsingLanguage); + tokenize(queryToParse, defaultIndex, indexFacts, parsingLanguage); if (parsingLanguage == null && parsable != null) { - String detectionText = generateLanguageDetectionTextFrom(tokens, indexFacts, defaultIndexName); + String detectionText = generateLanguageDetectionTextFrom(tokens, indexFacts, defaultIndex); if (detectionText.isEmpty()) // heuristic detection text extraction is fallible detectionText = queryToParse; parsingLanguage = parsable.getOrDetectLanguage(detectionText); } - setState(parsingLanguage, indexFacts); - Item root = parseItems(defaultIndexName); + setState(parsingLanguage, indexFacts, defaultIndex); + Item root = parseItems(); + if (filterToParse != null) { AnyParser filterParser = new AnyParser(environment); if (root == null) { - root = filterParser.parseFilter(filterToParse, parsingLanguage, indexFacts); + root = filterParser.parseFilter(filterToParse, parsingLanguage, indexFacts, defaultIndex); } else { - root = filterParser.applyFilter(root, filterToParse, parsingLanguage, indexFacts); + root = filterParser.applyFilter(root, filterToParse, parsingLanguage, indexFacts, defaultIndex); } } - root = simplifyPhrases(root); - if (defaultIndexName != null) { - assignDefaultIndex(indexFacts.getCanonicName(defaultIndexName), root); - } - return root; + return simplifyPhrases(root); } /** @@ -226,30 +233,7 @@ public abstract class AbstractParser implements CustomParser { return kind.equals(tokenOrNull.kind); } - protected abstract Item parseItems(String defaultIndexName); - - /** - * Assigns the default index to query terms having no default index. The - * parser _should_ have done this, for some reason it doesn't. - * - * @param defaultIndex the default index to assign - * @param item the item to check - */ - private static void assignDefaultIndex(String defaultIndex, Item item) { - if (defaultIndex == null || item == null) return; - - if (item instanceof IndexedItem) { - IndexedItem indexName = (IndexedItem) item; - - if ("".equals(indexName.getIndexName())) - indexName.setIndexName(defaultIndex); - } - else if (item instanceof CompositeItem) { - Iterator<Item> items = ((CompositeItem)item).getItemIterator(); - while (items.hasNext()) - assignDefaultIndex(defaultIndex, items.next()); - } - } + protected abstract Item parseItems(); /** * Unicode normalizes some piece of natural language text. The chosen form @@ -261,10 +245,11 @@ public abstract class AbstractParser implements CustomParser { return environment.getLinguistics().getNormalizer().normalize(input); } - protected void setState(Language queryLanguage, IndexFacts.Session indexFacts) { + protected void setState(Language queryLanguage, IndexFacts.Session indexFacts, String defaultIndex) { this.indexFacts = indexFacts; - language = queryLanguage; - submodes.reset(); + this.defaultIndex = defaultIndex; + this.language = queryLanguage; + this.submodes.reset(); } /** @@ -293,8 +278,7 @@ public abstract class AbstractParser implements CustomParser { return unwashed; } else if (unwashed instanceof PhraseItem) { return collapsePhrase((PhraseItem) unwashed); - } else if (unwashed instanceof CompositeItem) { - CompositeItem composite = (CompositeItem) unwashed; + } else if (unwashed instanceof CompositeItem composite) { ListIterator<Item> i = composite.getItemIterator(); while (i.hasNext()) { @@ -312,9 +296,8 @@ public abstract class AbstractParser implements CustomParser { } private static Item collapsePhrase(PhraseItem phrase) { - if (phrase.getItemCount() == 1 && phrase.getItem(0) instanceof WordItem) { + if (phrase.getItemCount() == 1 && phrase.getItem(0) instanceof WordItem word) { // TODO: Other stuff which needs propagation? - WordItem word = (WordItem) phrase.getItem(0); word.setWeight(phrase.getWeight()); return word; } else { |