@Override public long nextId() { assert !closed; long id; while ( currentBatch == null || (id = currentBatch.nextId()) == VALUE_REPRESENTING_NULL ) { currentBatch = source.nextIdBatch( batchSize ).iterator(); } return id; }
@Override public long nextId() { long id; if ( batch == null || (id = batch.nextId()) == -1 ) { IdRange idRange = source.nextIdBatch( batchSize ); while ( IdValidator.hasReservedIdInRange( idRange.getRangeStart(), idRange.getRangeStart() + idRange.getRangeLength() ) ) { idRange = source.nextIdBatch( batchSize ); } batch = new IdRangeIterator( idRange ); id = batch.nextId(); } return id; }
@Test public void shouldContinueThroughEmptyIdBatch() { // given IdSequence idSource = mock( IdSequence.class ); Iterator<IdRange> ranges = asList( new IdRange( EMPTY_LONG_ARRAY, 0, BATCH_SIZE ), new IdRange( EMPTY_LONG_ARRAY, BATCH_SIZE, 0 ), new IdRange( EMPTY_LONG_ARRAY, BATCH_SIZE, BATCH_SIZE ) ).iterator(); when( idSource.nextIdBatch( anyInt() ) ).thenAnswer( invocation -> ranges.next() ); RenewableBatchIdSequence ids = new RenewableBatchIdSequence( idSource, BATCH_SIZE, excessIds::add ); // when/then for ( long expectedId = 0; expectedId < BATCH_SIZE * 2; expectedId++ ) { assertEquals( expectedId, ids.nextId() ); } }
@Override public long nextId() { assert !closed; long id; while ( currentBatch == null || (id = currentBatch.nextId()) == VALUE_REPRESENTING_NULL ) { currentBatch = source.nextIdBatch( batchSize ).iterator(); } return id; }
@Override public long nextId() { long id; if ( batch == null || (id = batch.nextId()) == -1 ) { IdRange idRange = source.nextIdBatch( batchSize ); while ( IdValidator.hasReservedIdInRange( idRange.getRangeStart(), idRange.getRangeStart() + idRange.getRangeLength() ) ) { idRange = source.nextIdBatch( batchSize ); } batch = new IdRangeIterator( idRange ); id = batch.nextId(); } return id; }