Wrong implementation of DocIdSetIterator.advance 
-------------------------------------------------

                 Key: LUCENE-2736
                 URL: https://issues.apache.org/jira/browse/LUCENE-2736
             Project: Lucene - Java
          Issue Type: Bug
          Components: Other
    Affects Versions: 3.0.2, 4.0
            Reporter: Hardy Ferentschik


Implementations of {{DocIdSetIterator}} behave differently when advanced is 
called. Taking the following test for {{OpenBitSet}}, {{DocIdBitSet}} and 
{{SortedVIntList}} only {{SortedVIntList}} passes the test:
{code:title=org.apache.lucene.search.TestDocIdSet.java|borderStyle=solid}
...
        public void testAdvanceWithOpenBitSet() throws IOException {
                DocIdSet idSet = new OpenBitSet( new long[] { 1121 }, 1 );  // 
bits 0, 5, 6, 10
                assertAdvance( idSet );
        }

        public void testAdvanceDocIdBitSet() throws IOException {
                BitSet bitSet = new BitSet();
                bitSet.set( 0 );
                bitSet.set( 5 );
                bitSet.set( 6 );
                bitSet.set( 10 );
                DocIdSet idSet = new DocIdBitSet(bitSet);
                assertAdvance( idSet );
        }

        public void testAdvanceWithSortedVIntList() throws IOException {
                DocIdSet idSet = new SortedVIntList( 0, 5, 6, 10 );
                assertAdvance( idSet );
        }       

        private void assertAdvance(DocIdSet idSet) throws IOException {
                DocIdSetIterator iter = idSet.iterator();
                int docId = iter.nextDoc();
                assertEquals( "First doc id should be 0", 0, docId );

                docId = iter.nextDoc();
                assertEquals( "Second doc id should be 5", 5, docId );

                docId = iter.advance( 5 );
                assertEquals( "Advancing iterator should return the next doc 
id", 6, docId );
        }
{code}

The javadoc for {{advance}} says:
{quote}
Advances to the first *beyond* the current whose document number is greater 
than or equal to _target_.
{quote}
This seems to indicate that {{SortedVIntList}} behaves correctly, whereas the 
other two don't. 
Just looking at the {{DocIdBitSet}} implementation advance is implemented as:
{code}
bitSet.nextSetBit(target);
{code}
where the docs of {{nextSetBit}} say:
{quote}
Returns the index of the first bit that is set to true that occurs *on or 
after* the specified starting index
{quote}


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to