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 th...@apache.org on 2018/04/26 07:22:17 UTC

svn commit: r1830160 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/query/SimpleExcerptProvider.java test/java/org/apache/jackrabbit/oak/query/SimpleExcerptProviderTest.java

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