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 ba...@apache.org on 2021/03/11 14:04:43 UTC

svn commit: r1887484 - 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: baedke
Date: Thu Mar 11 14:04:42 2021
New Revision: 1887484

URL: http://svn.apache.org/viewvc?rev=1887484&view=rev
Log:
PAK-9373: LucenePropertyIndex#createLikeQuery() ingnores escaping

Fixed missing handling of escaped escape characters.

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=1887484&r1=1887483&r2=1887484&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 Thu Mar 11 14:04:42 2021
@@ -1154,11 +1154,19 @@ public class LucenePropertyIndex extends
     private static Query createLikeQuery(String name, String first) {
         StringBuilder firstBuilder = new StringBuilder(first);
         for (int k = 0; k < firstBuilder.length(); k++) {
-            if (firstBuilder.charAt(k) == '%' && !(k > 0 && firstBuilder.charAt(k-1) == '\\')) {
-                firstBuilder.setCharAt(k, WildcardQuery.WILDCARD_STRING);
+            if (firstBuilder.charAt(k) == '%') {
+                int escapeCount = 0;
+                for (int m = k - 1; m >= 0 && firstBuilder.charAt(m) == '\\'; m--,escapeCount++);
+                if (escapeCount % 2 == 0) {
+                    firstBuilder.setCharAt(k, WildcardQuery.WILDCARD_STRING);
+                }
             }
-            if (firstBuilder.charAt(k) == '_' && !(k > 0 && firstBuilder.charAt(k-1) == '\\')) {
-                firstBuilder.setCharAt(k, WildcardQuery.WILDCARD_CHAR);
+            if (firstBuilder.charAt(k) == '_') {
+                int escapeCount = 0;
+                for (int m = k - 1; m >= 0 && firstBuilder.charAt(m) == '\\'; m--,escapeCount++);
+                if (escapeCount % 2 == 0) {
+                    firstBuilder.setCharAt(k, WildcardQuery.WILDCARD_CHAR);
+                }
             }
         }
         first = firstBuilder.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=1887484&r1=1887483&r2=1887484&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 Thu Mar 11 14:04:42 2021
@@ -1269,12 +1269,14 @@ public class LucenePropertyIndexTest ext
         test.addChild("e").setProperty("propa", "_foo");
         test.addChild("f").setProperty("propa", "foo_bar");
         test.addChild("g").setProperty("propa", "foo%_bar");
+        test.addChild("h").setProperty("propa", "foo\\bar");
+        test.addChild("i").setProperty("propa", "foo\\\\%bar");
         root.commit();
 
         assertQuery("select [jcr:path] from [nt:base] where propa like 'foo%'",
-                asList("/test/a", "/test/c", "/test/d", "/test/f", "/test/g"));
+                asList("/test/a", "/test/c", "/test/d", "/test/f", "/test/g", "/test/h", "/test/i"));
         assertQuery("select [jcr:path] from [nt:base] where propa like '%oo%'",
-                asList("/test/a", "/test/c", "/test/d", "/test/e", "/test/f", "/test/g"));
+                asList("/test/a", "/test/c", "/test/d", "/test/e", "/test/f", "/test/g", "/test/h", "/test/i"));
         assertQuery("select [jcr:path] from [nt:base] where propa like 'foo\\%'",
                 asList("/test/a"));
         assertQuery("select [jcr:path] from [nt:base] where propa like '%oo\\%'",
@@ -1295,6 +1297,12 @@ public class LucenePropertyIndexTest ext
                 asList("/test/d", "/test/f"));
         assertQuery("select [jcr:path] from [nt:base] where propa like '%oo\\%\\_%'",
                 asList("/test/g"));
+        assertQuery("select [jcr:path] from [nt:base] where propa like 'foo\\\\bar'",
+                asList("/test/h"));
+        assertQuery("select [jcr:path] from [nt:base] where propa like '%\\\\%'",
+                asList("/test/h", "/test/i"));
+        assertQuery("select [jcr:path] from [nt:base] where propa like '%\\\\\\%%'",
+                asList("/test/i"));
     }
 
     @Test