Searcher's getDocListAndSet methods do not accept flags, can cause NPE when
writing output
------------------------------------------------------------------------------------------
Key: SOLR-39
URL: http://issues.apache.org/jira/browse/SOLR-39
Project: Solr
Issue Type: Bug
Components: search
Reporter: Greg Ludington
Priority: Minor
Attachments: SolrIndexSearcherdocListAndSet.patch
SolrIndexSearcher's getDocListAndSet methods do not accept flags, which can, in
some cases, cause a Null Pointer Exception to be thrown when writing the
docListAndSet.docList as output. I came across the issue as I was implementing
faceting, see
http://www.nabble.com/Faceted-Browsing-Question-Discussion-tf1968854.html for
the discussion.
The simplest way to reproduce this is to modify DisMaxRequestHandler, by
changing this:
DocList results = s.getDocList(query, restrictions,
SolrPluginUtils.getSort(req),
req.getStart(), req.getLimit(),
flags);
rsp.add("search-results",results);
to
DocListAndSet listAndSet= s.getDocListAndSet(query, restrictions,
SolrPluginUtils.getSort(req),
req.getStart(), req.getLimit());
DocList results = listAndSet.docList;
rsp.add("search-results",results);
The root cause appears to be that the scores[] is set to null, so then the
DocIterator and its score() method is called, return scores[pos-1] will give
null. When getDocListAndSet(..) is invoked, it eventually can get down to this
private method:
private DocSet getDocListAndSetNC(DocListAndSet out, Query query, DocSet
filter, Sort lsort, int offset, int len, int flags) throws IOException
In that method, scores is assigned as follows:
scores = (flags&GET_SCORES)!=0 ? new float[nDocsReturned] : null;
Since getDocListAndSet() does not pass flags (except for the implicit
GET_DOCSET), scores is assigned as null, which eventually leads to the
NullPointerException if you try to output the docList . The attached patch
does not change the underlying mechanism of how scores is assigned, but works
around the issue by adding overloaded getDocListAndSet() methods that take an
additional flags parameter. After applying this patch, you can change the
relevant bit in DisMaxRequestHandler to:
DocListAndSet listAndSet= s.getDocListAndSet(query, restrictions,
SolrPluginUtils.getSort(req),
req.getStart(), req.getLimit(), flags);
DocList results = listAndSet.docList;
rsp.add("search-results",results);
and you will no longer see the NullPointerException
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira