diff --git a/src/test/java/org/caosdb/server/query/TestCQL.java b/src/test/java/org/caosdb/server/query/TestCQL.java index fe73e2b2c33749fac6d72a4c5b478eca5d154465..6c289adaef49f356aeaa7b5c7c744d4c4b1a6ce3 100644 --- a/src/test/java/org/caosdb/server/query/TestCQL.java +++ b/src/test/java/org/caosdb/server/query/TestCQL.java @@ -281,6 +281,8 @@ public class TestCQL { // quotation marks gone rogue String quotation1 = "FIND ENTITY WHICH HAS A PROPERTY LIKE '*with double*' AND A PROPERTY LIKE '*and single*' AND A PROPERTY LIKE '*what\\'s wrong?*' AND A PROPERTY LIKE '*\\'*' AND A PROPERTY LIKE '*nothin\\'*' AND A PROPERTY LIKE '*\"\\'bla*'"; + String issue203a = "FIND WHICH ( HAS pname )"; + String issue203b = "FIND WHICH ( HAS pname1 AND REFERENCES pname2 )"; @Test public void testQuery1() @@ -7013,4 +7015,41 @@ public class TestCQL { assertEquals("POV(null,LIKE ,%nothin'%)", conj.getFilters().get(4).toString()); assertEquals("POV(null,LIKE ,%\"'bla%)", conj.getFilters().get(5).toString()); } + + /** + * Test that brackets around 'has pname' do not cause filter to become subproperty filter. + * + * <p>https://gitlab.com/caosdb/caosdb-server/-/issues/203 + */ + @Test + public void testIssue203() { + CQLLexer lexer; + lexer = new CQLLexer(CharStreams.fromString(this.issue203a)); + CommonTokenStream tokens = new CommonTokenStream(lexer); + + CQLParser parser = new CQLParser(tokens); + CqContext sfq = parser.cq(); + + System.out.println(sfq.toStringTree(parser)); + assertEquals(3, sfq.getChildCount()); + assertTrue(sfq.filter instanceof POV); + + // with conjunction + lexer = new CQLLexer(CharStreams.fromString(this.issue203b)); + tokens = new CommonTokenStream(lexer); + + parser = new CQLParser(tokens); + sfq = parser.cq(); + + System.out.println(sfq.toStringTree(parser)); + System.out.println(sfq.getChildCount()); + System.out.println(sfq.getChildCount()); + Conjunction conj = (Conjunction) sfq.filter; + System.out.println(conj.getFilters().size()); + assertEquals(3, sfq.getChildCount()); + assertTrue(sfq.filter instanceof Conjunction); + assertEquals(2, conj.getFilters().size()); + assertTrue(conj.getFilters().get(0) instanceof POV); + assertTrue(conj.getFilters().get(1) instanceof POV); + } }