package org.apache.lucene.queryparser.flexible.aqp.processors; import java.util.ArrayList; import java.util.List; import org.apache.lucene.queryparser.flexible.aqp.config.AqpAdsabsQueryConfigHandler; import org.apache.lucene.queryparser.flexible.aqp.nodes.AqpANTLRNode; 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.QueryNode; import org.apache.lucene.queryparser.flexible.messages.MessageImpl; import org.apache.lucene.queryparser.flexible.standard.parser.ParseException; public class AqpAdsabsCOMMAProcessor extends AqpCOMMAProcessor { @Override public QueryNode createQNode(AqpANTLRNode node) throws QueryNodeException { String label = node.getTokenLabel(); if (label.equals("COMMA")) { List<QueryNode> children = node.getChildren(); ArrayList<String> vals = new ArrayList<String>(); QueryConfigHandler config = getQueryConfigHandler(); String dummy = config.get(AqpAdsabsQueryConfigHandler.ConfigurationKeys.DUMMY_VALUE); QueryNode targetNode = null; QueryNode valueNode = null; OriginalInput input; OriginalInput lastInput = null; for (QueryNode child: children) { // we need only the value, excluding field AqpANTLRNode fldNode = ((AqpANTLRNode) child).findChild("FIELD"); QueryNode valNode = fldNode.getChildren().get(fldNode.getChildren().size()-1); // break if we are not dealing with ANTLR nodes - this happens // for the old ^author syntax, old skeleton in the attic... if (!(valNode instanceof AqpANTLRNode)) { return super.createQNode(node); } input = getOriginalInput((AqpANTLRNode) valNode, null); if (!dummy.equals(input.value)) { if (lastInput != null) { if (lastInput.end+2 == input.start) { vals.add(","); } else { vals.add(", "); } } vals.add(input.value); lastInput = input; if (targetNode == null) { targetNode = child; valueNode = valNode; } } } StringBuilder sb = new StringBuilder(); for (String v: vals) { sb.append(v); } if (targetNode == null) { throw new ParseException(new MessageImpl("There is no user input")); } modifyTargetNode(valueNode, sb.toString()); return targetNode; } return super.createQNode(node); } private void modifyTargetNode(QueryNode node, String string) { if (node.isLeaf()) { if (((AqpANTLRNode) node).getTokenName().equals("TERM_NORMAL")) { ((AqpANTLRNode) node).setTokenInput(string); } } else { for (QueryNode child: node.getChildren()) { modifyTargetNode(child, string); } } } }