summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2016-11-11 00:20:13 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2016-11-11 00:20:13 +0100
commitbf6109298a0e3895feaa287ac54673cb35981a5e (patch)
tree231686522b2e44ee02bcb42058b7a0bc53a2153b
parenta9ccefb94e13e6318ff77a9727c8ba0c6b5b00c5 (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.java7
-rw-r--r--container-search/src/test/java/com/yahoo/prelude/query/ItemsCommonStuffTestCase.java22
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());
+ }
}