WebJETQueryParser.java

package sk.iway.iwcm.system.fulltext.lucene;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.util.NumericUtils;
import org.apache.lucene.util.Version;

import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;

/**
 *  WebJETQueryParser.java - query parser, ktory pozna Numeric fieldy
 *
 *@Title        webjet7
 *@Company      Interway s.r.o. (www.interway.sk)
 *@Copyright    Interway s.r.o. (c) 2001-2013
 *@author       $Author: jeeff jeeff $
 *@version      $Revision: 1.3 $
 *@created      Date: 3.7.2013 15:20:13
 *@modified     $Date: 2004/08/16 06:26:11 $
 */
public class WebJETQueryParser extends QueryParser
{
	private static String numericFields[] = {"author_id", "group_id", "temp_id", "sort_priority", "password_protected", "root_group_l1", "root_group_l2", "root_group_l3"};

	private boolean isNumericField(String name)
	{
		for (String field : numericFields)
		{
			if (field.equals(name)) return true;
		}
		return false;
	}

	public WebJETQueryParser(Version matchVersion, String f, Analyzer a)
	{
		super(matchVersion, f, a);
	}

	@Override
	public org.apache.lucene.search.Query getRangeQuery(String field, String part1, String part2, boolean inclusive) throws ParseException
	{
		Logger.debug(WebJETQueryParser.class, "Range query");
		TermRangeQuery query = (TermRangeQuery)super.getRangeQuery(field, part1, part2, inclusive);

		if (isNumericField(field))
		{
			Logger.debug(WebJETQueryParser.class, "Range query - numeric, name="+field+" low="+query.getLowerTerm()+" up="+query.getUpperTerm());
			return NumericRangeQuery.newIntRange(field, Tools.getIntValue(query.getLowerTerm(), 0), Tools.getIntValue(query.getUpperTerm(), 0), query.includesLower(), query.includesUpper());
		}
		return query;
	}

	@Override
	protected org.apache.lucene.search.Query getFieldQuery(String field, String queryText, boolean quoted) throws ParseException
	{
		org.apache.lucene.search.Query superQuery = super.getFieldQuery(field, queryText, quoted);

		if (isNumericField(field))
		{
			Logger.debug(WebJETQueryParser.class, "Som numeric field: "+field+" text="+queryText);
			superQuery = new TermQuery(new org.apache.lucene.index.Term(field, NumericUtils.intToPrefixCoded(Tools.getIntValue(queryText, 0))));
		}

		return superQuery;
	}

}