From 2546bd3e19ac6352954d9c69c2b1c7df9e88227d Mon Sep 17 00:00:00 2001 From: Scott Date: Wed, 8 Nov 2023 08:06:25 -0500 Subject: [PATCH] feat: allow quoted selectors with reserved characters --- README.adoc | 2 +- src/main/javacc/RSQLParser.jj | 6 ++++-- .../cz/jirutka/rsql/parser/RSQLParserTest.groovy | 11 ++++++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/README.adoc b/README.adoc index 2f774212..2e0fe128 100644 --- a/README.adoc +++ b/README.adoc @@ -70,7 +70,7 @@ It can be any non empty Unicode string that doesn’t contain reserved character The specific syntax of the selector is not enforced by this parser. ---- -selector = unreserved-str; +selector = unreserved-str | double-quoted | single-quoted; ---- Comparison operators are in FIQL notation and some of them has an alternative syntax as well: diff --git a/src/main/javacc/RSQLParser.jj b/src/main/javacc/RSQLParser.jj index 176118d1..e3049458 100644 --- a/src/main/javacc/RSQLParser.jj +++ b/src/main/javacc/RSQLParser.jj @@ -183,9 +183,11 @@ ComparisonNode Comparison(): String Selector(): {} { - token = + token = { return token.image; } + | + ( token = | token = ) { - return token.image; + return unescape(token.image); } } diff --git a/src/test/groovy/cz/jirutka/rsql/parser/RSQLParserTest.groovy b/src/test/groovy/cz/jirutka/rsql/parser/RSQLParserTest.groovy index ef4f41bb..c9a35682 100644 --- a/src/test/groovy/cz/jirutka/rsql/parser/RSQLParserTest.groovy +++ b/src/test/groovy/cz/jirutka/rsql/parser/RSQLParserTest.groovy @@ -87,7 +87,16 @@ class RSQLParserTest extends Specification { 'allons-y', 'l00k.dot.path', 'look/XML/path', 'n:look/n:xml', 'path.to::Ref', '$doll_r.way' ] } - def 'throw exception for selector with reserved char: #input'() { + def 'parse quoted selector with any chars: #input'() { + given: + def expected = eq(input[1..-2], 'val') + expect: + parse("${input}==val") == expected + where: + input << [ '"hi there!"', "'Pěkný den!'", '"Flynn\'s *"', '"o)\'O\'(o"', '"6*7=42"' ] + } + + def 'throw exception for selector with unquoted reserved char: #input'() { when: parse("${input}==val") then: