/*
* Copyright (c) www.bugull.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.tooan.ynpay.third.mongodb.lucene;
import net.tooan.ynpay.third.jfinal.log.Logger;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.queryParser.QueryParser.Operator;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import java.sql.Timestamp;
import java.util.Date;
/**
* The utility class for creating lucene query.
*
* @author Frank Wen(xbwen@hotmail.com)
*/
public final class BuguParser {
private final static Logger logger = Logger.getLogger(BuguParser.class);
/**
* Create a term query.
* <p>Note: in fact, it does not parse. It just create a term query.</p>
*
* @param field
* @param value
* @return
*/
public static Query parseTerm(String field, String value) {
Term t = new Term(field, value);
return new TermQuery(t);
}
public static Query parse(String field, String value) {
return parse(field, value, Operator.OR);
}
public static Query parse(String field, String value, Operator op) {
QueryParser parser = new QueryParser(BuguIndex.getInstance().getVersion(), field, BuguIndex.getInstance().getAnalyzer());
parser.setDefaultOperator(op);
return parse(parser, value);
}
public static Query parse(String[] fields, String value) {
return parse(fields, value, Operator.OR);
}
public static Query parse(String[] fields, String value, Operator op) {
QueryParser parser = new MultiFieldQueryParser(BuguIndex.getInstance().getVersion(), fields, BuguIndex.getInstance().getAnalyzer());
parser.setDefaultOperator(op);
return parse(parser, value);
}
public static Query parse(String[] fields, Occur[] occurs, String value) {
Query query = null;
try {
query = MultiFieldQueryParser.parse(BuguIndex.getInstance().getVersion(), value, fields, occurs, BuguIndex.getInstance().getAnalyzer());
} catch (ParseException ex) {
logger.error("MultiFieldQueryParser can not parse the value " + value, ex);
}
return query;
}
private static Query parse(QueryParser parser, String value) {
Query query = null;
try {
query = parser.parse(value);
} catch (ParseException ex) {
logger.error("Can not parse the value " + value, ex);
}
return query;
}
public static Query parse(String field, int value) {
return NumericRangeQuery.newIntRange(field, value, value, true, true);
}
public static Query parse(String field, int minValue, int maxValue) {
return NumericRangeQuery.newIntRange(field, minValue, maxValue, true, true);
}
public static Query parse(String field, long value) {
return NumericRangeQuery.newLongRange(field, value, value, true, true);
}
public static Query parse(String field, long minValue, long maxValue) {
return NumericRangeQuery.newLongRange(field, minValue, maxValue, true, true);
}
public static Query parse(String field, float value) {
return NumericRangeQuery.newFloatRange(field, value, value, true, true);
}
public static Query parse(String field, float minValue, float maxValue) {
return NumericRangeQuery.newFloatRange(field, minValue, maxValue, true, true);
}
public static Query parse(String field, double value) {
return NumericRangeQuery.newDoubleRange(field, value, value, true, true);
}
public static Query parse(String field, double minValue, double maxValue) {
return NumericRangeQuery.newDoubleRange(field, minValue, maxValue, true, true);
}
/**
* Date value is converted to long value, same as it's field type in index file.
*
* @param field
* @param begin
* @param end
* @return
*/
public static Query parse(String field, Date begin, Date end) {
long beginTime = begin.getTime();
long endTime = end.getTime();
return parse(field, beginTime, endTime);
}
/**
* Timestamp value is converted to long value, same as it's field type in index file.
*
* @param field
* @param begin
* @param end
* @return
*/
public static Query parse(String field, Timestamp begin, Timestamp end) {
long beginTime = begin.getTime();
long endTime = end.getTime();
return parse(field, beginTime, endTime);
}
/**
* Boolean value is converted to string value, same as it's field type in index file.
*
* @param field
* @param value
* @return
*/
public static Query parse(String field, boolean value) {
if (value) {
return parse(field, "true");
} else {
return parse(field, "false");
}
}
/**
* Char value is converted to string value, same as it's field type in index file.
*
* @param field
* @param value
* @return
*/
public static Query parse(String field, char value) {
return parse(field, String.valueOf(value));
}
}