jackrabbit-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Ard Schrijvers (JIRA)" <j...@apache.org>
Subject [jira] [Resolved] (JCR-3539) NotQuery#advance (and for older versions skipTo) violates Lucene advance contract in case a Filter is used
Date Fri, 22 Mar 2013 14:51:16 GMT

     [ https://issues.apache.org/jira/browse/JCR-3539?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

Ard Schrijvers resolved JCR-3539.

    Resolution: Fixed
> NotQuery#advance (and for older versions skipTo) violates Lucene advance contract in
case a Filter is used
> ----------------------------------------------------------------------------------------------------------
>                 Key: JCR-3539
>                 URL: https://issues.apache.org/jira/browse/JCR-3539
>             Project: Jackrabbit Content Repository
>          Issue Type: Bug
>          Components: jackrabbit-core
>            Reporter: Ard Schrijvers
>            Assignee: Ard Schrijvers
>             Fix For: 2.2.14, 2.4.4, 2.6.1, 2.7
> Plain jackrabbit does not directly suffer from the issue in the NotQuery, but it surfaces
when searching with a org.apache.lucene.search.Filterorg.apache.lucene.search.Filter. 
> The following happens when calling JackrabbitIndexSearcher#search(Query,Filter,int) 
(or any other search method containing a filter). In Lucene 3.6.0 (older Lucene version in
older jackrabbit versions similar issue) at FilterQuery#getFilterScorer, there is
>      @Override
>       public void score(Collector collector) throws IOException {
>           int filterDoc = filterIter.nextDoc();
>           int scorerDoc = scorer.advance(filterDoc);
> The scorer gets advanced with 'scorer.advance(filterDoc)' : If the scorer contains a
Jackrabbit NotQuery, this results in NotQuery#advance being invoked. At this time, NotQuery#nextDoc()
has not yet ever been invoked.
> The NotQuery#advance results in that docNo becomes some positive number (0 or larger).
After this, when NotQuery#nextDoc() gets invoked,  the docNo is not -1 any more, and the contextScorer.nextDoc();
is never called any more, ever. Hence, when a FIlter gets applied, the NotQuery is completely
> Fix is simply to replace the 
> if (docNo == -1) {
> with a 
> if (firstTime) {
>     firstTime = false;
> (in older lucene versions the problem results in false 'more' for IndexSearcher in this
line: boolean more = filterDocIdIterator.next() && scorer.skipTo(filterDocIdIterator.doc());

This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

View raw message