/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.xcmis.search.lucene.search;
import java.io.IOException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermEnum;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.MultiTermQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TermRangeQuery;
import org.xcmis.spi.utils.Logger;
/**
* Created by The eXo Platform SAS.
*
* @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
* @version $Id: CaseInsensitiveRangeQuery.java 2 2010-02-04 17:21:49Z andrew00x $
*/
public class CaseInsensitiveRangeQuery extends TermRangeQuery
{
/** The serialVersionUID. */
private static final long serialVersionUID = 3351256558561558491L;
/**
* Class logger.
*/
private final static Logger log = Logger.getLogger(CaseInsensitiveRangeQuery.class);
private static String LOWER_TERM;
private static String UPPER_TERM;
private static String FIELD;
private static boolean IS_LOWER_INCLUSIVE;
private static boolean IS_UPPER_INCLUSIVE;
public CaseInsensitiveRangeQuery(String field, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper)
{
super(field, lowerTerm, upperTerm, includeLower, includeUpper, null);
FIELD = field;
LOWER_TERM = lowerTerm;
UPPER_TERM = upperTerm;
IS_LOWER_INCLUSIVE = includeLower;
IS_UPPER_INCLUSIVE = includeUpper;
setRewriteMethod(CASE_IN_SENSITIVE_FILTER_REWRITE);
}
// public CaseInsensitiveRangeQuery(Term lowerTerm, Term upperTerm, boolean inclusive)
// {
// super(
// (lowerTerm == null) ? modifyUpperTerm(upperTerm).field() : modifyLowerTerm(lowerTerm).field(),
// (lowerTerm == null) ? null : modifyLowerTerm(lowerTerm).text(),
// (upperTerm == null) ? null : modifyUpperTerm(upperTerm).text(),
// inclusive, inclusive, null
// );
// LOWER_TERM = lowerTerm;
// UPPER_TERM = upperTerm;
// setRewriteMethod(CASE_IN_SENSITIVE_FILTER_REWRITE);
// }
public static final RewriteMethod CASE_IN_SENSITIVE_FILTER_REWRITE = new RewriteMethod() {
private static final long serialVersionUID = 1L;
@Override
public Query rewrite(IndexReader reader, MultiTermQuery multiTermQuery) throws IOException
{
BooleanQuery query = new BooleanQuery(true);
TermEnum enumerator = reader.terms(new Term(FIELD, LOWER_TERM));
try
{
do
{
Term term = enumerator.term();
if (term != null && term.field().equals(FIELD))
{ // interned comparison
String termText = term.text().toLowerCase();
int lowerCompareResult = termText.compareTo(LOWER_TERM);
// test lower limit and left border
if (lowerCompareResult > 0 || (IS_LOWER_INCLUSIVE && lowerCompareResult == 0))
{
if (UPPER_TERM != null)
{
// test upper limit of original term
if (new Term(FIELD, UPPER_TERM).text().compareTo(term.text()) < 0)
{
break;
}
int upperCompareResult = new Term(FIELD, UPPER_TERM).text().compareTo(termText);
// test ignore case limit.
if (upperCompareResult < 0 || !IS_UPPER_INCLUSIVE && upperCompareResult == 0)
{
continue;
}
}
TermQuery tq = new TermQuery(term); // found a match
tq.setBoost(multiTermQuery.getBoost()); // set the boost
query.add(tq, BooleanClause.Occur.SHOULD); // add to query
}
}
else
{
break;
}
}
while (enumerator.next());
}
finally
{
enumerator.close();
}
if (log.isDebugEnabled())
{
log.debug(query.toString());
}
return query;
}
};
}