aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/prelude/query/parser/AbstractParser.java
diff options
context:
space:
mode:
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.java79
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 {