package org.apache.lucene.queryparser.flexible.aqp.processors;
import java.util.List;
import org.apache.lucene.queryparser.flexible.core.QueryNodeException;
import org.apache.lucene.queryparser.flexible.core.nodes.BoostQueryNode;
import org.apache.lucene.queryparser.flexible.core.nodes.ModifierQueryNode;
import org.apache.lucene.queryparser.flexible.core.nodes.OrQueryNode;
import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode;
import org.apache.lucene.queryparser.flexible.core.processors.QueryNodeProcessor;
import org.apache.lucene.queryparser.flexible.core.processors.QueryNodeProcessorImpl;
import org.apache.lucene.queryparser.flexible.standard.parser.EscapeQuerySyntaxImpl;
import org.apache.lucene.queryparser.flexible.aqp.nodes.AqpANTLRNode;
import org.apache.lucene.queryparser.flexible.aqp.util.AqpUtils;
import org.apache.lucene.queryparser.flexible.aqp.util.AqpUtils.Modifier;
public class AqpMULTITERMProcessor extends QueryNodeProcessorImpl implements
QueryNodeProcessor {
@Override
protected QueryNode postProcessNode(QueryNode node) throws QueryNodeException {
return node;
}
@Override
protected QueryNode preProcessNode(QueryNode node) throws QueryNodeException {
if (node instanceof AqpANTLRNode
&& ((AqpANTLRNode) node).getTokenLabel().equals("MULTITERM")) {
AqpANTLRNode mNode = (AqpANTLRNode) node;
AqpANTLRNode modifierNode = (AqpANTLRNode) mNode.getChild("MODIFIER");
AqpANTLRNode fieldNode = (AqpANTLRNode) mNode.getChild("FIELD");
AqpANTLRNode multiNode = (AqpANTLRNode) mNode.getChild("MULTIATOM");
AqpANTLRNode tModifierNode = (AqpANTLRNode) mNode.getChild("TMODIFIER");
String field = AqpUtils.getFirstChildInputString(fieldNode);
Modifier modifier = AqpUtils.getFirstChildInputModifier(modifierNode);
if (field != null) {
AqpUtils.applyFieldToAllChildren(EscapeQuerySyntaxImpl
.discardEscapeChar(field).toString(), multiNode);
}
node = new OrQueryNode(multiNode.getChildren());
if (tModifierNode != null) {
AqpANTLRNode boostNode = tModifierNode.getChild("BOOST");
Float boost = AqpUtils.getFirstChildInputFloat(boostNode);
if (boost != null) {
node = new BoostQueryNode(node, boost);
}
}
if (modifier != null) {
node = new ModifierQueryNode(node,
modifier == Modifier.PLUS ? ModifierQueryNode.Modifier.MOD_REQ
: ModifierQueryNode.Modifier.MOD_NOT);
}
return node;
}
return node;
}
@Override
protected List<QueryNode> setChildrenOrder(List<QueryNode> children)
throws QueryNodeException {
return children;
}
private String getFieldValue(AqpANTLRNode fieldNode)
throws QueryNodeException {
if (fieldNode != null && fieldNode.getChildren() != null) {
return ((AqpANTLRNode) fieldNode.getChildren().get(0)).getTokenInput();
}
return null;
}
}