From e643c0fdd35d17c8de40ff1655fba666d7b01208 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Sun, 9 Jan 2022 16:35:05 +0100 Subject: Add weakAnd grammar and parser --- .../test/SegmentSubstitutionTestCase.java | 2 +- .../com/yahoo/search/yql/TermListTestCase.java | 4 +- .../com/yahoo/search/yql/UserInputTestCase.java | 44 ++++++++++++++++++++-- .../com/yahoo/search/yql/YqlParserTestCase.java | 36 +++++++++--------- 4 files changed, 62 insertions(+), 24 deletions(-) (limited to 'container-search/src/test/java/com') diff --git a/container-search/src/test/java/com/yahoo/prelude/semantics/test/SegmentSubstitutionTestCase.java b/container-search/src/test/java/com/yahoo/prelude/semantics/test/SegmentSubstitutionTestCase.java index 94332a52fed..69faed1da90 100644 --- a/container-search/src/test/java/com/yahoo/prelude/semantics/test/SegmentSubstitutionTestCase.java +++ b/container-search/src/test/java/com/yahoo/prelude/semantics/test/SegmentSubstitutionTestCase.java @@ -54,7 +54,7 @@ public class SegmentSubstitutionTestCase extends RuleBaseAbstractTestCase { } private static Item parseQuery(String query) { - AllParser parser = new AllParser(new ParserEnvironment().setLinguistics(TestLinguistics.INSTANCE)); + AllParser parser = new AllParser(new ParserEnvironment().setLinguistics(TestLinguistics.INSTANCE), false); return parser.parse(new Parsable().setQuery(query).setLanguage(Language.CHINESE_SIMPLIFIED)).getRoot(); } diff --git a/container-search/src/test/java/com/yahoo/search/yql/TermListTestCase.java b/container-search/src/test/java/com/yahoo/search/yql/TermListTestCase.java index ac0d676caf7..efaaaa5fca7 100644 --- a/container-search/src/test/java/com/yahoo/search/yql/TermListTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/yql/TermListTestCase.java @@ -23,7 +23,7 @@ public class TermListTestCase { @Test public void testTermListInWeightedSet() { URIBuilder builder = searchUri(); - builder.setParameter("myTerms", "{'1':1, '2':1, '3':1}"); + builder.setParameter("myTerms", "{'1':1, '2':1, 3:1}"); builder.setParameter("yql", "select * from sources * where weightedSet(user_id, @myTerms)"); Query query = searchAndAssertNoErrors(builder); assertEquals("select * from sources * where weightedSet(user_id, {\"1\": 1, \"2\": 1, \"3\": 1});", @@ -33,7 +33,7 @@ public class TermListTestCase { @Test public void testTermListInWand() { URIBuilder builder = searchUri(); - builder.setParameter("myTerms", "{'1':1, '2':1, '3':1}"); + builder.setParameter("myTerms", "{'1':1, 2:1, '3':1}"); builder.setParameter("yql", "select * from sources * where wand(user_id, @myTerms)"); Query query = searchAndAssertNoErrors(builder); assertEquals("select * from sources * where wand(user_id, {\"1\": 1, \"2\": 1, \"3\": 1});", 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 cc1a275af5a..c41de3a73f1 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 @@ -72,7 +72,7 @@ public class UserInputTestCase { @Test public void testRawUserInput() { URIBuilder builder = searchUri(); - builder.setParameter("yql", "select * from sources * where [{grammar: \"raw\"}]userInput(\"nal le\")"); + builder.setParameter("yql", "select * from sources * where {grammar: \"raw\"}userInput(\"nal le\")"); Query query = searchAndAssertNoErrors(builder); assertEquals("select * from sources * where default contains \"nal le\";", query.yqlRepresentation()); } @@ -81,7 +81,7 @@ public class UserInputTestCase { public void testSegmentedUserInput() { URIBuilder builder = searchUri(); builder.setParameter("yql", - "select * from sources * where [{grammar: \"segment\"}]userInput(\"nal le\")"); + "select * from sources * where {grammar: \"segment\"}userInput(\"nal le\")"); Query query = searchAndAssertNoErrors(builder); assertEquals("select * from sources * where default contains ([{origin: {original: \"nal le\", offset: 0, length: 6}}]phrase(\"nal\", \"le\"));", query.yqlRepresentation()); } @@ -90,11 +90,49 @@ public class UserInputTestCase { public void testSegmentedNoiseUserInput() { URIBuilder builder = searchUri(); builder.setParameter("yql", - "select * from sources * where [{grammar: \"segment\"}]userInput(\"^^^^^^^^\")"); + "select * from sources * where {grammar: \"segment\"}userInput(\"^^^^^^^^\")"); Query query = searchAndAssertNoErrors(builder); assertEquals("select * from sources * where default contains \"^^^^^^^^\";", query.yqlRepresentation()); } + @Test + public void testAnyParsedUserInput() { + URIBuilder builder = searchUri(); + builder.setParameter("yql", "select * from sources * where {grammar: \"any\"}userInput('foo bar')"); + Query query = searchAndAssertNoErrors(builder); + assertEquals("select * from sources * where (default contains \"foo\" OR default contains \"bar\");", + query.yqlRepresentation()); + } + + @Test + public void testAllParsedUserInput() { + URIBuilder builder = searchUri(); + builder.setParameter("yql", "select * from sources * where {grammar: \"all\"}userInput('foo bar')"); + Query query = searchAndAssertNoErrors(builder); + assertEquals("select * from sources * where (default contains \"foo\" AND default contains \"bar\");", + query.yqlRepresentation()); + } + + @Test + public void testWeakAndParsedUserInput() { + URIBuilder builder = searchUri(); + builder.setParameter("yql", "select * from sources * where {grammar: \"weakAnd\"}userInput('foo bar')"); + Query query = searchAndAssertNoErrors(builder); + assertEquals("select * from sources * where weakAnd(default contains \"foo\", default contains \"bar\");", + query.yqlRepresentation()); + } + + @Test + public void testIllegalGrammar() { + URIBuilder builder = searchUri(); + builder.setParameter("yql", "select * from sources * where {grammar: \"nonesuch\"}userInput('foo bar')"); + Query query = new Query(builder.toString()); + Result r = execution.search(query); + assertNotNull(r.hits().getError()); + assertEquals("Could not create query from YQL: No query type 'nonesuch'", + r.hits().getError().getDetailedMessage()); + } + @Test public void testCustomDefaultIndexUserInput() { URIBuilder builder = searchUri(); diff --git a/container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java b/container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java index 636619bf1cc..15713dc1f97 100644 --- a/container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java @@ -399,7 +399,7 @@ public class YqlParserTestCase { assertFalse(root instanceof WordItem); assertTrue(root instanceof PhraseSegmentItem); - root = parse("select foo from bar where baz contains ([{grammar:\"raw\"}]\"yoni jo dima\")").getRoot(); + root = parse("select foo from bar where baz contains ({grammar:\"raw\"}\"yoni jo dima\")").getRoot(); assertEquals("baz:yoni jo dima", root.toString()); assertTrue(root instanceof WordItem); assertFalse(root instanceof ExactStringItem); @@ -410,7 +410,7 @@ public class YqlParserTestCase { AndItem andItem = (AndItem) root; assertEquals(3, andItem.getItemCount()); - root = parse("select foo from bar where [{grammar:\"raw\"}]userInput(\"yoni jo dima\")").getRoot(); + root = parse("select foo from bar where {grammar:\"raw\"}userInput(\"yoni jo dima\")").getRoot(); assertTrue(root instanceof WordItem); assertTrue(root instanceof ExactStringItem); assertEquals("yoni jo dima", ((WordItem)root).getWord()); @@ -419,9 +419,9 @@ public class YqlParserTestCase { @Test public void testAccentDropping() { assertFalse(getRootWord("select foo from bar where baz contains " + - "([ {accentDrop: false} ]\"colors\")").isNormalizable()); + "( {accentDrop: false} \"colors\")").isNormalizable()); assertTrue(getRootWord("select foo from bar where baz contains " + - "([ {accentDrop: true} ]\"colors\")").isNormalizable()); + "( {accentDrop: true} \"colors\")").isNormalizable()); assertTrue(getRootWord("select foo from bar where baz contains " + "\"colors\"").isNormalizable()); } @@ -429,9 +429,9 @@ public class YqlParserTestCase { @Test public void testCaseNormalization() { assertTrue(getRootWord("select foo from bar where baz contains " + - "([ {normalizeCase: false} ]\"colors\")").isLowercased()); + "( {normalizeCase: false} \"colors\")").isLowercased()); assertFalse(getRootWord("select foo from bar where baz contains " + - "([ {normalizeCase: true} ]\"colors\")").isLowercased()); + "( {normalizeCase: true} \"colors\")").isLowercased()); assertFalse(getRootWord("select foo from bar where baz contains " + "\"colors\"").isLowercased()); } @@ -440,10 +440,10 @@ public class YqlParserTestCase { public void testSegmentingRule() { assertEquals(SegmentingRule.PHRASE, getRootWord("select foo from bar where baz contains " + - "([ {andSegmenting: false} ]\"colors\")").getSegmentingRule()); + "( {andSegmenting: false} \"colors\")").getSegmentingRule()); assertEquals(SegmentingRule.BOOLEAN_AND, getRootWord("select foo from bar where baz contains " + - "([ {andSegmenting: true} ]\"colors\")").getSegmentingRule()); + "( {andSegmenting: true} \"colors\")").getSegmentingRule()); assertEquals(SegmentingRule.LANGUAGE_DEFAULT, getRootWord("select foo from bar where baz contains " + "\"colors\"").getSegmentingRule()); @@ -453,10 +453,10 @@ public class YqlParserTestCase { public void testNfkc() { assertEquals("a\u030a", getRootWord("select foo from bar where baz contains " + - "([ {nfkc: false} ]\"a\\u030a\")").getWord()); + "( {nfkc: false} \"a\\u030a\")").getWord()); assertEquals("\u00e5", getRootWord("select foo from bar where baz contains " + - "([ {nfkc: true} ]\"a\\u030a\")").getWord()); + "( {nfkc: true} \"a\\u030a\")").getWord()); assertEquals("No NKFC by default", "a\u030a", getRootWord("select foo from bar where baz contains " + @@ -465,19 +465,19 @@ public class YqlParserTestCase { @Test public void testImplicitTransforms() { - assertFalse(getRootWord("select foo from bar where baz contains ([ {implicitTransforms: " + - "false} ]\"cox\")").isFromQuery()); - assertTrue(getRootWord("select foo from bar where baz contains ([ {implicitTransforms: " + - "true} ]\"cox\")").isFromQuery()); + assertFalse(getRootWord("select foo from bar where baz contains ({implicitTransforms: " + + "false} \"cox\")").isFromQuery()); + assertTrue(getRootWord("select foo from bar where baz contains ({implicitTransforms: " + + "true} \"cox\")").isFromQuery()); assertTrue(getRootWord("select foo from bar where baz contains \"cox\"").isFromQuery()); } @Test public void testConnectivity() { QueryTree parsed = parse("select foo from bar where " + - "title contains ([{id: 1, connectivity: {\"id\": 3, weight: 7.0}}]\"madonna\") " + - "and title contains ([{id: 2}]\"saint\") " + - "and title contains ([{id: 3}]\"angel\")"); + "title contains ({id: 1, connectivity: {\"id\": 3, weight: 7.0}}\"madonna\") " + + "and title contains ({id: 2}\"saint\") " + + "and title contains ({id: 3}\"angel\")"); assertEquals("AND title:madonna title:saint title:angel", parsed.toString()); AndItem root = (AndItem)parsed.getRoot(); @@ -489,7 +489,7 @@ public class YqlParserTestCase { assertNull(second.getConnectedItem()); assertParseFail("select foo from bar where " + - "title contains ([{id: 1, connectivity: {id: 4, weight: 7.0}}]\"madonna\") " + + "title contains ({id: 1, connectivity: {id: 4, weight: 7.0}}\"madonna\") " + "and title contains ({id: 2}\"saint\") " + "and title contains ({id: 3}\"angel\")", new IllegalArgumentException("Item 'title:madonna' was specified to connect to item with ID 4, " + -- cgit v1.2.3