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

        

Reply via email to