diff options
author | Jon Bratseth <bratseth@gmail.com> | 2022-08-16 14:58:14 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-16 14:58:14 +0200 |
commit | c32eb05eb420abe1964bbdd60d03f72ed6546e6c (patch) | |
tree | 7813a7ec729cc021c88cd8e100fe4fa2ad6a5824 | |
parent | 120dcac54aa5fd19f02a6cd48b4b02327362ed60 (diff) | |
parent | 5d7a6831032badd54854e9ac261bc370e8e740e7 (diff) |
Merge pull request #23678 from vespa-engine/bratseth/default-index
Bratseth/default index
11 files changed, 92 insertions, 22 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 586d1d32d57..9f57512f657 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 @@ -133,6 +133,9 @@ public abstract class AbstractParser implements CustomParser { IndexFacts.Session indexFacts, String defaultIndexName, Parsable parsable) { if (queryToParse == null) return null; + if (defaultIndexName != null) + defaultIndexName = indexFacts.getCanonicName(defaultIndexName); + tokenize(queryToParse, defaultIndexName, indexFacts, parsingLanguage); if (parsingLanguage == null && parsable != null) { @@ -143,7 +146,7 @@ public abstract class AbstractParser implements CustomParser { } setState(parsingLanguage, indexFacts); - Item root = parseItems(); + Item root = parseItems(defaultIndexName); if (filterToParse != null) { AnyParser filterParser = new AnyParser(environment); if (root == null) { @@ -222,8 +225,8 @@ public abstract class AbstractParser implements CustomParser { if (tokenOrNull == null) return false; return kind.equals(tokenOrNull.kind); } - - protected abstract Item parseItems(); + + protected abstract Item parseItems(String defaultIndexName); /** * Assigns the default index to query terms having no default index. The diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/AdvancedParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/AdvancedParser.java index 690fc67af7e..3358075d670 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/parser/AdvancedParser.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/AdvancedParser.java @@ -20,7 +20,7 @@ public class AdvancedParser extends StructuredParser { super(environment); } - protected Item parseItems() { + protected Item parseItems(String defaultIndexName) { return advancedItems(true); } diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java index 545bb8e777f..09caa72ca59 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java @@ -41,16 +41,16 @@ public class AllParser extends SimpleParser { } @Override - protected Item parseItems() { + protected Item parseItems(String defaultIndexName) { int position = tokens.getPosition(); try { - return parseItemsBody(); + return parseItemsBody(defaultIndexName); } finally { tokens.setPosition(position); } } - protected Item parseItemsBody() { + protected Item parseItemsBody(String defaultIndexName) { // Algorithm: Collect positive, negative, and and'ed items, then combine. CompositeItem and = null; NotItem not = null; // Store negatives here as we go @@ -65,7 +65,7 @@ public class AllParser extends SimpleParser { current = positiveItem(); if (current == null) - current = indexableItem(); + current = indexableItem(defaultIndexName); if (current == null) current = compositeItem(); diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/AnyParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/AnyParser.java index e22043c6b8f..f4ff769ad05 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/parser/AnyParser.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/AnyParser.java @@ -31,8 +31,8 @@ public class AnyParser extends SimpleParser { super(environment); } - protected Item parseItems() { - return anyItems(true); + protected Item parseItems(String defaultIndexName) { + return anyItems(true, defaultIndexName); } Item parseFilter(String filter, Language queryLanguage, IndexFacts.Session indexFacts) { diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/PhraseParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/PhraseParser.java index 75edf9fbf5c..72eb56dd0fb 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/parser/PhraseParser.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/PhraseParser.java @@ -16,7 +16,7 @@ public class PhraseParser extends AbstractParser { super(environment); } - protected Item parseItems() { + protected Item parseItems(String defaultIndex) { return forcedPhrase(); } diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java index 27bce6bd027..fafbf55a522 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java @@ -33,12 +33,12 @@ abstract class SimpleParser extends StructuredParser { * If there's a explicit composite and some other terms, * a rank terms combines them */ - protected Item anyItems(boolean topLevel) { + protected Item anyItems(boolean topLevel, String defaultIndexName) { int position = tokens.getPosition(); Item item = null; try { - item = anyItemsBody(topLevel); + item = anyItemsBody(topLevel, defaultIndexName); return item; } finally { if (item == null) { @@ -47,7 +47,11 @@ abstract class SimpleParser extends StructuredParser { } } - private Item anyItemsBody(boolean topLevel) { + protected Item anyItems(boolean topLevel) { + return anyItems(topLevel, null); + } + + private Item anyItemsBody(boolean topLevel, String defaultIndexName) { Item topLevelItem = null; NotItem not = null; Item item = null; @@ -88,7 +92,7 @@ abstract class SimpleParser extends StructuredParser { } if (item == null) { - item = indexableItem(); + item = indexableItem(defaultIndexName); if (item != null) { if (topLevelItem == null) { topLevelItem = item; diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java index f993c7a9e02..c668cf66447 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java @@ -7,6 +7,7 @@ import com.yahoo.search.query.parser.ParserEnvironment; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import static com.yahoo.prelude.query.parser.Token.Kind.*; @@ -52,11 +53,18 @@ abstract class StructuredParser extends AbstractParser { } protected Item indexableItem() { + return indexableItem(null); + } + + protected Item indexableItem(String defaultIndexName) { int position = tokens.getPosition(); Item item = null; try { String indexName = indexPrefix(); + if (Objects.isNull(indexName)) { + indexName = defaultIndexName; + } setSubmodeFromIndex(indexName, indexFacts); item = number(); diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenizeParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenizeParser.java index dbbc321d057..eefbe5fa0d0 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenizeParser.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenizeParser.java @@ -22,7 +22,7 @@ public final class TokenizeParser extends AbstractParser { } @Override - protected Item parseItems() { + protected Item parseItems(String defaultIndex) { WeakAndItem weakAnd = new WeakAndItem(); Token token; while (null != (token = tokens.next())) { diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/WebParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/WebParser.java index d7c7dec4798..40497d94a6d 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/parser/WebParser.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/WebParser.java @@ -28,7 +28,7 @@ public class WebParser extends AllParser { } @Override - protected Item parseItemsBody() { + protected Item parseItemsBody(String defaultIndexName) { // Algorithm: Collect positive, negative, and'ed and or'ed elements, then combine. CompositeItem and = null; OrItem or = null; @@ -45,7 +45,7 @@ public class WebParser extends AllParser { current = positiveItem(); if (current == null) - current = indexableItem(); + current = indexableItem(defaultIndexName); if (current != null) { if (and != null && (current instanceof WordItem) && "OR".equals(((WordItem)current).getRawWord())) { diff --git a/container-search/src/test/java/com/yahoo/search/test/QueryTestCase.java b/container-search/src/test/java/com/yahoo/search/test/QueryTestCase.java index f8a77445a40..a722552b7d2 100644 --- a/container-search/src/test/java/com/yahoo/search/test/QueryTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/test/QueryTestCase.java @@ -452,10 +452,34 @@ public class QueryTestCase { @Test void testDefaultIndex() { - Query q = new Query("?query=hi%20hello%20keyword:kanoo%20" + - "default:munkz%20%22phrases+too%22&default-index=def"); + Query q = new Query("?query=hi%20hello%20keyword:kanoo%20default:munkz%20%22phrases+too%22&default-index=def"); assertEquals("WEAKAND(100) def:hi def:hello keyword:kanoo default:munkz def:\"phrases too\"", - q.getModel().getQueryTree().toString()); + q.getModel().getQueryTree().toString()); + } + + @Test + void testDefaultIndexAlias() { + SearchDefinition test = new SearchDefinition("test"); + Index year = new Index("year"); + year.setNumerical(true); + year.addAlias("yearalias"); + test.addIndex(year); + test.addAlias("yearalias", "year"); + IndexModel indexModel = new IndexModel(test); + + { + Query q = new Query("?default-index=year&type=all"); + q.getModel().setExecution(new Execution(Execution.Context.createContextStub(new IndexFacts(indexModel)))); + q.getModel().setQueryString("2000"); + assertEquals("select * from sources * where year = 2000", q.yqlRepresentation()); + } + + { + Query q = new Query("?default-index=yearalias&type=all"); + q.getModel().setExecution(new Execution(Execution.Context.createContextStub(new IndexFacts(indexModel)))); + q.getModel().setQueryString("2000"); + assertEquals("select * from sources * where year = 2000", q.yqlRepresentation()); + } } @Test diff --git a/container-search/src/test/java/com/yahoo/search/yql/UserInputTestCase.java b/container-search/src/test/java/com/yahoo/search/yql/UserInputTestCase.java index 8fe451dd095..1e3b52c23af 100644 --- a/container-search/src/test/java/com/yahoo/search/yql/UserInputTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/yql/UserInputTestCase.java @@ -3,7 +3,10 @@ package com.yahoo.search.yql; import static org.junit.jupiter.api.Assertions.*; -import com.yahoo.search.query.QueryTree; +import com.yahoo.prelude.Index; +import com.yahoo.prelude.IndexFacts; +import com.yahoo.prelude.IndexModel; +import com.yahoo.prelude.SearchDefinition; import org.apache.http.client.utils.URIBuilder; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -367,4 +370,32 @@ public class UserInputTestCase { assertEquals("select * from sources * where text_field contains \"boom\"", query.yqlRepresentation()); } + @Test + void testUserInputWithPhraseSegmentingIndex() { + execution = new Execution(searchChain, Execution.Context.createContextStub(createIndexFacts(true))); + URIBuilder builder = searchUri(); + builder.setParameter("wql", "foo&bar"); + builder.setParameter("yql", "select * from sources * where ([{\"defaultIndex\": \"text_field\",\"grammar\": \"any\"}]userInput(@wql))"); + Query query = searchAndAssertNoErrors(builder); + assertEquals("select * from sources * where text_field contains phrase(\"foo\", \"bar\")", query.yqlRepresentation()); + } + + @Test + void testUserInputWithNonPhraseSegmentingIndex() { + execution = new Execution(searchChain, Execution.Context.createContextStub(createIndexFacts(false))); + URIBuilder builder = searchUri(); + builder.setParameter("wql", "foo&bar"); + builder.setParameter("yql", "select * from sources * where ([{\"defaultIndex\": \"text_field\",\"grammar\": \"any\"}]userInput(@wql))"); + Query query = searchAndAssertNoErrors(builder); + assertEquals("select * from sources * where (text_field contains \"foo\" AND text_field contains \"bar\")", query.yqlRepresentation()); + } + + private IndexFacts createIndexFacts(boolean phraseSegmenting) { + SearchDefinition sd = new SearchDefinition("sources"); + Index test = new Index("text_field"); + test.setPhraseSegmenting(phraseSegmenting); + sd.addIndex(test); + return new IndexFacts(new IndexModel(sd)); + } + } |