package org.apache.lucene.queryparser.flexible.aqp.processors;
import org.apache.lucene.queryparser.flexible.messages.MessageImpl;
import org.apache.lucene.queryparser.flexible.core.QueryNodeException;
import org.apache.lucene.queryparser.flexible.core.config.QueryConfigHandler;
import org.apache.lucene.queryparser.flexible.core.nodes.FieldQueryNode;
import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode;
import org.apache.lucene.queryparser.flexible.standard.nodes.TermRangeQueryNode;
import org.apache.lucene.queryparser.flexible.standard.parser.EscapeQuerySyntaxImpl;
import org.apache.lucene.queryparser.flexible.aqp.config.AqpAdsabsQueryConfigHandler;
import org.apache.lucene.queryparser.flexible.aqp.config.AqpFeedback;
import org.apache.lucene.queryparser.flexible.aqp.nodes.AqpANTLRNode;
import org.apache.lucene.queryparser.flexible.aqp.processors.AqpQProcessorPost;
public class AqpQDATEProcessor extends AqpQProcessorPost {
public boolean nodeIsWanted(AqpANTLRNode node) {
if (node.getTokenLabel().equals("QDATE")) {
return true;
}
return false;
}
public QueryNode createQNode(AqpANTLRNode node) throws QueryNodeException {
QueryConfigHandler queryConfig = getQueryConfigHandler();
if (!queryConfig.has(AqpAdsabsQueryConfigHandler.ConfigurationKeys.DEFAULT_DATE_RANGE_FIELD)) {
throw new QueryNodeException(new MessageImpl(
"Configuration error",
"DefaultDateRangeField is missing from configuration"));
}
String dateField = queryConfig.get(AqpAdsabsQueryConfigHandler.ConfigurationKeys.DEFAULT_DATE_RANGE_FIELD);
if (dateField == null) {
throw new QueryNodeException(new MessageImpl(
"Configuration error",
"DefaultDateRangeField is not set"));
}
AqpANTLRNode subChild = (AqpANTLRNode) node.getChildren().get(0);
String input = subChild.getTokenInput();
int start_point = subChild.getTokenStart();
String lower = null;
String upper = null;
int lower_start = 0;
int lower_end = 0;
int upper_start = 0;
int upper_end = 0;
if (input.startsWith("-") || input.endsWith("-")) {
AqpFeedback feedback = getFeedbackAttr();
if (input.startsWith("-")) {
lower = "*";
upper = input.substring(1);
lower_start = start_point + input.indexOf(upper) - 2;
lower_end = lower_start + 1;
upper_start = start_point + input.indexOf(upper);
upper_end = upper_start + upper.length();
}
else {
lower = input.substring(0, input.length()-1);
upper = "*";
lower_start = start_point + input.indexOf(lower);
lower_end = lower_start + lower.length();
upper_start = lower_end + 1;
upper_end = upper_start + 1;
}
feedback.createEvent(AqpFeedback.TYPE.DEPRECATED, this.getClass(), subChild,
"The query syntax \"" + input + "\" is deprecated. Please use:" +
"{{{" + dateField + ":[" + lower + " TO " + upper + "]}}}");
}
else {
String[] parts = input.split("-");
lower = parts[0];
lower_start = start_point + input.indexOf(lower);
lower_end = lower_start + lower.length();
upper = parts[1];
upper_start = start_point + input.indexOf(upper);
upper_end = upper_start + upper.length();
}
FieldQueryNode lowerBound = new FieldQueryNode(dateField,
EscapeQuerySyntaxImpl.discardEscapeChar(lower),
lower_start, lower_end);
FieldQueryNode upperBound = new FieldQueryNode(dateField,
EscapeQuerySyntaxImpl.discardEscapeChar(upper),
upper_start, upper_end);
return new TermRangeQueryNode(lowerBound, upperBound, true, true);
}
}