aboutsummaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2022-08-19 13:59:41 +0200
committerJon Bratseth <bratseth@gmail.com>2022-08-19 13:59:41 +0200
commitf359fcf2bdbb50900b8be854eed38ae5fa12cf59 (patch)
tree32129089d1f679675038c8d02878c8c019443962 /container-search
parentcc96b081aa8ba8cd83f23042d58eb8e693b77b82 (diff)
Apply defaultIndex to filters after parsing
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/AbstractParser.java29
-rw-r--r--container-search/src/test/java/com/yahoo/search/test/QueryWithFilterTestCase.java11
2 files changed, 40 insertions, 0 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 f838e96c930..5da1f1a07be 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
@@ -7,6 +7,7 @@ import com.yahoo.prelude.Index;
import com.yahoo.prelude.IndexFacts;
import com.yahoo.prelude.query.AndSegmentItem;
import com.yahoo.prelude.query.CompositeItem;
+import com.yahoo.prelude.query.IndexedItem;
import com.yahoo.prelude.query.Item;
import com.yahoo.prelude.query.NullItem;
import com.yahoo.prelude.query.PhraseItem;
@@ -16,6 +17,7 @@ import com.yahoo.search.query.QueryTree;
import com.yahoo.search.query.parser.Parsable;
import com.yahoo.search.query.parser.ParserEnvironment;
+import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
@@ -166,6 +168,8 @@ public abstract class AbstractParser implements CustomParser {
root = filterParser.applyFilter(root, filterToParse, parsingLanguage, indexFacts);
}
}
+ if (defaultIndex != null)
+ assignDefaultIndex(indexFacts.getCanonicName(defaultIndex), root);
return simplifyPhrases(root);
}
@@ -228,6 +232,31 @@ public abstract class AbstractParser implements CustomParser {
return detectionText.toString();
}
+ /**
+ * Assigns the default index to query terms having no default index.
+ *
+ * This will apply the default index to terms without it added through the filter parameter,
+ * where setting defaultIndex into state causes incorrect parsing.
+ *
+ * @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());
+ }
+ }
+
private boolean is(Token.Kind kind, Token tokenOrNull) {
if (tokenOrNull == null) return false;
return kind.equals(tokenOrNull.kind);
diff --git a/container-search/src/test/java/com/yahoo/search/test/QueryWithFilterTestCase.java b/container-search/src/test/java/com/yahoo/search/test/QueryWithFilterTestCase.java
index 082cede5ff4..3920a95bd98 100644
--- a/container-search/src/test/java/com/yahoo/search/test/QueryWithFilterTestCase.java
+++ b/container-search/src/test/java/com/yahoo/search/test/QueryWithFilterTestCase.java
@@ -41,6 +41,17 @@ public class QueryWithFilterTestCase {
q.getModel().getQueryTree().toString());
}
+ /** Tests that default-index is not applied to NOT filters */
+ @Test
+ void testAndFilterWithoutExplicitIndex() {
+ Query q = newQueryFromEncoded("?query=trump" +
+ "&model.type=all" +
+ "&model.defaultIndex=text" +
+ "&filter=%2B%28filterTerm%29");
+ assertEquals("AND text:trump |text:filterTerm",
+ q.getModel().getQueryTree().toString());
+ }
+
private Query newQueryFromEncoded(String queryString) {
return newQueryFromEncoded(queryString, null, new SimpleLinguistics());
}