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