aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoranton kolhun <antonkol@wix.com>2022-08-05 13:31:14 +0300
committeranton kolhun <antonkol@wix.com>2022-08-05 13:31:14 +0300
commitc03dc21456403fbc356e3920e2d14cafdfdbadd8 (patch)
treeed4b916f4eec58991b6d24da7cdb784e81a42e4b
parentf2aa09101b6edf726f01141c12e77ddb1d1a8f9e (diff)
added defaultIndex processing for userInput parsing
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/AbstractParser.java6
-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/yql/UserInputTestCase.java33
10 files changed, 62 insertions, 19 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..55001ae5915 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
@@ -143,7 +143,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 +222,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/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));
+ }
+
}