package org.apache.lucene.queryparser.flexible.aqp.processors; 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.MatchAllDocsQueryNode; import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode; import org.apache.lucene.queryparser.flexible.core.nodes.QuotedFieldQueryNode; import org.apache.lucene.queryparser.flexible.standard.nodes.PrefixWildcardQueryNode; 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.nodes.AqpANTLRNode; import org.apache.lucene.queryparser.flexible.aqp.nodes.AqpAdsabsIdentifierNode; import org.apache.lucene.queryparser.flexible.aqp.processors.AqpQPHRASEProcessor; import org.apache.lucene.queryparser.flexible.aqp.processors.AqpQProcessor; /** * Converts QIDENTIFIER node into @{link {@link QuotedFieldQueryNode}. * The field value is the @{link DefaultFieldAttribute} * specified in the configuration. * * <p> * * If the user specified a field, it will be set by the @{link AqpFIELDProcessor} * Therefore the {@link AqpQPHRASEProcessor} should run before it. * * * @see QueryConfigHandler * */ public class AqpQIDENTIFIERProcessor extends AqpQProcessor { public boolean nodeIsWanted(AqpANTLRNode node) { if (node.getTokenLabel().equals("QIDENTIFIER")) { return true; } return false; } public QueryNode createQNode(AqpANTLRNode node) throws QueryNodeException { //String field = getDefaultFieldName(); String field = getQueryConfigHandler().get(AqpAdsabsQueryConfigHandler.ConfigurationKeys.DEFAULT_IDENTIFIER_FIELD); String input = null; int start = 0; int end = 0; QueryNode sc = null; if (node.getChildren().size() == 1) { sc = node.getChildren().get(0); if (sc instanceof AqpANTLRNode) { input = EscapeQuerySyntaxImpl.discardEscapeChar(((AqpANTLRNode) sc).getTokenInput()).toString(); start = ((AqpANTLRNode) sc).getTokenStart(); end = ((AqpANTLRNode) sc).getTokenEnd(); } else if (sc instanceof MatchAllDocsQueryNode) { // XXX: we are missing the info about the token position, which may hurt us later return new PrefixWildcardQueryNode(field, "*", -1, -1); } else { input = ((FieldQueryNode) sc).getTextAsString(); start = ((FieldQueryNode) sc).getBegin(); end = ((FieldQueryNode) sc).getEnd(); } } else { field = ((AqpANTLRNode) node.getChildren().get(0)).getTokenLabel(); sc = node.getChildren().get(1); if (sc instanceof AqpANTLRNode) { input = EscapeQuerySyntaxImpl.discardEscapeChar(((AqpANTLRNode) sc).getTokenInput()).toString(); start = ((AqpANTLRNode) sc).getTokenStart(); end = ((AqpANTLRNode) sc).getTokenEnd(); } else if (sc instanceof MatchAllDocsQueryNode) { // XXX: we are missing the info about the token position, which may hurt us later return new PrefixWildcardQueryNode(field, "*", -1, -1); } else { input = ((FieldQueryNode) sc).getTextAsString(); start = ((FieldQueryNode) sc).getBegin(); end = ((FieldQueryNode) sc).getEnd(); } } /* if (input.contains(":")) { String[] vals = input.split("\\:", 2); String f = vals[0].toLowerCase(); if (f.equals("doi")) { field = "doi"; } else if (f.equals("identifier")) { field = "identifier"; } } */ if (sc instanceof FieldQueryNode) { ((FieldQueryNode) sc).setField(field); ((FieldQueryNode) sc).setText(input); ((FieldQueryNode) sc).setBegin(start); ((FieldQueryNode) sc).setEnd(end); return sc; } else { if (input.equals("*")) { return new PrefixWildcardQueryNode(field, input, start, end); } return new AqpAdsabsIdentifierNode(field, input, start, end); } } }