You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ch...@apache.org on 2016/01/06 08:09:02 UTC

svn commit: r1723239 - in /jackrabbit/oak/trunk/oak-lucene/src: main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java

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);