Mercurial Hosting > luan
view src/goodjava/lucene/queryparser/NumberFieldParser.java @ 1831:8f9ae295bf6a default tip
add Hosted.authorize
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 26 Sep 2024 15:07:45 -0600 |
parents | c62324841dfb |
children |
line wrap: on
line source
package goodjava.lucene.queryparser; import org.apache.lucene.search.Query; import org.apache.lucene.search.NumericRangeQuery; import org.apache.lucene.search.SortField; import org.apache.lucene.search.PrefixQuery; import org.apache.lucene.search.TermQuery; import org.apache.lucene.index.Term; import org.apache.lucene.util.BytesRef; import goodjava.parser.ParseException; import org.apache.lucene.util.NumericUtils; public abstract class NumberFieldParser implements FieldParser { @Override public final Query getQuery(GoodQueryParser qp,String field,String query) throws ParseException { if( query.equals("*") ) return new PrefixQuery(new Term(field,"")); try { return getQuery(field,query); } catch(NumberFormatException e) { throw qp.exception(e); } } protected Query getQuery(String field,String query) { return getRangeQuery(field,query,query,true,true); } @Override public final Query getRangeQuery(GoodQueryParser qp,String field,String minQuery,String maxQuery,boolean includeMin,boolean includeMax) throws ParseException { try { return getRangeQuery(field,minQuery,maxQuery,includeMin,includeMax); } catch(NumberFormatException e) { throw qp.exception(e); } } abstract protected Query getRangeQuery(String field,String minQuery,String maxQuery,boolean includeMin,boolean includeMax); @Override public SortField getSortField(GoodQueryParser qp,String field,boolean reverse) { return new SortField( field, sortType(), reverse ); } abstract protected SortField.Type sortType(); public static final FieldParser INT = new NumberFieldParser() { @Override protected Query getQuery(String field,String query) { int n = Integer.valueOf(query); return new TermQuery( term(field,n) ); } @Override protected Query getRangeQuery(String field,String minQuery,String maxQuery,boolean includeMin,boolean includeMax) { Integer min = minQuery.equals("*") ? null : Integer.valueOf(minQuery); Integer max = maxQuery.equals("*") ? null : Integer.valueOf(maxQuery); return NumericRangeQuery.newIntRange(field,min,max,includeMin,includeMax); } @Override protected SortField.Type sortType() { return SortField.Type.INT; } }; public static final FieldParser LONG = new NumberFieldParser() { @Override protected Query getQuery(String field,String query) { long n = Long.valueOf(query); return new TermQuery( term(field,n) ); } @Override protected Query getRangeQuery(String field,String minQuery,String maxQuery,boolean includeMin,boolean includeMax) { Long min = minQuery.equals("*") ? null : Long.valueOf(minQuery); Long max = maxQuery.equals("*") ? null : Long.valueOf(maxQuery); return NumericRangeQuery.newLongRange(field,min,max,includeMin,includeMax); } @Override protected SortField.Type sortType() { return SortField.Type.LONG; } }; public static final FieldParser FLOAT = new NumberFieldParser() { @Override protected Query getRangeQuery(String field,String minQuery,String maxQuery,boolean includeMin,boolean includeMax) { Float min = minQuery.equals("*") ? null : Float.valueOf(minQuery); Float max = maxQuery.equals("*") ? null : Float.valueOf(maxQuery); return NumericRangeQuery.newFloatRange(field,min,max,includeMin,includeMax); } @Override protected SortField.Type sortType() { return SortField.Type.FLOAT; } }; public static final FieldParser DOUBLE = new NumberFieldParser() { @Override protected Query getRangeQuery(String field,String minQuery,String maxQuery,boolean includeMin,boolean includeMax) { Double min = minQuery.equals("*") ? null : Double.valueOf(minQuery); Double max = maxQuery.equals("*") ? null : Double.valueOf(maxQuery); return NumericRangeQuery.newDoubleRange(field,min,max,includeMin,includeMax); } @Override protected SortField.Type sortType() { return SortField.Type.DOUBLE; } }; public static Term term(String name,int value) { BytesRef br = new BytesRef(); NumericUtils.intToPrefixCoded(value,0,br); return new Term(name,br); } public static Term term(String name,long value) { BytesRef br = new BytesRef(); NumericUtils.longToPrefixCoded(value,0,br); return new Term(name,br); } }