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


Reply via email to