From e53a1f29c1a1db04236890432d326351cd820ad5 Mon Sep 17 00:00:00 2001 From: Shalin Shekhar Mangar Date: Thu, 12 Mar 2009 06:24:13 +0000 Subject: [PATCH] SOLR-940 followup -- Changing API, implementation and javadocs per Hoss's suggestions git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/trunk@752785 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/solr/schema/FieldType.java | 28 ++++++++++------ .../org/apache/solr/schema/TrieField.java | 32 +++++++++---------- .../apache/solr/search/SolrQueryParser.java | 5 ++- 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/java/org/apache/solr/schema/FieldType.java b/src/java/org/apache/solr/schema/FieldType.java index 3a539bde9fc..d210d112add 100644 --- a/src/java/org/apache/solr/schema/FieldType.java +++ b/src/java/org/apache/solr/schema/FieldType.java @@ -427,20 +427,30 @@ public abstract class FieldType extends FieldProperties { } /** - * Returns a Query instance for doing range searches on this field type + * Returns a Query instance for doing range searches on this field type. {@link org.apache.solr.search.SolrQueryParser} + * currently passes part1 and part2 as null if they are '*' respectively. minInclusive and maxInclusive are both true + * currently by SolrQueryParser but that may change in the future. Also, other QueryParser implementations may have + * different semantics. + *

+ * Sub-classes should override this method to provide their own range query implementation. They should strive to + * handle nulls in part1 and/or part2 as well as unequal minInclusive and maxInclusive parameters gracefully. + * + * @param field the name of the field + * @param part1 the lower boundary of the range, nulls are allowed. + * @param part2 the upper boundary of the range, nulls are allowed + * @param minInclusive whether the minimum of the range is inclusive or not + * @param maxInclusive whether the maximum of the range is inclusive or not * - * @param field the name of the field - * @param part1 the lower boundary of the range - * @param part2 the upper boundary of the range - * @param inclusive whether the range is inclusive or not * @return a Query instance to perform range search according to given parameters + * + * @see org.apache.solr.search.SolrQueryParser#getRangeQuery(String, String, String, boolean) */ - public Query getRangeQuery(String field, String part1, String part2, boolean inclusive) { + public Query getRangeQuery(String field, String part1, String part2, boolean minInclusive, boolean maxInclusive) { RangeQuery rangeQuery = new RangeQuery( field, - "*".equals(part1) ? null : toInternal(part1), - "*".equals(part2) ? null : toInternal(part2), - inclusive, inclusive); + part1 == null ? null : toInternal(part1), + part2 == null ? null : toInternal(part2), + minInclusive, maxInclusive); rangeQuery.setConstantScoreRewrite(true); return rangeQuery; } diff --git a/src/java/org/apache/solr/schema/TrieField.java b/src/java/org/apache/solr/schema/TrieField.java index 4faea632c10..1c7c8aa78f9 100644 --- a/src/java/org/apache/solr/schema/TrieField.java +++ b/src/java/org/apache/solr/schema/TrieField.java @@ -148,38 +148,38 @@ public class TrieField extends FieldType { } @Override - public Query getRangeQuery(String field, String min, String max, boolean inclusive) { + public Query getRangeQuery(String field, String min, String max, boolean minInclusive, boolean maxInclusive) { Filter filter = null; switch (type) { case INTEGER: filter = new IntTrieRangeFilter(field, field, precisionStep, - "*".equals(min) ? null : Integer.parseInt(min), - "*".equals(max) ? null : Integer.parseInt(max), - inclusive, inclusive); + min == null ? null : Integer.parseInt(min), + max == null ? null : Integer.parseInt(max), + minInclusive, maxInclusive); break; case FLOAT: filter = new IntTrieRangeFilter(field, field, precisionStep, - "*".equals(min) ? null : TrieUtils.floatToSortableInt(Float.parseFloat(min)), - "*".equals(max) ? null : TrieUtils.floatToSortableInt(Float.parseFloat(max)), - inclusive, inclusive); + min == null ? null : TrieUtils.floatToSortableInt(Float.parseFloat(min)), + max == null ? null : TrieUtils.floatToSortableInt(Float.parseFloat(max)), + minInclusive, maxInclusive); break; case LONG: filter = new LongTrieRangeFilter(field, field, precisionStep, - "*".equals(min) ? null : Long.parseLong(min), - "*".equals(max) ? null : Long.parseLong(max), - inclusive, inclusive); + min == null ? null : Long.parseLong(min), + max == null ? null : Long.parseLong(max), + minInclusive, maxInclusive); break; case DOUBLE: filter = new LongTrieRangeFilter(field, field, precisionStep, - "*".equals(min) ? null : TrieUtils.doubleToSortableLong(Double.parseDouble(min)), - "*".equals(max) ? null : TrieUtils.doubleToSortableLong(Double.parseDouble(max)), - inclusive, inclusive); + min == null ? null : TrieUtils.doubleToSortableLong(Double.parseDouble(min)), + max == null ? null : TrieUtils.doubleToSortableLong(Double.parseDouble(max)), + minInclusive, maxInclusive); break; case DATE: filter = new LongTrieRangeFilter(field, field, precisionStep, - "*".equals(min) ? null : dateField.parseMath(null, min).getTime(), - "*".equals(max) ? null : dateField.parseMath(null, max).getTime(), - inclusive, inclusive); + min == null ? null : dateField.parseMath(null, min).getTime(), + max == null ? null : dateField.parseMath(null, max).getTime(), + minInclusive, maxInclusive); break; default: throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown type for trie field"); diff --git a/src/java/org/apache/solr/search/SolrQueryParser.java b/src/java/org/apache/solr/search/SolrQueryParser.java index 7036c6f7078..a287cd91845 100644 --- a/src/java/org/apache/solr/search/SolrQueryParser.java +++ b/src/java/org/apache/solr/search/SolrQueryParser.java @@ -119,7 +119,10 @@ public class SolrQueryParser extends QueryParser { protected Query getRangeQuery(String field, String part1, String part2, boolean inclusive) throws ParseException { checkNullField(field); FieldType ft = schema.getFieldType(field); - return ft.getRangeQuery(field, part1, part2, inclusive); + return ft.getRangeQuery(field, + "*".equals(part1) ? null : part1, + "*".equals(part2) ? null : part2, + inclusive, inclusive); } protected Query getPrefixQuery(String field, String termStr) throws ParseException {