Not in just a few words. Do you have specific questions? I mean none of that
relates to parsing of fq, the topic of this particular email thread, right?
-- Jack Krupansky
-----Original Message-----
From: Sandeep Gupta
Sent: Wednesday, October 23, 2013 3:58 AM
To: solr-user@lucene.apache.org
Subject: Re: Class name of parsing the fq clause
Thanks Jack for detailing out the parser logic.
Would it be possible for you to say something more about filter cache code
flow... sometimes we do not use fq parameter in query string and pass the
raw query....
Regards
Sandeep
On Mon, Oct 21, 2013 at 7:11 PM, Jack Krupansky
<j...@basetechnology.com>wrote:
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.