jirutka/rsql-parser

Unable to use single quotes in the value

vvkkganta opened this issue · 15 comments

When I am trying to parse Node rootNode = new RSQLParser(operators).parse("FIRSTNAME==Vijay's"); This throws cz.jirutka.rsql.parser.RSQLParserException: cz.jirutka.rsql.parser.TokenMgrError: Lexical error at line 1, column 19. Encountered: after : "'s"
at cz.jirutka.rsql.parser.RSQLParser.parse(RSQLParser.java:122)
at rsql.parserTest.RSqlTest.testsingleQuoteCustomOperator(RSqlTest.java:75)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: cz.jirutka.rsql.parser.TokenMgrError: Lexical error at line 1, column 19. Encountered: after : "'s"
at cz.jirutka.rsql.parser.ParserTokenManager.getNextToken(ParserTokenManager.java:460)
at cz.jirutka.rsql.parser.Parser.jj_ntk(Parser.java:320)
at cz.jirutka.rsql.parser.Parser.And(Parser.java:57)
at cz.jirutka.rsql.parser.Parser.Or(Parser.java:30)
at cz.jirutka.rsql.parser.Parser.Input(Parser.java:21)
at cz.jirutka.rsql.parser.RSQLParser.parse(RSQLParser.java:119)
... 24 more
Is there any way to use singlequotes (').

If you want to use a quote inside the value, then you (obviously) must enclose the value in double quotes:

Node rootNode = new RSQLParser(operators).parse("FIRSTNAME==\"Vijay's\"")

It’s described in the readme:

Value that doesn’t contain any reserved character or a white space can be unquoted, other arguments must be enclosed in single or double quotes.

Quotes are reserved characters.

I got the below exception when I tried Node rootNode = new RSQLParser(operators).parse(""FIRSTNAME==Vijay's"");

cz.jirutka.rsql.parser.RSQLParserException: cz.jirutka.rsql.parser.ParseException: Encountered " <DOUBLE_QUOTED_STR> "FIRSTNAME==Vijay's "" at line 1, column 1.
Was expecting one of:
<UNRESERVED_STR> ...
"(" ...

at cz.jirutka.rsql.parser.RSQLParser.parse(RSQLParser.java:122)
at rsql.parserTest.RSqlTest.testsingleQuoteCustomOperator(RSqlTest.java:75)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Caused by: cz.jirutka.rsql.parser.ParseException: Encountered " <DOUBLE_QUOTED_STR> "FIRSTNAME==Vijay's "" at line 1, column 1.
Was expecting one of:
<UNRESERVED_STR> ...
"(" ...

at cz.jirutka.rsql.parser.Parser.generateParseException(Parser.java:357)
at cz.jirutka.rsql.parser.Parser.jj_consume_token(Parser.java:295)
at cz.jirutka.rsql.parser.Parser.Constraint(Parser.java:84)
at cz.jirutka.rsql.parser.Parser.And(Parser.java:53)
at cz.jirutka.rsql.parser.Parser.Or(Parser.java:30)
at cz.jirutka.rsql.parser.Parser.Input(Parser.java:21)
at cz.jirutka.rsql.parser.RSQLParser.parse(RSQLParser.java:119)
... 24 more

Eh, mea culpa, it should be:

Node rootNode = new RSQLParser(operators).parse("FIRSTNAME==\"Vijay's\"")

Thank you..

Is there a way when I can use single quote and double quote in the value..

Node rootNode = new RSQLParser(operators).parse("FIRSTNAME==Vijay'"Almería/}");

I am trying to solve some international character set, where I see single quote and double quote included in the value field...

No, this currently isn’t possible. It was already requested in #7. I’ll try to look at it soon.

@vvkkganta I’ve just released 2.1.0 with updated grammar that supports escape character inside a quoted argument.

Thanks Jakub, I will try it out.

Sent from my iPhone

On Feb 6, 2016, at 5:19 PM, Jakub Jirutka notifications@github.com wrote:

@vvkkganta I’ve just released 2.1.0 with updated grammar that supports escape character inside a quoted argument.


Reply to this email directly or view it on GitHub.

Can you please throw an example to use single and double quote..
Node rootNode = new RSQLParser(operators).parse("FIRSTNAME==Vijay'"Almería/}");

Please read the readme…

Backslash has a special meaning only inside a quoted argument, not in unquoted argument.

So your example should be: FIRSTNAME=="Vijay'\"Almería/}"
In Java code, you must also escape double quotes and backslash: .parse("FIRSTNAME==\"Vijay'\\\"Almería/}\"").

Thanks, so we only escape double quotes.. got it

You can escape double quotes, or single quotes. Technically, you can escape both, but it doesn’t make sense to do so. If you’re writing RSQL queries in Java, then it would be more convenient for you to use single quotes in RSQL and escape double quotes, i.e. .parse("FIRSTNAME=='Vijay\\'\"Almería/}'").

@jirutka can you please help me here.
Mongo query :
{ field: { $mod: [ divisor, remainder ] } } How can we convert this to RSQL

Thanks,
Rambabu

@jirutka
When I am trying to parse Node rootNode = new RSQLParser(operators).parse((fullName.stringified=contains='simon');(fullName.stringified=contains='l'"houtellier'));
This throws : cz.jirutka.rsql.parser.RSQLParserException: cz.jirutka.rsql.parser.TokenMgrError: Lexical error at line 1, column 90. Encountered: <EOF> after : "\"houtellier\'))"
My Test case Simon L'Houtellier - My Query : "fullName=contains='Simon';fullName=contains='L\\'\"Houtellier'"
Thanks