Speaking for myself, only a small number of my code modules currently treat "null" as the open-ended range query term parameter. If the syntax change from 'null' --> '*' was deemed otherwise desirable and the syntax transition made very clearly, I could personally adjust to it without too much difficulty.
I agree that the proposed '*' syntax does seem more logical. If a change to that syntax were made such that the old "null" syntax for the upper bound was retained for backward compatibility, such a transition would be completely painless. Regards, Terry ----- Original Message ----- From: "Scott ganyo" <[EMAIL PROTECTED]> To: "Lucene Users List" <[EMAIL PROTECTED]> Sent: Thursday, June 10, 2004 8:57 PM Subject: Re: Open-ended range queries > Well, I do like the *, but apparently there are some people that are > using this with the null... > > Scott > > On Jun 10, 2004, at 7:15 PM, Erik Hatcher wrote: > > > On Jun 10, 2004, at 4:54 PM, Scott ganyo wrote: > >> It looks to me like Revision 1.18 broke it. > > > > It seems this could be it: > > > > revision 1.18 > > date: 2002/06/25 00:05:31; author: briangoetz; state: Exp; lines: > > +62 -33 > > Support for new range query syntax. The delimiter is " TO ", but is > > optional > > for backward compatibility with previous syntax. If the range > > arguments > > match the format supported by > > DateFormat.getDateInstance(DateFormat.SHORT), > > then they will be converted into the appropriate date strings a la > > DateField. > > > > Added Field.Keyword "constructor" for Date-valued arguments. > > > > Optimized DateField.timeToString function. > > > > > > But geez.... June 2002.... and no one has complained since? > > > > Given that this is so outdated, I'm not sure what the right course of > > action is. There are lots more Lucene users now than there were then. > > Would adding NULL back be what folks want? What about simply an > > asterisk to denote open ended-ness? [* TO term] or [term TO *] > > > > For completeness, here is the diff: > > > > % cvs diff -u -r 1.17 -r 1.18 QueryParser.jj > > Index: QueryParser.jj > > =================================================================== > > RCS file: > > /home/cvs/jakarta-lucene/src/java/org/apache/lucene/queryParser/ > > QueryParser.jj,v > > retrieving revision 1.17 > > retrieving revision 1.18 > > diff -u -r1.17 -r1.18 > > --- QueryParser.jj 20 May 2002 15:45:43 -0000 1.17 > > +++ QueryParser.jj 25 Jun 2002 00:05:31 -0000 1.18 > > @@ -65,8 +65,11 @@ > > > > import java.util.Vector; > > import java.io.*; > > +import java.text.*; > > +import java.util.*; > > import org.apache.lucene.index.Term; > > import org.apache.lucene.analysis.*; > > +import org.apache.lucene.document.*; > > import org.apache.lucene.search.*; > > > > /** > > @@ -218,35 +221,30 @@ > > > > private Query getRangeQuery(String field, > > Analyzer analyzer, > > - String queryText, > > + String part1, > > + String part2, > > boolean inclusive) > > { > > - // Use the analyzer to get all the tokens. There should be 1 or > > 2. > > - TokenStream source = analyzer.tokenStream(field, > > - new > > StringReader(queryText)); > > - Term[] terms = new Term[2]; > > - org.apache.lucene.analysis.Token t; > > + boolean isDate = false, isNumber = false; > > > > - for (int i = 0; i < 2; i++) > > - { > > - try > > - { > > - t = source.next(); > > - } > > - catch (IOException e) > > - { > > - t = null; > > - } > > - if (t != null) > > - { > > - String text = t.termText(); > > - if (!text.equalsIgnoreCase("NULL")) > > - { > > - terms[i] = new Term(field, text); > > - } > > - } > > + try { > > + DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); > > + df.setLenient(true); > > + Date d1 = df.parse(part1); > > + Date d2 = df.parse(part2); > > + part1 = DateField.dateToString(d1); > > + part2 = DateField.dateToString(d2); > > + isDate = true; > > } > > - return new RangeQuery(terms[0], terms[1], inclusive); > > + catch (Exception e) { } > > + > > + if (!isDate) { > > + // @@@ Add number support > > + } > > + > > + return new RangeQuery(new Term(field, part1), > > + new Term(field, part2), > > + inclusive); > > } > > > > public static void main(String[] args) throws Exception { > > @@ -282,7 +280,7 @@ > > | <#_WHITESPACE: ( " " | "\t" ) > > > } > > > > -<DEFAULT> SKIP : { > > +<DEFAULT, RangeIn, RangeEx> SKIP : { > > <<_WHITESPACE>> > > } > > > > @@ -303,14 +301,28 @@ > > | <PREFIXTERM: <_TERM_START_CHAR> (<_TERM_CHAR>)* "*" > > > | <WILDTERM: <_TERM_START_CHAR> > > (<_TERM_CHAR> | ( [ "*", "?" ] ))* > > > -| <RANGEIN: "[" ( ~[ "]" ] )+ "]"> > > -| <RANGEEX: "{" ( ~[ "}" ] )+ "}"> > > +| <RANGEIN_START: "[" > : RangeIn > > +| <RANGEEX_START: "{" > : RangeEx > > } > > > > <Boost> TOKEN : { > > <NUMBER: (<_NUM_CHAR>)+ ( "." (<_NUM_CHAR>)+ )? > : DEFAULT > > } > > > > +<RangeIn> TOKEN : { > > +<RANGEIN_TO: "TO"> > > +| <RANGEIN_END: "]"> : DEFAULT > > +| <RANGEIN_QUOTED: "\"" (~["\""])+ "\""> > > +| <RANGEIN_GOOP: (~[ " ", "]" ])+ > > > +} > > + > > +<RangeEx> TOKEN : { > > +<RANGEEX_TO: "TO"> > > +| <RANGEEX_END: "}"> : DEFAULT > > +| <RANGEEX_QUOTED: "\"" (~["\""])+ "\""> > > +| <RANGEEX_GOOP: (~[ " ", "}" ])+ > > > +} > > + > > // * Query ::= ( Clause )* > > // * Clause ::= ["+", "-"] [<TERM> ":"] ( <TERM> | "(" Query ")" ) > > > > @@ -387,7 +399,7 @@ > > > > > > Query Term(String field) : { > > - Token term, boost=null, slop=null; > > + Token term, boost=null, slop=null, goop1, goop2; > > boolean prefix = false; > > boolean wildcard = false; > > boolean fuzzy = false; > > @@ -415,12 +427,29 @@ > > else > > q = getFieldQuery(field, analyzer, term.image); > > } > > - | ( term=<RANGEIN> { rangein=true; } | term=<RANGEEX> ) > > + | ( <RANGEIN_START> ( > > goop1=<RANGEIN_GOOP>|goop1=<RANGEIN_QUOTED> ) > > + [ <RANGEIN_TO> ] ( > > goop2=<RANGEIN_GOOP>|goop2=<RANGEIN_QUOTED> ) > > + <RANGEIN_END> ) > > + [ <CARAT> boost=<NUMBER> ] > > + { > > + if (goop1.kind == RANGEIN_QUOTED) > > + goop1.image = goop1.image.substring(1, > > goop1.image.length()-1); > > + if (goop2.kind == RANGEIN_QUOTED) > > + goop2.image = goop2.image.substring(1, > > goop2.image.length()-1); > > + > > + q = getRangeQuery(field, analyzer, goop1.image, > > goop2.image, true); > > + } > > + | ( <RANGEEX_START> ( > > goop1=<RANGEEX_GOOP>|goop1=<RANGEEX_QUOTED> ) > > + [ <RANGEEX_TO> ] ( > > goop2=<RANGEEX_GOOP>|goop2=<RANGEEX_QUOTED> ) > > + <RANGEEX_END> ) > > [ <CARAT> boost=<NUMBER> ] > > { > > - q = getRangeQuery(field, analyzer, > > - term.image.substring(1, > > term.image.length()-1), > > - rangein); > > + if (goop1.kind == RANGEEX_QUOTED) > > + goop1.image = goop1.image.substring(1, > > goop1.image.length()-1); > > + if (goop2.kind == RANGEEX_QUOTED) > > + goop2.image = goop2.image.substring(1, > > goop2.image.length()-1); > > + > > + q = getRangeQuery(field, analyzer, goop1.image, > > goop2.image, false); > > } > > | term=<QUOTED> > > [ slop=<SLOP> ] > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]