@Override
protected QueryNode postProcessNode(final QueryNode node)
throws QueryNodeException {
if (node instanceof TermRangeQueryNode) {
final TermRangeQueryNode termRangeNode = (TermRangeQueryNode) node;
final Map<String, Analyzer> dts = this.getQueryConfigHandler().get(KeywordConfigurationKeys.DATATYPES_ANALYZERS);
final Analyzer analyzer = dts.get(node.getTag(DatatypeQueryNode.DATATYPE_TAGID));
if (analyzer instanceof NumericAnalyzer) {
final NumericAnalyzer na = (NumericAnalyzer) analyzer;
final FieldQueryNode lower = termRangeNode.getLowerBound();
final FieldQueryNode upper = termRangeNode.getUpperBound();
final char[] lowerText = lower.getTextAsString().toCharArray();
final char[] upperText = upper.getTextAsString().toCharArray();
final NumericParser<?> parser = na.getNumericParser();
final Number lowerNumber;
try {
if (lowerText.length == 0) { // open bound
lowerNumber = null;
} else {
final ReusableCharArrayReader lowerReader = new ReusableCharArrayReader(lowerText);
lowerNumber = parser.parse(lowerReader);
}
} catch (final Exception e) {
throw new QueryNodeParseException(new MessageImpl(QueryParserMessages.COULD_NOT_PARSE_NUMBER,
lowerText, parser.getNumericType() + " parser"), e);
}
final Number upperNumber;
try {
if (upperText.length == 0) { // open bound
upperNumber = null;
} else {
final ReusableCharArrayReader upperReader = new ReusableCharArrayReader(upperText);
upperNumber = parser.parse(upperReader);
}
} catch (final Exception e) {
throw new QueryNodeParseException(new MessageImpl(QueryParserMessages.COULD_NOT_PARSE_NUMBER,
upperText, parser.getNumericType() + " parser"), e);
}
final CharSequence field = termRangeNode.getField();
final NodeNumericQueryNode lowerNode = new NodeNumericQueryNode(field, lowerNumber);
final NodeNumericQueryNode upperNode = new NodeNumericQueryNode(field, upperNumber);
final boolean lowerInclusive = termRangeNode.isLowerInclusive();
final boolean upperInclusive = termRangeNode.isUpperInclusive();
return new NodeNumericRangeQueryNode(lowerNode, upperNode, lowerInclusive, upperInclusive, na);
}
}
return node;