lucene-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Shai Erera (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (LUCENE-2736) Wrong implementation of DocIdSetIterator.advance
Date Tue, 17 May 2011 03:32:47 GMT

    [ https://issues.apache.org/jira/browse/LUCENE-2736?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13034527#comment-13034527
] 

Shai Erera commented on LUCENE-2736:
------------------------------------

Thanks Hardy for reporting that.

But I think this works exactly as documented? Note that the javadocs of advance() state "*beyond*
the current whose document number is *greater than or equal* to target". Also, there's a note
in the javadocs:

{noformat}
   * <b>NOTE:</b> when <code> target &le; current</code> implementations
may opt 
   * not to advance beyond their current {@link #docID()}.
{noformat}

I think that the word 'beyond' is confusing here. Perhaps we can modify the javadocs to:

"Advances to the first document whose number is greater than or equal to target"

If there are no objections, or better wording, I'll commit this later today, but only to 3.2/4.0
and not 3.0.2

> Wrong implementation of DocIdSetIterator.advance 
> -------------------------------------------------
>
>                 Key: LUCENE-2736
>                 URL: https://issues.apache.org/jira/browse/LUCENE-2736
>             Project: Lucene - Java
>          Issue Type: Bug
>          Components: core/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.
For more information on JIRA, see: http://www.atlassian.com/software/jira

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: dev-help@lucene.apache.org


Mime
View raw message