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