diff --git a/CHANGELOG.md b/CHANGELOG.md index a10cb0ccde2072f90c2bdd42d701fdfce1478adb..73433a48ceb379ffc792b86613ecdbf158793727 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed ### ### Fixed ### +- [#203](https://gitlab.com/caosdb/caosdb-server/-/issues/203) * Searching for values in scientific notation [#143](https://gitlab.com/caosdb/caosdb-server/-/issues/143) diff --git a/src/main/java/org/caosdb/server/query/CQLParser.g4 b/src/main/java/org/caosdb/server/query/CQLParser.g4 index eb43e17be1fc7b4161a72124ceb3b583588ca5e1..d62b0eaa1ed86dcae86e7a721d204d5883b41b53 100644 --- a/src/main/java/org/caosdb/server/query/CQLParser.g4 +++ b/src/main/java/org/caosdb/server/query/CQLParser.g4 @@ -133,6 +133,7 @@ entity_filter returns [EntityFilterInterface filter] ( ( LPAREN WHITE_SPACE? + (HAS_A (PROPERTY)?)? ( filter_expression {$filter = $filter_expression.efi;} | conjunction {$filter = $conjunction.c;} @@ -433,6 +434,7 @@ conjunction returns [Conjunction c] f1 = filter_expression {$c.add($f1.efi);} | LPAREN WHITE_SPACE? + (HAS_A (PROPERTY)?)? ( f4 = filter_expression {$c.add($f4.efi);} | disjunction {$c.add($disjunction.d);} @@ -473,6 +475,7 @@ disjunction returns [Disjunction d] f1 = filter_expression {$d.add($f1.efi);} | LPAREN WHITE_SPACE? + (HAS_A (PROPERTY)?)? ( f4 = filter_expression {$d.add($f4.efi);} | conjunction {$d.add($conjunction.c);} diff --git a/src/test/java/org/caosdb/server/query/TestCQL.java b/src/test/java/org/caosdb/server/query/TestCQL.java index 50f96f6f8bdd856313c5923ffcac1c2e220028dd..a2f055d33ef17f3b9bed1d47fca8349c2d28c4db 100644 --- a/src/test/java/org/caosdb/server/query/TestCQL.java +++ b/src/test/java/org/caosdb/server/query/TestCQL.java @@ -285,6 +285,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() @@ -7063,5 +7065,37 @@ public class TestCQL { final CQLParser parser = new CQLParser(tokens); assertThrowsExactly(Query.ParsingException.class, () -> parser.cq()); + + /** + * 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() { + // setup 203a + CQLLexer lexer; + lexer = new CQLLexer(CharStreams.fromString(this.issue203a)); + CommonTokenStream tokens = new CommonTokenStream(lexer); + CQLParser parser = new CQLParser(tokens); + CqContext sfq = parser.cq(); + + // here we test that the filter stays a POV and is not falsly interpreted + // as subproperty filter + assertTrue(sfq.filter instanceof POV); + + // setup 203b (with conjunction) + lexer = new CQLLexer(CharStreams.fromString(this.issue203b)); + tokens = new CommonTokenStream(lexer); + parser = new CQLParser(tokens); + sfq = parser.cq(); + Conjunction conj = (Conjunction) sfq.filter; + + // the outer filter should be conjuction + assertTrue(sfq.filter instanceof Conjunction); + // here we test that the filters stays a POV and is not falsly interpreted + // as subproperty filters + assertTrue(conj.getFilters().get(0) instanceof POV); + assertTrue(conj.getFilters().get(1) instanceof POV); } }