diff options
4 files changed, 27 insertions, 2 deletions
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/RankingExpression.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/RankingExpression.java index 18f6c6f2ca2..1f27bc8750e 100755 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/RankingExpression.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/RankingExpression.java @@ -10,6 +10,7 @@ import com.yahoo.searchlib.rankingexpression.rule.ExpressionNode; import com.yahoo.searchlib.rankingexpression.rule.SerializationContext; import com.yahoo.tensor.TensorType; import com.yahoo.tensor.evaluation.TypeContext; +import com.yahoo.text.Text; import java.io.File; import java.io.FileNotFoundException; @@ -115,7 +116,7 @@ public class RankingExpression implements Serializable { root = parse(new StringReader(expression)); } catch (ParseException e) { - ParseException p = new ParseException("Could not parse '" + expression + "'"); + ParseException p = new ParseException("Could not parse '" + Text.truncate(expression, 50) + "'"); p.initCause(e); throw p; } diff --git a/vespajlib/abi-spec.json b/vespajlib/abi-spec.json index b8b6716d879..04f859e2802 100644 --- a/vespajlib/abi-spec.json +++ b/vespajlib/abi-spec.json @@ -3022,7 +3022,8 @@ "public static boolean isTextCharacter(int)", "public static java.util.OptionalInt validateTextString(java.lang.String)", "public static boolean isDisplayable(int)", - "public static java.lang.String stripInvalidCharacters(java.lang.String)" + "public static java.lang.String stripInvalidCharacters(java.lang.String)", + "public static java.lang.String truncate(java.lang.String, int)" ], "fields": [] }, diff --git a/vespajlib/src/main/java/com/yahoo/text/Text.java b/vespajlib/src/main/java/com/yahoo/text/Text.java index 706fd1583a3..85b28639d89 100644 --- a/vespajlib/src/main/java/com/yahoo/text/Text.java +++ b/vespajlib/src/main/java/com/yahoo/text/Text.java @@ -174,4 +174,16 @@ public final class Text { return stripped != null ? stripped.toString() : string; } + /** + * Returns a string which is never larger than the given number of characters. + * If the string is longer than the given length it will be truncated. + * If length is 4 or less the string will be truncated to length. + * If length is longer than 4, it will be truncated at length-4 with " ..." added at the end. + */ + public static String truncate(String s, int length) { + if (s.length() <= length) return s; + if (length <= 4) return s.substring(0, length); + return s.substring(0, length - 4) + " ..."; + } + } diff --git a/vespajlib/src/test/java/com/yahoo/text/TextTestCase.java b/vespajlib/src/test/java/com/yahoo/text/TextTestCase.java index e733b838c39..8bb8b2aaad5 100644 --- a/vespajlib/src/test/java/com/yahoo/text/TextTestCase.java +++ b/vespajlib/src/test/java/com/yahoo/text/TextTestCase.java @@ -61,4 +61,15 @@ public class TextTestCase { assertFalse(Text.isDisplayable(0)); } + @Test + public void testTruncate() { + assertEquals("ab", Text.truncate("ab", 5)); + assertEquals("ab", Text.truncate("ab", 6)); + assertEquals("ab", Text.truncate("ab", 2)); + assertEquals("a", Text.truncate("ab", 1)); + assertEquals("", Text.truncate("ab", 0)); + assertEquals("ab c", Text.truncate("ab cde", 4)); + assertEquals("a ...", Text.truncate("ab cde", 5)); + } + } |