Add locale option to QueryParser, allowing date range to be dealt with a bit more flexibly.

git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@150077 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Erik Hatcher 2003-10-03 03:12:42 +00:00
parent 399ec233ff
commit c3bae8805b
2 changed files with 64 additions and 16 deletions

View File

@ -73,9 +73,12 @@ public class QueryParser implements QueryParserConstants {
Analyzer analyzer; Analyzer analyzer;
String field; String field;
int phraseSlop = 0; int phraseSlop = 0;
Locale locale;
/** Parses a query string, returning a {@link org.apache.lucene.search.Query}. /** Parses a query string, returning a {@link org.apache.lucene.search.Query}.
* Default locale is used for date range parsing.
* Use {@link #parse(String, String, Analyzer, Locale)} for non-default locale handling.
* @param query the query string to be parsed. * @param query the query string to be parsed.
* @param field the default field for query terms. * @param field the default field for query terms.
* @param analyzer used to find terms in the query text. * @param analyzer used to find terms in the query text.
@ -92,14 +95,42 @@ public class QueryParser implements QueryParserConstants {
} }
} }
/** Parses a query string, returning a {@link org.apache.lucene.search.Query}.
* @param query the query string to be parsed.
* @param field the default field for query terms.
* @param analyzer used to find terms in the query text.
* @param locale locale to use for date range parsing
* @throws ParseException if the parsing fails
*/
static public Query parse(String query, String field, Analyzer analyzer, Locale locale)
throws ParseException {
try {
QueryParser parser = new QueryParser(field, analyzer, locale);
return parser.parse(query);
}
catch (TokenMgrError tme) {
throw new ParseException(tme.getMessage());
}
}
/** Constructs a query parser. /** Constructs a query parser.
* @param f the default field for query terms. * @param f the default field for query terms.
* @param a used to find terms in the query text. * @param a used to find terms in the query text.
*/ */
public QueryParser(String f, Analyzer a) { public QueryParser(String f, Analyzer a) {
this(f, a, Locale.getDefault());
}
/** Constructs a query parser.
* @param f the default field for query terms.
* @param a used to find terms in the query text.
* @param locale
*/
public QueryParser(String f, Analyzer a, Locale locale) {
this(new FastCharStream(new StringReader(""))); this(new FastCharStream(new StringReader("")));
analyzer = a; analyzer = a;
field = f; field = f;
this.locale = locale;
} }
/** Parses a query string, returning a /** Parses a query string, returning a
@ -243,23 +274,16 @@ public class QueryParser implements QueryParserConstants {
String part2, String part2,
boolean inclusive) throws ParseException boolean inclusive) throws ParseException
{ {
boolean isDate = false;
try { try {
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
df.setLenient(true); df.setLenient(true);
Date d1 = df.parse(part1); Date d1 = df.parse(part1);
Date d2 = df.parse(part2); Date d2 = df.parse(part2);
part1 = DateField.dateToString(d1); part1 = DateField.dateToString(d1);
part2 = DateField.dateToString(d2); part2 = DateField.dateToString(d2);
isDate = true;
} }
catch (Exception e) { } catch (Exception e) { }
if (!isDate) {
// @@@ Add number support
}
return new RangeQuery(new Term(field, part1), return new RangeQuery(new Term(field, part1),
new Term(field, part2), new Term(field, part2),
inclusive); inclusive);

View File

@ -135,9 +135,12 @@ public class QueryParser {
Analyzer analyzer; Analyzer analyzer;
String field; String field;
int phraseSlop = 0; int phraseSlop = 0;
Locale locale;
/** Parses a query string, returning a {@link org.apache.lucene.search.Query}. /** Parses a query string, returning a {@link org.apache.lucene.search.Query}.
* Default locale is used for date range parsing.
* Use {@link #parse(String, String, Analyzer, Locale)} for non-default locale handling.
* @param query the query string to be parsed. * @param query the query string to be parsed.
* @param field the default field for query terms. * @param field the default field for query terms.
* @param analyzer used to find terms in the query text. * @param analyzer used to find terms in the query text.
@ -154,14 +157,42 @@ public class QueryParser {
} }
} }
/** Parses a query string, returning a {@link org.apache.lucene.search.Query}.
* @param query the query string to be parsed.
* @param field the default field for query terms.
* @param analyzer used to find terms in the query text.
* @param locale locale to use for date range parsing
* @throws ParseException if the parsing fails
*/
static public Query parse(String query, String field, Analyzer analyzer, Locale locale)
throws ParseException {
try {
QueryParser parser = new QueryParser(field, analyzer, locale);
return parser.parse(query);
}
catch (TokenMgrError tme) {
throw new ParseException(tme.getMessage());
}
}
/** Constructs a query parser. /** Constructs a query parser.
* @param f the default field for query terms. * @param f the default field for query terms.
* @param a used to find terms in the query text. * @param a used to find terms in the query text.
*/ */
public QueryParser(String f, Analyzer a) { public QueryParser(String f, Analyzer a) {
this(f, a, Locale.getDefault());
}
/** Constructs a query parser.
* @param f the default field for query terms.
* @param a used to find terms in the query text.
* @param locale
*/
public QueryParser(String f, Analyzer a, Locale locale) {
this(new FastCharStream(new StringReader(""))); this(new FastCharStream(new StringReader("")));
analyzer = a; analyzer = a;
field = f; field = f;
this.locale = locale;
} }
/** Parses a query string, returning a /** Parses a query string, returning a
@ -305,23 +336,16 @@ public class QueryParser {
String part2, String part2,
boolean inclusive) throws ParseException boolean inclusive) throws ParseException
{ {
boolean isDate = false;
try { try {
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
df.setLenient(true); df.setLenient(true);
Date d1 = df.parse(part1); Date d1 = df.parse(part1);
Date d2 = df.parse(part2); Date d2 = df.parse(part2);
part1 = DateField.dateToString(d1); part1 = DateField.dateToString(d1);
part2 = DateField.dateToString(d2); part2 = DateField.dateToString(d2);
isDate = true;
} }
catch (Exception e) { } catch (Exception e) { }
if (!isDate) {
// @@@ Add number support
}
return new RangeQuery(new Term(field, part1), return new RangeQuery(new Term(field, part1),
new Term(field, part2), new Term(field, part2),
inclusive); inclusive);