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/29 06:41:59 UTC

svn commit: r1727483 - 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: Fri Jan 29 05:41:59 2016
New Revision: 1727483

URL: http://svn.apache.org/viewvc?rev=1727483&view=rev
Log:
OAK-3879 - Lucene index / compatVersion 2: search for 'abc!' does not work

Expanded the escape list set

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=1727483&r1=1727482&r2=1727483&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 Fri Jan 29 05:41:59 2016
@@ -39,6 +39,7 @@ import com.google.common.collect.Abstrac
 import com.google.common.collect.Lists;
 import com.google.common.collect.Queues;
 import com.google.common.collect.Sets;
+import com.google.common.primitives.Chars;
 import org.apache.jackrabbit.oak.api.PropertyValue;
 import org.apache.jackrabbit.oak.api.Result.SizePrecision;
 import org.apache.jackrabbit.oak.api.Type;
@@ -1337,6 +1338,11 @@ public class LucenePropertyIndex impleme
     }
 
     /**
+     * Following chars are used as operators in Lucene Query and should be escaped
+     */
+    private static final char[] LUCENE_QUERY_OPERATORS = {':' , '/', '!', '&', '|', '[', ']', '{', '}'};
+
+    /**
      * Following logic is taken from org.apache.jackrabbit.core.query.lucene.JackrabbitQueryParser#parse(java.lang.String)
      */
     static String rewriteQueryText(String textsearch) {
@@ -1361,10 +1367,7 @@ public class LucenePropertyIndex impleme
                     escaped = false;
                 }
                 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
+            } else if (Chars.contains(LUCENE_QUERY_OPERATORS, c)) {
                 rewritten.append('\\').append(c);
             } else {
                 if (escaped) {

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=1727483&r1=1727482&r2=1727483&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 Fri Jan 29 05:41:59 2016
@@ -1891,13 +1891,22 @@ public class LucenePropertyIndexTest ext
 
         Tree test = root.getTree("/").addChild("test");
         test.setProperty("tag", "stockphotography:business/business_abstract");
+        Tree test2 = root.getTree("/").addChild("test2");
+        test2.setProperty("tag", "foo!");
         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"));
+        assertPlanAndQuery(propabQuery, "lucene:test1(/oak:index/test1)", asList("/test"));
 
+        String query2 = "select * from [nt:base] where CONTAINS(tag, 'foo!')";
+        assertPlanAndQuery(query2, "lucene:test1(/oak:index/test1)", asList("/test2"));
+
+    }
+
+    private void assertPlanAndQuery(String query, String planExpectation, List<String> paths){
+        assertThat(explain(query), containsString(planExpectation));
+        assertQuery(query, paths);
     }
 
     private static Tree createNodeWithMixinType(Tree t, String nodeName, String typeName){