view src/goodjava/lucene/queryparser/NumberFieldParser.java @ 1776:da85925fea9c

listen ipv6
author Vadim Filimonov <fffilimonov@yandex.ru>
date Fri, 28 Jul 2023 11:53:03 +0300
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);
	}

}