package com.orientechnologies.lucene.parser;
import com.orientechnologies.orient.core.metadata.schema.OType;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.DateTools;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import java.util.Map;
/**
* Created by frank on 13/12/2016.
*/
public class OLuceneMultiFieldQueryParser extends MultiFieldQueryParser {
private final Map<String, OType> types;
public OLuceneMultiFieldQueryParser(Map<String, OType> types, String[] fields,
Analyzer analyzer,
Map<String, Float> boosts) {
super(fields, analyzer, boosts);
this.types = types;
}
public OLuceneMultiFieldQueryParser(Map<String, OType> types, String[] fields, Analyzer analyzer) {
super(fields, analyzer);
this.types = types;
}
@Override
protected Query getFieldQuery(String field, String queryText, int slop) throws ParseException {
Query query = getQuery(field, queryText, queryText, true, true);
if (query != null)
return query;
return super.getFieldQuery(field, queryText, slop);
}
@Override
protected Query getFieldQuery(String field, String queryText, boolean quoted) throws ParseException {
Query query = getQuery(field, queryText, queryText, true, true);
if (query != null)
return query;
return super.getFieldQuery(field, queryText, quoted);
}
@Override
protected Query getRangeQuery(String field, String part1, String part2, boolean startInclusive, boolean endInclusive)
throws ParseException {
Query query = getQuery(field, part1, part2, startInclusive, endInclusive);
if (query != null)
return query;
return super.getRangeQuery(field, part1, part2, startInclusive, endInclusive);
}
private Query getQuery(String field, String part1, String part2, boolean startInclusive, boolean endInclusive)
throws ParseException {
if (types.containsKey(field)) {
switch (types.get(field)) {
case LONG:
return NumericRangeQuery.newLongRange(field, Long.parseLong(part1), Long.parseLong(part2),
startInclusive, endInclusive);
case INTEGER:
return NumericRangeQuery.newIntRange(field, Integer.parseInt(part1), Integer.parseInt(part2),
startInclusive, endInclusive);
case DOUBLE:
return NumericRangeQuery.newDoubleRange(field, Double.parseDouble(part1), Double.parseDouble(part2),
startInclusive, endInclusive);
case DATE:
case DATETIME:
try {
return NumericRangeQuery.newLongRange(field, DateTools.stringToTime(part1), DateTools.stringToTime(part2),
startInclusive, endInclusive);
} catch (java.text.ParseException e) {
throw new ParseException(e.getMessage());
}
}
}
return null;
}
}