summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2022-08-16 14:58:14 +0200
committerGitHub <noreply@github.com>2022-08-16 14:58:14 +0200
commitc32eb05eb420abe1964bbdd60d03f72ed6546e6c (patch)
tree7813a7ec729cc021c88cd8e100fe4fa2ad6a5824
parent120dcac54aa5fd19f02a6cd48b4b02327362ed60 (diff)
parent5d7a6831032badd54854e9ac261bc370e8e740e7 (diff)
Merge pull request #23678 from vespa-engine/bratseth/default-index
Bratseth/default index
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/AbstractParser.java9
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/AdvancedParser.java2
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java8
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/AnyParser.java4
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/PhraseParser.java2
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java12
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java8
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/TokenizeParser.java2
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/WebParser.java4
-rw-r--r--container-search/src/test/java/com/yahoo/search/test/QueryTestCase.java30
-rw-r--r--container-search/src/test/java/com/yahoo/search/yql/UserInputTestCase.java33
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));
+ }
+
}