From be576d3a8ef18da30843ccc853425ed723258672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraj=20Ma=C5=BE=C3=A1ri?= Date: Thu, 30 Jul 2026 15:39:26 +0200 Subject: [PATCH] [NAE-2470] - PFQL double quote string support - update PFQL grammar to support double quote strings - add new queries to QueryLangTest.java - update SearchUtils to support double quote strings --- .../engine/pfql/domain/antlr4/QueryLang.g4 | 2 +- .../pfql/service/utils/SearchUtils.java | 2 +- .../engine/pfql/QueryLangTest.java | 20 +++++++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/netgrif/application/engine/pfql/domain/antlr4/QueryLang.g4 b/src/main/java/com/netgrif/application/engine/pfql/domain/antlr4/QueryLang.g4 index 55867f5289..2d5acedb6a 100644 --- a/src/main/java/com/netgrif/application/engine/pfql/domain/antlr4/QueryLang.g4 +++ b/src/main/java/com/netgrif/application/engine/pfql/domain/antlr4/QueryLang.g4 @@ -339,7 +339,7 @@ doubleRange: leftEndpoint=('(' | '[') SPACE? DOUBLE SPACE? ':' SPACE? DOUBLE SPA dateRange: leftEndpoint=('(' | '[') SPACE? DATE SPACE? ':' SPACE? DATE SPACE? rightEndpoint=(')' | ']') ; dateTimeRange: leftEndpoint=('(' | '[') SPACE? DATETIME SPACE? ':' SPACE? DATETIME SPACE? rightEndpoint=(')' | ']') ; versionRange: leftEndpoint=('(' | '[') SPACE? VERSION_NUMBER SPACE? ':' SPACE? VERSION_NUMBER SPACE? rightEndpoint=(')' | ']') ; -STRING: '\'' (~('\'' | '\r' | '\n'))* '\'' ; // todo NAE-1997: escape??? +STRING: '\'' ( '\\' . | ~('\'' | '\\' | '\r' | '\n') )* '\'' | '"' ( '\\' . | ~('"' | '\\' | '\r' | '\n') )* '"'; INT: DIGIT+ ; DOUBLE: DIGIT+ '.' DIGIT+ ; DATETIME: DATE 'T' ([01] DIGIT | '2' [0-3]) ':' [0-5] DIGIT ':' [0-5] DIGIT ('.' DIGIT+)? ; // 2020-03-03T20:00:00.055 // todo NAE-1997: format diff --git a/src/main/java/com/netgrif/application/engine/pfql/service/utils/SearchUtils.java b/src/main/java/com/netgrif/application/engine/pfql/service/utils/SearchUtils.java index 4a4f5ddf04..a47ea1787f 100644 --- a/src/main/java/com/netgrif/application/engine/pfql/service/utils/SearchUtils.java +++ b/src/main/java/com/netgrif/application/engine/pfql/service/utils/SearchUtils.java @@ -180,7 +180,7 @@ public static String explainQuery(String input) { } public static String getStringValue(String queryLangString) { - return queryLangString.replace("'", ""); + return queryLangString.replaceAll("^[\"']+|[\"']+$", ""); } public static ObjectId getObjectIdValue(String queryLangString) { diff --git a/src/test/java/com/netgrif/application/engine/pfql/QueryLangTest.java b/src/test/java/com/netgrif/application/engine/pfql/QueryLangTest.java index 1a96ab8bf1..25fe22ba04 100644 --- a/src/test/java/com/netgrif/application/engine/pfql/QueryLangTest.java +++ b/src/test/java/com/netgrif/application/engine/pfql/QueryLangTest.java @@ -92,6 +92,11 @@ public void testSearchService() throws InterruptedException { assertEquals(PageImpl.class, cases.getClass()); assertEquals(10, ((Page) cases).getTotalElements()); + Object cases2 = searchService.search("cases: processIdentifier eq \"query_test\" page 1 size 5 sort by title desc"); + assertNotNull(cases2); + assertEquals(PageImpl.class, cases2.getClass()); + assertEquals(10, ((Page) cases2).getTotalElements()); + Object case3 = searchService.search("case: processIdentifier eq 'query_test' and data.number_0.value == 3"); assertNotNull(case3); assertEquals(Case.class, case3.getClass()); @@ -103,6 +108,21 @@ public void testSearchService() throws InterruptedException { assertEquals(Case.class, case4.getClass()); assertEquals("4", ((Case) case4).getFieldValue("text_0")); + Object case4_2 = searchService.search("case: processIdentifier eq \"query_test\" and data.text_0.value == \"4\""); + assertNotNull(case4_2); + assertEquals(Case.class, case4_2.getClass()); + assertEquals("4", ((Case) case4_2).getFieldValue("text_0")); + + Object case4_3 = searchService.search("case: processIdentifier eq 'query_test' and data.text_0.value == \"4\""); + assertNotNull(case4_3); + assertEquals(Case.class, case4_3.getClass()); + assertEquals("4", ((Case) case4_3).getFieldValue("text_0")); + + Object case4_4 = searchService.search("case: processIdentifier eq \"query_test\" and data.text_0.value == '4'"); + assertNotNull(case4_4); + assertEquals(Case.class, case4_4.getClass()); + assertEquals("4", ((Case) case4_4).getFieldValue("text_0")); + Object case5 = searchService.search("case: processIdentifier eq 'query_test' and data.boolean_0.value == true"); assertNotNull(case5); assertEquals(Case.class, case5.getClass());