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