[ http://issues.apache.org/jira/browse/SOLR-39?page=all ]

Yonik Seeley resolved SOLR-39.
------------------------------

    Resolution: Fixed
      Assignee: Yonik Seeley

Thanks Greg, I just committed this.

> 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
>         Assigned To: Yonik Seeley
>            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