summaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2022-10-13 14:36:52 +0200
committerGitHub <noreply@github.com>2022-10-13 14:36:52 +0200
commitdfd212a763d8cc893bab59e539af4e49ea185b3b (patch)
tree234964cf5ca04f11225a7266fb909a22a3621d5d /container-search
parent830b0c9f2511bdeebc13f84f36466225faceb1d5 (diff)
parent6d0910f9acfc5025c7855916f58497694e7faa2a (diff)
Merge pull request #24429 from vespa-engine/bratseth/propagate-targetHits
Propagate targetHits
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/search/yql/YqlParser.java16
-rw-r--r--container-search/src/test/java/com/yahoo/search/yql/UserInputTestCase.java12
2 files changed, 23 insertions, 5 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java b/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
index 9d47f7cef9f..3a1927983d2 100644
--- a/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
+++ b/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
@@ -130,8 +130,9 @@ public class YqlParser implements Parser {
private static final String USER_INPUT_DEFAULT_INDEX = "defaultIndex";
private static final String USER_INPUT_GRAMMAR = "grammar";
public static final String USER_INPUT_LANGUAGE = "language";
- private static final String USER_INPUT_RAW = "raw";
- private static final String USER_INPUT_SEGMENT = "segment";
+ private static final String USER_INPUT_GRAMMAR_RAW = "raw";
+ private static final String USER_INPUT_GRAMMAR_SEGMENT = "segment";
+ private static final String USER_INPUT_GRAMMAR_WEAKAND = "weakAnd";
private static final String USER_INPUT = "userInput";
private static final String USER_QUERY = "userQuery";
private static final String NON_EMPTY = "nonEmpty";
@@ -720,14 +721,19 @@ public class YqlParser implements Parser {
String.class, "default", "default index for user input terms");
Language language = decideParsingLanguage(ast, wordData);
Item item;
- if (USER_INPUT_RAW.equals(grammar)) {
+ if (USER_INPUT_GRAMMAR_RAW.equals(grammar)) {
item = instantiateWordItem(defaultIndex, wordData, ast, null, SegmentWhen.NEVER, true, language);
- } else if (USER_INPUT_SEGMENT.equals(grammar)) {
+ } else if (USER_INPUT_GRAMMAR_SEGMENT.equals(grammar)) {
item = instantiateWordItem(defaultIndex, wordData, ast, null, SegmentWhen.ALWAYS, false, language);
} else {
item = parseUserInput(grammar, defaultIndex, wordData, language, allowEmpty);
propagateUserInputAnnotations(ast, item);
}
+
+ // Set grammar-specific annotations
+ if (USER_INPUT_GRAMMAR_WEAKAND.equals(grammar) && item instanceof WeakAndItem weakAndItem) {
+ weakAndItem.setN(getAnnotation(ast, TARGET_HITS, Integer.class, WeakAndItem.defaultN, "'targetHits' (N) for weak and"));
+ }
return item;
}
@@ -1426,7 +1432,7 @@ public class YqlParser implements Parser {
wordItem = new WordItem(wordData, fromQuery);
break;
case POSSIBLY:
- if (shouldSegment(field, fromQuery) && ! grammar.equals(USER_INPUT_RAW)) {
+ if (shouldSegment(field, fromQuery) && ! grammar.equals(USER_INPUT_GRAMMAR_RAW)) {
wordItem = segment(field, ast, wordData, fromQuery, parent, language);
} else {
wordItem = new WordItem(wordData, fromQuery);
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 1e3b52c23af..858d5a16352 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
@@ -7,6 +7,7 @@ import com.yahoo.prelude.Index;
import com.yahoo.prelude.IndexFacts;
import com.yahoo.prelude.IndexModel;
import com.yahoo.prelude.SearchDefinition;
+import com.yahoo.prelude.query.WeakAndItem;
import org.apache.http.client.utils.URIBuilder;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -89,6 +90,17 @@ public class UserInputTestCase {
}
@Test
+ void testUserInputSettingTargetHits() {
+ URIBuilder builder = searchUri();
+ builder.setParameter("yql",
+ "select * from sources * where {grammar: \"weakAnd\", targetHits: 17, defaultIndex: \"f\"}userInput(\"a test\")");
+ Query query = searchAndAssertNoErrors(builder);
+ assertEquals("select * from sources * where ({targetNumHits: 17}weakAnd(f contains \"a\", f contains \"test\"))", query.yqlRepresentation());
+ WeakAndItem weakAnd = (WeakAndItem)query.getModel().getQueryTree().getRoot();
+ assertEquals(17, weakAnd.getN());
+ }
+
+ @Test
void testSegmentedNoiseUserInput() {
URIBuilder builder = searchUri();
builder.setParameter("yql",