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