Author: chetanm
Date: Wed Jan 6 07:09:01 2016
New Revision: 1723239
URL: http://svn.apache.org/viewvc?rev=1723239&view=rev
Log:
OAK-3769 - QueryParse exception when fulltext search performed with term having
'/'
Escaping '/' also
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java?rev=1723239&r1=1723238&r2=1723239&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
Wed Jan 6 07:09:01 2016
@@ -1337,7 +1337,7 @@ public class LucenePropertyIndex impleme
/**
* Following logic is taken from
org.apache.jackrabbit.core.query.lucene.JackrabbitQueryParser#parse(java.lang.String)
*/
- private static String rewriteQueryText(String textsearch) {
+ static String rewriteQueryText(String textsearch) {
// replace escaped ' with just '
StringBuilder rewritten = new StringBuilder();
// the default lucene query parser recognizes 'AND' and 'NOT' as
@@ -1346,27 +1346,30 @@ public class LucenePropertyIndex impleme
textsearch = textsearch.replaceAll("NOT", "not");
boolean escaped = false;
for (int i = 0; i < textsearch.length(); i++) {
- if (textsearch.charAt(i) == '\\') {
+ char c = textsearch.charAt(i);
+ if (c == '\\') {
if (escaped) {
rewritten.append("\\\\");
escaped = false;
} else {
escaped = true;
}
- } else if (textsearch.charAt(i) == '\'') {
+ } else if (c == '\'') {
if (escaped) {
escaped = false;
}
- rewritten.append(textsearch.charAt(i));
- } else if (textsearch.charAt(i) == ':') {
- // fields as known in lucene are not supported
- rewritten.append("\\:");
+ rewritten.append(c);
+ } else if (c == ':' || c == '/') {
+ //TODO Some other chars are also considered special See
OAK-3769 for details
+ //':' fields as known in lucene are not supported
+ //'/' its a special char used for regex search in Lucene
+ rewritten.append('\\').append(c);
} else {
if (escaped) {
rewritten.append('\\');
escaped = false;
}
- rewritten.append(textsearch.charAt(i));
+ rewritten.append(c);
}
}
return rewritten.toString();
Modified:
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java?rev=1723239&r1=1723238&r2=1723239&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
Wed Jan 6 07:09:01 2016
@@ -1842,6 +1842,26 @@ public class LucenePropertyIndexTest ext
assertQuery(propabQuery, asList("/test/a"));
}
+ @Test
+ public void fulltextQueryWithSpecialChars() throws Exception{
+ Tree idx = createIndex("test1", of("propa", "propb"));
+ Tree props = TestUtil.newRulePropTree(idx, "nt:base");
+ Tree prop1 = props.addChild(TestUtil.unique("prop"));
+ prop1.setProperty(LuceneIndexConstants.PROP_NAME, "tag");
+ prop1.setProperty(LuceneIndexConstants.PROP_ANALYZED, true);
+ root.commit();
+
+ Tree test = root.getTree("/").addChild("test");
+ test.setProperty("tag", "stockphotography:business/business_abstract");
+ root.commit();
+
+ String propabQuery = "select * from [nt:base] where CONTAINS(tag, " +
+ "'stockphotography:business/business_abstract')";
+ assertThat(explain(propabQuery),
containsString("lucene:test1(/oak:index/test1)"));
+ assertQuery(propabQuery, asList("/test"));
+
+ }
+
private static Tree createNodeWithMixinType(Tree t, String nodeName,
String typeName){
t = t.addChild(nodeName);
t.setProperty(JcrConstants.JCR_MIXINTYPES,
Collections.singleton(typeName), Type.NAMES);