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