diff --git a/src/java/org/apache/lucene/queryParser/QueryParser.java b/src/java/org/apache/lucene/queryParser/QueryParser.java index 3510596f495..2d8a7643ec6 100644 --- a/src/java/org/apache/lucene/queryParser/QueryParser.java +++ b/src/java/org/apache/lucene/queryParser/QueryParser.java @@ -73,9 +73,12 @@ public class QueryParser implements QueryParserConstants { Analyzer analyzer; String field; int phraseSlop = 0; + Locale locale; /** 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 field the default field for query terms. * @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. * @param f the default field for query terms. * @param a used to find terms in the query text. */ 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(""))); analyzer = a; field = f; + this.locale = locale; } /** Parses a query string, returning a @@ -243,23 +274,16 @@ public class QueryParser implements QueryParserConstants { String part2, boolean inclusive) throws ParseException { - boolean isDate = false; - try { - DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); + DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); df.setLenient(true); Date d1 = df.parse(part1); Date d2 = df.parse(part2); part1 = DateField.dateToString(d1); part2 = DateField.dateToString(d2); - isDate = true; } catch (Exception e) { } - if (!isDate) { - // @@@ Add number support - } - return new RangeQuery(new Term(field, part1), new Term(field, part2), inclusive); diff --git a/src/java/org/apache/lucene/queryParser/QueryParser.jj b/src/java/org/apache/lucene/queryParser/QueryParser.jj index caf55b72ea6..1931da96443 100644 --- a/src/java/org/apache/lucene/queryParser/QueryParser.jj +++ b/src/java/org/apache/lucene/queryParser/QueryParser.jj @@ -135,9 +135,12 @@ public class QueryParser { Analyzer analyzer; String field; int phraseSlop = 0; + Locale locale; /** 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 field the default field for query terms. * @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. * @param f the default field for query terms. * @param a used to find terms in the query text. */ 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(""))); analyzer = a; field = f; + this.locale = locale; } /** Parses a query string, returning a @@ -305,23 +336,16 @@ public class QueryParser { String part2, boolean inclusive) throws ParseException { - boolean isDate = false; - try { - DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); + DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); df.setLenient(true); Date d1 = df.parse(part1); Date d2 = df.parse(part2); part1 = DateField.dateToString(d1); part2 = DateField.dateToString(d2); - isDate = true; } catch (Exception e) { } - if (!isDate) { - // @@@ Add number support - } - return new RangeQuery(new Term(field, part1), new Term(field, part2), inclusive);