package org.apache.lucene.queryparser.flexible.aqp.processors; import java.util.List; import java.util.Map; import org.apache.lucene.queryparser.flexible.standard.nodes.WildcardQueryNode; import org.apache.lucene.queryparser.flexible.aqp.config.AqpAdsabsQueryConfigHandler; 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.core.processors.QueryNodeProcessorImpl; /** * Looks at the QueryNode(s) and prepares them for analysis. This must happen * before AqpAdsabsAnalyzerProcessor * * <pre> * author:surname, m* => author:surname, m * </pre> * * @see QueryConfigHandler * @see AqpAdsabsAnalyzerProcessor * @see AqpAdsabsExpandAuthorSearchProcessor * */ public class AqpAdsabsAuthorPreProcessor extends QueryNodeProcessorImpl { private Map<String, int[]> fieldMap; public AqpAdsabsAuthorPreProcessor() { // empty constructor } @Override public QueryNode process(QueryNode queryTree) throws QueryNodeException { if (getQueryConfigHandler().has(AqpAdsabsQueryConfigHandler.ConfigurationKeys.AUTHOR_FIELDS)) { fieldMap = getQueryConfigHandler().get(AqpAdsabsQueryConfigHandler.ConfigurationKeys.AUTHOR_FIELDS); return super.process(queryTree); } return queryTree; } @Override protected QueryNode preProcessNode(QueryNode node) throws QueryNodeException { if (node instanceof FieldQueryNode ) { FieldQueryNode fqn = ((FieldQueryNode) node); if (fieldMap.containsKey(fqn.getFieldAsString())) { String[] nameParts = fqn.getTextAsString().split(" "); if (node instanceof WildcardQueryNode) { if (nameParts[nameParts.length-1].replace("*","").length() > 1) return node; // make "kurtz, m*" a simple case return new FieldQueryNode(fqn.getField(), fqn.getTextAsString().replace("*", "").trim(), fqn.getBegin(), fqn.getEnd()); } } } return node; } @Override protected QueryNode postProcessNode(QueryNode node) throws QueryNodeException { return node; } @Override protected List<QueryNode> setChildrenOrder(List<QueryNode> children) throws QueryNodeException { return children; } }