Start with org.apache.solr.handler.component.QueryComponent#prepare which fetches the fq parameters and indirectly invokes the query parser(s):

String[] fqs = req.getParams().getParams(CommonParams.FQ);
if (fqs!=null && fqs.length!=0) {
  List<Query> filters = rb.getFilters();
// if filters already exists, make a copy instead of modifying the original filters = filters == null ? new ArrayList<Query>(fqs.length) : new ArrayList<Query>(filters);
  for (String fq : fqs) {
    if (fq != null && fq.trim().length()!=0) {
      QParser fqp = QParser.getParser(fq, null, req);
      filters.add(fqp.getQuery());
    }
  }
  // only set the filters if they are not empty otherwise
  // fq=&someotherParam= will trigger all docs filter for every request
  // if filter cache is disabled
  if (!filters.isEmpty()) {
    rb.setFilters( filters );

Note that this line actually invokes the parser:

      filters.add(fqp.getQuery());

Then in org.apache.lucene.search.Query.QParser#getParser:

QParserPlugin qplug = req.getCore().getQueryPlugin(parserName);
QParser parser = qplug.createParser(qstr, localParams, req.getParams(), req);

And for the common case of the Lucene query parser, org.apache.solr.search.LuceneQParserPlugin#createParser:

public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
 return new LuceneQParser(qstr, localParams, params, req);
}

And then in org.apache.lucene.search.Query.QParser#getQuery:

public Query getQuery() throws SyntaxError {
 if (query==null) {
   query=parse();

And then in org.apache.lucene.search.Query.LuceneQParser#parse:

lparser = new SolrQueryParser(this, defaultField);

lparser.setDefaultOperator
 (QueryParsing.getQueryParserDefaultOperator(getReq().getSchema(),
                                             getParam(QueryParsing.OP)));

return lparser.parse(qstr);

And then in org.apache.solr.parser.SolrQueryParserBase#parse:

Query res = TopLevelQuery(null); // pass null so we can tell later if an explicit field was provided or not

And then in org.apache.solr.parser.QueryParser#TopLevelQuery, the parsing begins.

And org.apache.solr.parser.QueryParser.jj is the grammar for a basic Solr/Lucene query, and org.apache.solr.parser.QueryParser.java is generated by JFlex, and a lot of the logic is in the base class of the generated class, org.apache.solr.parser.SolrQueryParserBase.java.

Good luck! Happy hunting!

-- Jack Krupansky

-----Original Message----- From: YouPeng Yang
Sent: Monday, October 21, 2013 2:57 AM
To: solr-user@lucene.apache.org
Subject: Class name of parsing the fq clause

Hi
  I search the solr with fq clause,which is like:
  fq=BEGINTIME:[2013-08-25T16:00:00Z TO *] AND BUSID:(M30000 OR M90000)


  I am curious about the parsing process . I want to study it.
  What is the Java file name describes  the parsing  process of the fq
clause.


 Thanks

Regards.

Reply via email to