summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/query/Model.java
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-08-30 12:33:40 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-08-30 12:33:40 +0200
commit5c829e26525247280383265d5074044daea6ec64 (patch)
tree1d082be9c74c0c9e4ca6100eac0e45906be937c7 /container-search/src/main/java/com/yahoo/search/query/Model.java
parentfecfc7d75fd2f4e36a971510f07984a3c32cbe18 (diff)
Detect language in YQL. Allow multiple languages per query
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/query/Model.java')
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/Model.java41
1 files changed, 27 insertions, 14 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/query/Model.java b/container-search/src/main/java/com/yahoo/search/query/Model.java
index e7f4640b202..5268600ade6 100644
--- a/container-search/src/main/java/com/yahoo/search/query/Model.java
+++ b/container-search/src/main/java/com/yahoo/search/query/Model.java
@@ -113,30 +113,43 @@ public class Model implements Cloneable {
}
/**
- * Gets the language to use for parsing. If this is explicitly set, that language is returned, otherwise
- * it is guessed from the query string. If this does not yield an actual language, English is
- * returned as the default.
+ * Gets the language to use for parsing. If this is explicitly set in the model, that language is returned.
+ * Otherwise, if a query tree is already produced and any node in it specifies a language the first such
+ * node encountered in a depth first
+ * left to right search is returned. Otherwise the language is guessed from the query string.
+ * If this does not yield an actual language, English is returned as the default.
*
* @return the language determined, never null
*/
public Language getParsingLanguage() {
Language language = getLanguage();
- if (language != null) {
- return language;
- }
+ if (language != null) return language;
+
language = Language.fromEncoding(encoding);
- if (language != Language.UNKNOWN) {
- return language;
- }
+ if (language != Language.UNKNOWN) return language;
+
+ if (queryTree != null)
+ language = languageBelow(queryTree);
+ if (language != Language.UNKNOWN) return language;
+
Linguistics linguistics = execution.context().getLinguistics();
- if (linguistics != null) {
+ if (linguistics != null)
language = linguistics.getDetector().detect(queryString, null).getLanguage();
- }
- if (language != Language.UNKNOWN) {
- return language;
- }
+ if (language != Language.UNKNOWN) return language;
+
return Language.ENGLISH;
}
+
+ private Language languageBelow(Item item) {
+ if (item.getLanguage() != Language.UNKNOWN) return language;
+ if (item instanceof CompositeItem) {
+ for (Iterator<Item> i = ((CompositeItem) item).getItemIterator(); i.hasNext(); ) {
+ Language childLanguage = languageBelow(i.next());
+ if (childLanguage != Language.UNKNOWN) return childLanguage;
+ }
+ }
+ return Language.UNKNOWN;
+ }
/** Returns the explicitly set parsing language of this query model, or null if none */
public Language getLanguage() { return language; }