package org.apache.solr.search;
import org.apache.lucene.queryparser.flexible.core.QueryNodeParseException;
import org.apache.lucene.queryparser.flexible.aqp.AqpAdsabsQueryParser;
import org.apache.lucene.queryparser.flexible.aqp.AqpQueryParser;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.util.SolrPluginUtils;
/**
* An instance of absolute crazy (but fun to work with) query parser.
* Implements the ADS grammar together with lots of business logic.
*
*/
public class AdsQParserPlugin extends QParserPlugin {
public static String NAME = "aqp";
private SolrParserConfigParams defaultConfig;
@SuppressWarnings("rawtypes")
@Override
public void init(NamedList args) {
defaultConfig = new SolrParserConfigParams();
NamedList defs = (NamedList) args.get("defaults");
if (defs == null) {
defs = new NamedList();
}
if (defs.get("virtual-fields") != null) {
NamedList vf = (NamedList) defs.get("virtual-fields");
for (int i=0; i<vf.size(); i++) {
String fName = vf.getName(i);
String fValue = (String) vf.getVal(i);
defaultConfig.virtualFields.put(fName, SolrPluginUtils.parseFieldBoosts(fValue));
}
}
for (int i=0; i<defs.size(); i++) {
String fName = defs.getName(i);
if (fName.startsWith("aqp.")) {
defaultConfig.params.put(fName, (String) defs.getVal(i));
}
}
}
public QParser createParser(String qstr, SolrParams localParams,
SolrParams params, SolrQueryRequest req) {
try {
// TODO: optimization -- keep the instance of the parser
// and instantiate only the syntax parser
AqpQueryParser parser = AqpAdsabsQueryParser.init();
return new AqpAdsabsQParser(parser, qstr, localParams, params, req, defaultConfig);
} catch (QueryNodeParseException e) {
throw new SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE, e.getLocalizedMessage());
} catch (Exception e) {
throw new SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE, e.getLocalizedMessage());
}
}
}