0
votes

My application runs a query created using querybuilder API but finally, its converted into an XPath query and executed. Everything works well except when there is a quote symbol in the text. I ma using custom predicates to search the text. Example: predicateMap.put("0_group.2_group.title_customcase.title_fulltext", searchText);

I tried this in the native interface at http://localhost:4502/crx/explorer/ui/search.jsp and it fails there as well.

Search for: don't
Search in: /content/geometrixx/en
XPath Query generated: /jcr:root/content/geometrixx/en//*[jcr:contains(., 'don't')] order by @jcr:score descending

Exception (similar to my server logs):

Error: javax.jcr.query.InvalidQueryException: java.text.ParseException:

Is there any workaround for this? I did find some similar questions on SoF but not the exact thing. The querydebug page is able to search this text but it just seems to replace it with 2 quotes:

/jcr:root/content/geometrixx/en//*[jcr:contains(., 'don''t')]

So I am confused why such behavior withing AEM itself.

1
Could you post the code where you use the QueryBuilder to add this predicate?toniedzwiedz
Can you try hexadecimal value for quote. May be it will help you.Amrendra Kumar
@AmrendraKumar, I've tried using "%27" instead of the single quote, but it breaks down the whole code. Didn't work in the query debugger as well.Riju Mahna
@toniedzwiedz, I've added the line of code in the question. ThanksRiju Mahna

1 Answers

1
votes

There are always two escape mechanisms you have to keep in mind:

1) escaping a character within the contains statement. e.g. the spec says you can search for a phrase using double quotes: "foo bar". that means if you want to use a double quote as literal an not a delimiter for a phrase you have to escape it.

2) escaping any string literal appropriately in XPath or SQL. E.g. in XPath the string literal must not be written as: 'don"t'

for your query that means you have to write: /jcr:root/content/geometrixx/en//*[jcr:contains(., 'don\"t')] order by @jcr:score descending

OR

you can use double quot /jcr:root/content/geometrixx/en//*[jcr:contains(., "don't")] order by @jcr:score descending