diff --git a/src/main/java/com/github/rnewson/couchdb/lucene/couchdb/FieldType.java b/src/main/java/com/github/rnewson/couchdb/lucene/couchdb/FieldType.java index 457e3a6c..714a46e2 100644 --- a/src/main/java/com/github/rnewson/couchdb/lucene/couchdb/FieldType.java +++ b/src/main/java/com/github/rnewson/couchdb/lucene/couchdb/FieldType.java @@ -30,8 +30,6 @@ public enum FieldType { DATE(8, SortField.LONG) { - private final String[] patterns = new String[] { "yyyy-MM-dd'T'HH:mm:ssZZ", "yyyy-MM-dd'T'HH:mm:ss", "yyyy-MM-ddZZ", - "yyyy-MM-dd" }; @Override public NumericField toField(final String name, final String value, final ViewSettings settings) throws ParseException { @@ -44,13 +42,6 @@ public Query toRangeQuery(final String name, final String lower, final String up return NumericRangeQuery.newLongRange(name, precisionStep, toDate(lower), toDate(upper), inclusive, inclusive); } - private long toDate(final String str) throws ParseException { - try { - return DateUtils.parseDate(str.toUpperCase(), patterns).getTime(); - } catch (final java.text.ParseException e) { - throw new ParseException(e.getMessage()); - } - } }, DOUBLE(8, SortField.DOUBLE) { @Override @@ -133,6 +124,9 @@ private static NumericField field(final String name, final int precisionStep, fi return new NumericField(name, precisionStep, settings.getStore(), settings.getIndex().isIndexed()); } + public static final String[] DATE_PATTERNS = new String[] { "yyyy-MM-dd'T'HH:mm:ssZZ", "yyyy-MM-dd'T'HH:mm:ss", "yyyy-MM-ddZZ", + "yyyy-MM-dd" }; + private final int sortField; protected final int precisionStep; @@ -151,4 +145,12 @@ public final int toSortField() { return sortField; } + public static long toDate(final String str) throws ParseException { + try { + return DateUtils.parseDate(str.toUpperCase(), DATE_PATTERNS).getTime(); + } catch (final java.text.ParseException e) { + throw new ParseException(e.getMessage()); + } + } + } diff --git a/src/test/java/com/github/rnewson/couchdb/lucene/CustomQueryParserTest.java b/src/test/java/com/github/rnewson/couchdb/lucene/CustomQueryParserTest.java index 4db544cd..c5989361 100644 --- a/src/test/java/com/github/rnewson/couchdb/lucene/CustomQueryParserTest.java +++ b/src/test/java/com/github/rnewson/couchdb/lucene/CustomQueryParserTest.java @@ -4,12 +4,15 @@ import static org.junit.Assert.assertThat; import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.search.NumericRangeQuery; import org.apache.lucene.search.Query; import org.apache.lucene.util.Version; import org.junit.Before; import org.junit.Test; +import com.github.rnewson.couchdb.lucene.couchdb.FieldType; + public class CustomQueryParserTest { private CustomQueryParser parser; @@ -46,25 +49,29 @@ public void doubleRangeQuery() throws Exception { @Test public void dateRangeQuery() throws Exception { final Query q = parser.parse("blah:[2000-01-01 TO 2010-02-04]"); - assertRange(q, Long.class, 946684800000L, 1265241600000L); + assertRange(q, Long.class, time("2000-01-01"), time("2010-02-04")); } @Test public void dateTimeRangeQuery() throws Exception { final Query q = parser.parse("blah:[2000-01-01T00:00:01 TO 2010-02-04T00:00:01]"); - assertRange(q, Long.class, 946684801000L, 1265241601000L); + assertRange(q, Long.class, time("2000-01-01T00:00:01"), time("2010-02-04T00:00:01")); } @Test public void dateTimeZoneRangeQuery() throws Exception { final Query q = parser.parse("blah:[2000-01-01-0100 TO 2010-02-04-0100]"); - assertRange(q, Long.class, 946688400000L, 1265245200000L); + assertRange(q, Long.class, time("2000-01-01-0100"), time("2010-02-04-0100")); } @Test public void dateTimeTimeZoneRangeQuery() throws Exception { final Query q = parser.parse("blah:[2000-01-01T00:00:00-0100 TO 2010-02-04T00:00:00-0100]"); - assertRange(q, Long.class, 946688400000L, 1265245200000L); + assertRange(q, Long.class, time("2000-01-01T00:00:00-0100"), time("2010-02-04T00:00:00-0100")); + } + + private long time(final String str) throws ParseException { + return FieldType.toDate(str); } private void assertRange(final Query q, final Class type, final Number min, final Number max) {