diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2016-11-11 00:20:13 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2016-11-11 00:20:13 +0100 |
commit | bf6109298a0e3895feaa287ac54673cb35981a5e (patch) | |
tree | 231686522b2e44ee02bcb42058b7a0bc53a2153b | |
parent | a9ccefb94e13e6318ff77a9727c8ba0c6b5b00c5 (diff) |
Verify the regex pattern upon construction, so the query will fail with message to user, instead of corong the backends.
-rw-r--r-- | container-search/src/main/java/com/yahoo/prelude/query/RegExpItem.java | 7 | ||||
-rw-r--r-- | container-search/src/test/java/com/yahoo/prelude/query/ItemsCommonStuffTestCase.java | 22 |
2 files changed, 28 insertions, 1 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/RegExpItem.java b/container-search/src/main/java/com/yahoo/prelude/query/RegExpItem.java index 5a611a8a927..0320c250cbc 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/RegExpItem.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/RegExpItem.java @@ -2,6 +2,7 @@ package com.yahoo.prelude.query; import java.nio.ByteBuffer; +import java.util.regex.Pattern; /** * Match a field with the contained regular expression. @@ -10,10 +11,11 @@ import java.nio.ByteBuffer; */ public class RegExpItem extends TermItem { private String expression; + private Pattern regexp; public RegExpItem(String indexName, boolean isFromQuery, String expression) { super(indexName, isFromQuery, null); - this.expression = expression; + setValue(expression); } @Override @@ -33,6 +35,7 @@ public class RegExpItem extends TermItem { @Override public void setValue(String expression) { + regexp = Pattern.compile(expression); this.expression = expression; } @@ -103,4 +106,6 @@ public class RegExpItem extends TermItem { return true; } + public Pattern getRegexp() { return regexp; } + } diff --git a/container-search/src/test/java/com/yahoo/prelude/query/ItemsCommonStuffTestCase.java b/container-search/src/test/java/com/yahoo/prelude/query/ItemsCommonStuffTestCase.java index c1b18a8ae31..f77341033fb 100644 --- a/container-search/src/test/java/com/yahoo/prelude/query/ItemsCommonStuffTestCase.java +++ b/container-search/src/test/java/com/yahoo/prelude/query/ItemsCommonStuffTestCase.java @@ -7,6 +7,7 @@ import java.nio.ByteBuffer; import java.util.Arrays; import java.util.ListIterator; import java.util.NoSuchElementException; +import java.util.regex.PatternSyntaxException; import org.junit.After; import org.junit.Before; @@ -394,5 +395,26 @@ public class ItemsCommonStuffTestCase { assertFalse(TermType.AND.hashCode() == TermType.PHRASE.hashCode()); assertEquals("term type 'not'", TermType.NOT.toString()); } + + @Test + public final void testRegexp() { + RegExpItem empty = new RegExpItem("a", true, ""); + assertTrue(empty.isFromQuery()); + assertTrue(empty.isStemmed()); + assertEquals("a", empty.getIndexName()); + assertEquals("", empty.getIndexedString()); + assertEquals(1, empty.getNumWords()); + assertEquals(ItemType.REGEXP, empty.getItemType()); + + assertEquals("a", new RegExpItem("i", true, "a").getIndexedString()); + assertEquals(".*", new RegExpItem("i", true, ".*").getIndexedString()); + PatternSyntaxException last = null; + try { + assertEquals(0, new RegExpItem("i", true, "*").getNumWords()); + } catch (PatternSyntaxException e) { + last = e; + } + assertEquals("Dangling meta character '*' near index 0\n" + "*\n" + "^", last.getMessage()); + } } |