diff options
author | Jon Bratseth <bratseth@gmail.com> | 2022-10-13 14:28:43 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2022-10-13 14:28:43 +0200 |
commit | 6d0910f9acfc5025c7855916f58497694e7faa2a (patch) | |
tree | f714e59ff555940dfa302ad28d46593d33d45cb3 /container-search | |
parent | fdd9b30418bfde52377a4589adfa32aa8deba0ee (diff) |
Propagate targetHits
Diffstat (limited to 'container-search')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/yql/YqlParser.java | 16 | ||||
-rw-r--r-- | container-search/src/test/java/com/yahoo/search/yql/UserInputTestCase.java | 12 |
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 72cb102760a..5670e8a7dfd 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 @@ -132,8 +132,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"; @@ -722,14 +723,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; } @@ -1428,7 +1434,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", |