Author: catholicon
Date: Thu Jan 18 15:49:24 2018
New Revision: 1821516

URL: http://svn.apache.org/viewvc?rev=1821516&view=rev
Log:
OAK-4401: Excerpt Highlighting for a property is not correct

Further discussion on the issue implied that we should also do better
with symbols. So, now, we would be delimiting on any non-letter or
non-character as implied by java.lang.Character

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=1821516&r1=1821515&r2=1821516&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 Jan 18 15:49:24 2018
@@ -19,7 +19,6 @@ package org.apache.jackrabbit.oak.query;
 import java.util.BitSet;
 import java.util.HashSet;
 import java.util.Set;
-import java.util.regex.Pattern;
 
 import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableSet;
@@ -35,7 +34,7 @@ import org.apache.jackrabbit.oak.query.a
 import org.apache.jackrabbit.oak.query.ast.OrImpl;
 import org.apache.jackrabbit.oak.plugins.memory.PropertyValues;
 
-import static java.lang.Character.isWhitespace;
+import static java.lang.Character.isLetterOrDigit;
 import static org.apache.jackrabbit.util.Text.encodeIllegalXMLCharacters;
 
 /**
@@ -243,7 +242,7 @@ class SimpleExcerptProvider {
             if (isLike) {
                 int nextSpace = endIndex;
 
-                while (nextSpace < text.length() && 
!isWhitespace(text.charAt(nextSpace))) {
+                while (nextSpace < text.length() && 
!isDelimeter(text.codePointAt(nextSpace))) {
                     nextSpace++;
                 }
 
@@ -255,9 +254,9 @@ class SimpleExcerptProvider {
             }
 
             boolean isStartOk = (index == 0) || //allow for highlighting for 
token at the beginning
-                    isWhitespace(text.charAt(index-1)); //else token must 
follow a space
+                    isDelimeter(text.codePointAt(index - 1)); //else token 
must follow a delimeter
             boolean isEndOk = (endIndex == text.length()) || //token is at the 
end of string
-                    isWhitespace(text.charAt(endIndex)); //else token must 
precede a space
+                    isDelimeter(text.codePointAt(endIndex)); //else token must 
precede a delimeter
 
             if (isStartOk && isEndOk) {
                 while (index < endIndex) {
@@ -269,6 +268,10 @@ class SimpleExcerptProvider {
         }
     }
 
+    static boolean isDelimeter(int codePoint) {
+        return !isLetterOrDigit(codePoint);
+    }
+
     static PropertyValue getExcerpt(PropertyValue value) {
         Splitter listSplitter = 
Splitter.on(',').trimResults().omitEmptyStrings();
         StringBuilder excerpt = new StringBuilder(EXCERPT_BEGIN);

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=1821516&r1=1821515&r2=1821516&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 Jan 18 15:49:24 2018
@@ -63,7 +63,8 @@ public class SimpleExcerptProviderTest {
 
     @Test
     public void hightlightCompleteWordOnly() {
-        String[] whitespaces = new String[] {" ", "\t"};
+        // using 2 non-simple spaces as mentioned in 
http://jkorpela.fi/chars/spaces.html
+        String[] delimiters = new String[] {" ", "\t", "\n", ":", "\u1680", 
"\u00A0"};
         Map<String, String> simpleCheck = Maps.newHashMap(); // highlight "of"
 
         // simple ones
@@ -77,12 +78,10 @@ public class SimpleExcerptProviderTest {
                 "<div><span>well this is <strong>of</strong></span></div>");
 
         for (Map.Entry<String, String> simple : simpleCheck.entrySet()) {
-            String text = simple.getKey();
-            String expect = simple.getValue();
-            for (String whitespace : whitespaces) {
-                text = text.replaceAll(" ", whitespace);
-                expect = expect.replaceAll(" ", whitespace);
-                assertEquals("highlighting '" + text + "' for 'of' (whitespace 
- '" + whitespace + "')",
+            for (String delimiter : delimiters) {
+                String text = simple.getKey().replaceAll(" ", delimiter);
+                String expect = simple.getValue().replaceAll(" ", delimiter);
+                assertEquals("highlighting '" + text + "' for 'of' (delimiter 
- '" + delimiter + "')",
                         expect, highlight(sb(text), of("of")));
             }
         }
@@ -96,17 +95,27 @@ public class SimpleExcerptProviderTest {
                 "<div><span>big <strong>office</strong> room</span></div>");
 
         for (Map.Entry<String, String> wildcard : wildcardCheck.entrySet()) {
-            String text = wildcard.getKey();
-            String expect = wildcard.getValue();
-            for (String whitespace : whitespaces) {
-                text = text.replaceAll(" ", whitespace);
-                expect = expect.replaceAll(" ", whitespace);
-                assertEquals("highlighting '" + text + "' for 'of*' 
(whitespace - '" + whitespace + "')",
+            for (String delimiter : delimiters) {
+                String text = wildcard.getKey().replaceAll(" ", delimiter);
+                String expect = wildcard.getValue().replaceAll(" ", delimiter);
+                assertEquals("highlighting '" + text + "' for 'of*' (delimiter 
- '" + delimiter + "')",
                         expect, highlight(sb(text), of("of*")));
             }
         }
     }
 
+    @Test
+    public void multipleSearchTokens() {
+        String text = "To be, or not to be. That is the question!";
+        String expected = "<div><span>To <strong>be</strong>, " +
+                "or not to <strong>be</strong>. " +
+                "That is the <strong>question</strong>!</span></div>";
+
+        assertEquals(expected, highlight(sb(text), of("question", "be")));
+        assertEquals(expected, highlight(sb(text), of("quest*", "be")));
+        assertEquals(expected, highlight(sb(text), of("quest*", "b*")));
+    }
+
     private static String randomString(Random r, String set) {
         int len = r.nextInt(10);
         StringBuilder buff = new StringBuilder();


Reply via email to