use of org.apache.lucene.queryparser.flexible.standard.nodes.TermRangeQueryNode in project lucene-solr by apache.
the class PointRangeQueryNodeProcessor method postProcessNode.
@Override
protected QueryNode postProcessNode(QueryNode node) throws QueryNodeException {
if (node instanceof TermRangeQueryNode) {
QueryConfigHandler config = getQueryConfigHandler();
if (config != null) {
TermRangeQueryNode termRangeNode = (TermRangeQueryNode) node;
FieldConfig fieldConfig = config.getFieldConfig(StringUtils.toString(termRangeNode.getField()));
if (fieldConfig != null) {
PointsConfig numericConfig = fieldConfig.get(ConfigurationKeys.POINTS_CONFIG);
if (numericConfig != null) {
FieldQueryNode lower = termRangeNode.getLowerBound();
FieldQueryNode upper = termRangeNode.getUpperBound();
String lowerText = lower.getTextAsString();
String upperText = upper.getTextAsString();
NumberFormat numberFormat = numericConfig.getNumberFormat();
Number lowerNumber = null, upperNumber = null;
if (lowerText.length() > 0) {
try {
lowerNumber = numberFormat.parse(lowerText);
} catch (ParseException e) {
throw new QueryNodeParseException(new MessageImpl(QueryParserMessages.COULD_NOT_PARSE_NUMBER, lower.getTextAsString(), numberFormat.getClass().getCanonicalName()), e);
}
}
if (upperText.length() > 0) {
try {
upperNumber = numberFormat.parse(upperText);
} catch (ParseException e) {
throw new QueryNodeParseException(new MessageImpl(QueryParserMessages.COULD_NOT_PARSE_NUMBER, upper.getTextAsString(), numberFormat.getClass().getCanonicalName()), e);
}
}
if (Integer.class.equals(numericConfig.getType())) {
if (upperNumber != null)
upperNumber = upperNumber.intValue();
if (lowerNumber != null)
lowerNumber = lowerNumber.intValue();
} else if (Long.class.equals(numericConfig.getType())) {
if (upperNumber != null)
upperNumber = upperNumber.longValue();
if (lowerNumber != null)
lowerNumber = lowerNumber.longValue();
} else if (Double.class.equals(numericConfig.getType())) {
if (upperNumber != null)
upperNumber = upperNumber.doubleValue();
if (lowerNumber != null)
lowerNumber = lowerNumber.doubleValue();
} else if (Float.class.equals(numericConfig.getType())) {
if (upperNumber != null)
upperNumber = upperNumber.floatValue();
if (lowerNumber != null)
lowerNumber = lowerNumber.floatValue();
}
PointQueryNode lowerNode = new PointQueryNode(termRangeNode.getField(), lowerNumber, numberFormat);
PointQueryNode upperNode = new PointQueryNode(termRangeNode.getField(), upperNumber, numberFormat);
boolean lowerInclusive = termRangeNode.isLowerInclusive();
boolean upperInclusive = termRangeNode.isUpperInclusive();
return new PointRangeQueryNode(lowerNode, upperNode, lowerInclusive, upperInclusive, numericConfig);
}
}
}
}
return node;
}
use of org.apache.lucene.queryparser.flexible.standard.nodes.TermRangeQueryNode in project lucene-solr by apache.
the class StandardSyntaxParser method Term.
public final QueryNode Term(CharSequence field) throws ParseException {
Token term, boost = null, fuzzySlop = null, goop1, goop2;
boolean fuzzy = false;
boolean regexp = false;
boolean startInc = false;
boolean endInc = false;
QueryNode q = null;
FieldQueryNode qLower, qUpper;
float defaultMinSimilarity = org.apache.lucene.search.FuzzyQuery.defaultMinSimilarity;
switch((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case TERM:
case REGEXPTERM:
case NUMBER:
switch((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case TERM:
term = jj_consume_token(TERM);
q = new FieldQueryNode(field, EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn);
break;
case REGEXPTERM:
term = jj_consume_token(REGEXPTERM);
regexp = true;
break;
case NUMBER:
term = jj_consume_token(NUMBER);
break;
default:
jj_la1[13] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
switch((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case FUZZY_SLOP:
fuzzySlop = jj_consume_token(FUZZY_SLOP);
fuzzy = true;
break;
default:
jj_la1[14] = jj_gen;
;
}
switch((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case CARAT:
jj_consume_token(CARAT);
boost = jj_consume_token(NUMBER);
switch((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case FUZZY_SLOP:
fuzzySlop = jj_consume_token(FUZZY_SLOP);
fuzzy = true;
break;
default:
jj_la1[15] = jj_gen;
;
}
break;
default:
jj_la1[16] = jj_gen;
;
}
if (fuzzy) {
float fms = defaultMinSimilarity;
try {
fms = Float.parseFloat(fuzzySlop.image.substring(1));
} catch (Exception ignored) {
}
if (fms < 0.0f) {
{
if (true)
throw new ParseException(new MessageImpl(QueryParserMessages.INVALID_SYNTAX_FUZZY_LIMITS));
}
} else if (fms >= 1.0f && fms != (int) fms) {
{
if (true)
throw new ParseException(new MessageImpl(QueryParserMessages.INVALID_SYNTAX_FUZZY_EDITS));
}
}
q = new FuzzyQueryNode(field, EscapeQuerySyntaxImpl.discardEscapeChar(term.image), fms, term.beginColumn, term.endColumn);
} else if (regexp) {
String re = term.image.substring(1, term.image.length() - 1);
q = new RegexpQueryNode(field, re, 0, re.length());
}
break;
case RANGEIN_START:
case RANGEEX_START:
switch((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case RANGEIN_START:
jj_consume_token(RANGEIN_START);
startInc = true;
break;
case RANGEEX_START:
jj_consume_token(RANGEEX_START);
break;
default:
jj_la1[17] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
switch((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case RANGE_GOOP:
goop1 = jj_consume_token(RANGE_GOOP);
break;
case RANGE_QUOTED:
goop1 = jj_consume_token(RANGE_QUOTED);
break;
case RANGE_TO:
goop1 = jj_consume_token(RANGE_TO);
break;
default:
jj_la1[18] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
jj_consume_token(RANGE_TO);
switch((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case RANGE_GOOP:
goop2 = jj_consume_token(RANGE_GOOP);
break;
case RANGE_QUOTED:
goop2 = jj_consume_token(RANGE_QUOTED);
break;
case RANGE_TO:
goop2 = jj_consume_token(RANGE_TO);
break;
default:
jj_la1[19] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
switch((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case RANGEIN_END:
jj_consume_token(RANGEIN_END);
endInc = true;
break;
case RANGEEX_END:
jj_consume_token(RANGEEX_END);
break;
default:
jj_la1[20] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
switch((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case CARAT:
jj_consume_token(CARAT);
boost = jj_consume_token(NUMBER);
break;
default:
jj_la1[21] = jj_gen;
;
}
if (goop1.kind == RANGE_QUOTED) {
goop1.image = goop1.image.substring(1, goop1.image.length() - 1);
}
if (goop2.kind == RANGE_QUOTED) {
goop2.image = goop2.image.substring(1, goop2.image.length() - 1);
}
qLower = new FieldQueryNode(field, EscapeQuerySyntaxImpl.discardEscapeChar(goop1.image), goop1.beginColumn, goop1.endColumn);
qUpper = new FieldQueryNode(field, EscapeQuerySyntaxImpl.discardEscapeChar(goop2.image), goop2.beginColumn, goop2.endColumn);
q = new TermRangeQueryNode(qLower, qUpper, startInc ? true : false, endInc ? true : false);
break;
case QUOTED:
term = jj_consume_token(QUOTED);
q = new QuotedFieldQueryNode(field, EscapeQuerySyntaxImpl.discardEscapeChar(term.image.substring(1, term.image.length() - 1)), term.beginColumn + 1, term.endColumn - 1);
switch((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case FUZZY_SLOP:
fuzzySlop = jj_consume_token(FUZZY_SLOP);
break;
default:
jj_la1[22] = jj_gen;
;
}
switch((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case CARAT:
jj_consume_token(CARAT);
boost = jj_consume_token(NUMBER);
break;
default:
jj_la1[23] = jj_gen;
;
}
int phraseSlop = 0;
if (fuzzySlop != null) {
try {
phraseSlop = (int) Float.parseFloat(fuzzySlop.image.substring(1));
q = new SlopQueryNode(q, phraseSlop);
} catch (Exception ignored) {
/* Should this be handled somehow? (defaults to "no PhraseSlop", if
* slop number is invalid)
*/
}
}
break;
default:
jj_la1[24] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
if (boost != null) {
float f = (float) 1.0;
try {
f = Float.parseFloat(boost.image);
// avoid boosting null queries, such as those caused by stop words
if (q != null) {
q = new BoostQueryNode(q, f);
}
} catch (Exception ignored) {
/* Should this be handled somehow? (defaults to "no boost", if
* boost number is invalid)
*/
}
}
{
if (true)
return q;
}
throw new Error("Missing return statement in function");
}
use of org.apache.lucene.queryparser.flexible.standard.nodes.TermRangeQueryNode in project lucene-solr by apache.
the class WildcardQueryNodeProcessor method postProcessNode.
@Override
protected QueryNode postProcessNode(QueryNode node) throws QueryNodeException {
// we do the same here, also ignore empty terms
if (node instanceof FieldQueryNode || node instanceof FuzzyQueryNode) {
FieldQueryNode fqn = (FieldQueryNode) node;
CharSequence text = fqn.getText();
// QuotedFieldQueryNode to reproduce the old parser behavior
if (fqn.getParent() instanceof TermRangeQueryNode || fqn instanceof QuotedFieldQueryNode || text.length() <= 0) {
// Ignore empty terms
return node;
}
if (isWildcard(text)) {
Analyzer analyzer = getQueryConfigHandler().get(ConfigurationKeys.ANALYZER);
if (analyzer != null) {
text = analyzeWildcard(analyzer, fqn.getFieldAsString(), text.toString());
}
if (isPrefixWildcard(text)) {
return new PrefixWildcardQueryNode(fqn.getField(), text, fqn.getBegin(), fqn.getEnd());
} else {
return new WildcardQueryNode(fqn.getField(), text, fqn.getBegin(), fqn.getEnd());
}
}
}
return node;
}
use of org.apache.lucene.queryparser.flexible.standard.nodes.TermRangeQueryNode in project lucene-solr by apache.
the class TermRangeQueryNodeBuilder method build.
@Override
public TermRangeQuery build(QueryNode queryNode) throws QueryNodeException {
TermRangeQueryNode rangeNode = (TermRangeQueryNode) queryNode;
FieldQueryNode upper = rangeNode.getUpperBound();
FieldQueryNode lower = rangeNode.getLowerBound();
String field = StringUtils.toString(rangeNode.getField());
String lowerText = lower.getTextAsString();
String upperText = upper.getTextAsString();
if (lowerText.length() == 0) {
lowerText = null;
}
if (upperText.length() == 0) {
upperText = null;
}
TermRangeQuery rangeQuery = TermRangeQuery.newStringRange(field, lowerText, upperText, rangeNode.isLowerInclusive(), rangeNode.isUpperInclusive());
MultiTermQuery.RewriteMethod method = (MultiTermQuery.RewriteMethod) queryNode.getTag(MultiTermRewriteMethodProcessor.TAG_ID);
if (method != null) {
rangeQuery.setRewriteMethod(method);
}
return rangeQuery;
}
use of org.apache.lucene.queryparser.flexible.standard.nodes.TermRangeQueryNode in project lucene-solr by apache.
the class OpenRangeQueryNodeProcessor method postProcessNode.
@Override
protected QueryNode postProcessNode(QueryNode node) throws QueryNodeException {
if (node instanceof TermRangeQueryNode) {
TermRangeQueryNode rangeNode = (TermRangeQueryNode) node;
FieldQueryNode lowerNode = rangeNode.getLowerBound();
FieldQueryNode upperNode = rangeNode.getUpperBound();
CharSequence lowerText = lowerNode.getText();
CharSequence upperText = upperNode.getText();
if (OPEN_RANGE_TOKEN.equals(upperNode.getTextAsString()) && (!(upperText instanceof UnescapedCharSequence) || !((UnescapedCharSequence) upperText).wasEscaped(0))) {
upperText = "";
}
if (OPEN_RANGE_TOKEN.equals(lowerNode.getTextAsString()) && (!(lowerText instanceof UnescapedCharSequence) || !((UnescapedCharSequence) lowerText).wasEscaped(0))) {
lowerText = "";
}
lowerNode.setText(lowerText);
upperNode.setText(upperText);
}
return node;
}
Aggregations