Author: thomasm
Date: Thu Apr 26 07:22:17 2018
New Revision: 1830160
URL: http://svn.apache.org/viewvc?rev=1830160&view=rev
Log:
OAK-7437 SimpleExcerptProvider highlighting should be case insensitive
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SimpleExcerptProvider.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SimpleExcerptProviderTest.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SimpleExcerptProvider.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SimpleExcerptProvider.java?rev=1830160&r1=1830159&r2=1830160&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SimpleExcerptProvider.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SimpleExcerptProvider.java
Thu Apr 26 07:22:17 2018
@@ -19,9 +19,12 @@ package org.apache.jackrabbit.oak.query;
import java.util.BitSet;
import java.util.HashSet;
import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableSet;
+
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.PropertyValue;
import org.apache.jackrabbit.oak.api.Tree;
@@ -45,6 +48,8 @@ class SimpleExcerptProvider {
static final String REP_EXCERPT_FN = "rep:excerpt(.)";
static final String EXCERPT_END = "</span></div>";
static final String EXCERPT_BEGIN = "<div><span>";
+
+ private static final boolean CASE_SENSITIVE_HIGHLIGHT =
Boolean.getBoolean("oak.query.caseSensitiveHighlight");
private static int maxFragmentSize = 150;
@@ -234,7 +239,7 @@ class SimpleExcerptProvider {
}
int index = 0;
while (index < text.length()) {
- index = text.indexOf(token, index);
+ index = indexOfSearchText(text, token, index);
if (index < 0) {
break;
}
@@ -267,6 +272,26 @@ class SimpleExcerptProvider {
}
}
}
+
+ private static int indexOfSearchText(String text, String searchStr, int
fromIndex) {
+ if (CASE_SENSITIVE_HIGHLIGHT) {
+ return text.indexOf(searchStr, fromIndex);
+ }
+ return indexOfIgnoreCase(text, searchStr, fromIndex);
+ }
+
+ public static int indexOfIgnoreCase(String str, String searchStr, int
startPos) {
+ // This is not very efficient, specially as we create the pattern each
time.
+ // An alternative is to use apache commons lang
StringUtils.indexOfIgnoreCase,
+ // but that would require a new dependency
+ String quotedSearchStr = Pattern.quote(searchStr);
+ Pattern pattern = Pattern.compile(quotedSearchStr,
Pattern.CASE_INSENSITIVE);
+ Matcher matcher = pattern.matcher(str);
+ if(matcher.find(startPos)) {
+ return matcher.start();
+ }
+ return -1;
+ }
static boolean isDelimeter(int codePoint) {
return !isLetterOrDigit(codePoint);
Modified:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SimpleExcerptProviderTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SimpleExcerptProviderTest.java?rev=1830160&r1=1830159&r2=1830160&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SimpleExcerptProviderTest.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SimpleExcerptProviderTest.java
Thu Apr 26 07:22:17 2018
@@ -32,6 +32,18 @@ import org.junit.Test;
public class SimpleExcerptProviderTest {
@Test
+ public void caseInsensitiveTest() throws Exception {
+ // This will make the test fail:
+ // static {
+ // System.setProperty("oak.query.caseSensitiveHighlight", "true");
+ // }
+ assertEquals("<div><span><strong>fox</strong> is jumping and dancing
foxtrot</span></div>",
+ highlight(sb("fox is jumping and dancing foxtrot"),
of("Fox")));
+ assertEquals("<div><span>fox is <strong>jumping</strong></span></div>",
+ highlight(sb("fox is jumping"), of("jUmP*")));
+ }
+
+ @Test
public void simpleTest() throws Exception {
assertEquals("<div><span><strong>fox</strong> is jumping</span></div>",
highlight(sb("fox is jumping"), of("fox")));