@Override public long nextId() { long result = peek(); nextId++; return result; }
@Override public int applyAsInt( Value[] values ) { stringRecordIds.reset(); arrayRecordIds.reset(); int propertyRecordsUsed = 0; int freeBlocksInCurrentRecord = 0; for ( Value value : values ) { PropertyBlock block = new PropertyBlock(); PropertyStore.encodeValue( block, 0 /*doesn't matter*/, value, stringRecordCounter, arrayRecordCounter, true ); if ( block.getValueBlocks().length > freeBlocksInCurrentRecord ) { propertyRecordsUsed++; freeBlocksInCurrentRecord = PropertyType.getPayloadSizeLongs(); } freeBlocksInCurrentRecord -= block.getValueBlocks().length; } int size = propertyRecordsUsed * propertyRecordSize; size += toIntExact( stringRecordIds.peek() ) * stringRecordSize; size += toIntExact( arrayRecordIds.peek() ) * arrayRecordSize; return size; } }
@Test public void resetShouldSetDefault() { BatchingIdSequence idSequence = new BatchingIdSequence(); idSequence.set( 99L ); assertEquals( 99L, idSequence.peek() ); assertEquals( 99L, idSequence.nextId() ); assertEquals( 100L, idSequence.peek() ); idSequence.reset(); assertEquals( 0L, idSequence.peek() ); assertEquals( 0L, idSequence.nextId() ); assertEquals( 1L, idSequence.peek() ); }
@Test public void ShouldSkipNullId() { BatchingIdSequence idSequence = new BatchingIdSequence(); idSequence.set( IdGeneratorImpl.INTEGER_MINUS_ONE - 1 ); assertEquals( IdGeneratorImpl.INTEGER_MINUS_ONE - 1, idSequence.peek() ); // The 'NULL Id' should be skipped, and never be visible anywhere. // Peek should always return what nextId will return assertEquals( IdGeneratorImpl.INTEGER_MINUS_ONE - 1, idSequence.nextId() ); assertEquals( IdGeneratorImpl.INTEGER_MINUS_ONE + 1, idSequence.peek() ); assertEquals( IdGeneratorImpl.INTEGER_MINUS_ONE + 1, idSequence.nextId() ); // And what if someone were to set it directly to the NULL id idSequence.set( IdGeneratorImpl.INTEGER_MINUS_ONE ); assertEquals( IdGeneratorImpl.INTEGER_MINUS_ONE + 1, idSequence.peek() ); assertEquals( IdGeneratorImpl.INTEGER_MINUS_ONE + 1, idSequence.nextId() ); }
@Override public long nextId() { long result = peek(); nextId++; return result; }
@Override public int applyAsInt( Value[] values ) { stringRecordIds.reset(); arrayRecordIds.reset(); int propertyRecordsUsed = 0; int freeBlocksInCurrentRecord = 0; for ( Value value : values ) { PropertyBlock block = new PropertyBlock(); PropertyStore.encodeValue( block, 0 /*doesn't matter*/, value, stringRecordCounter, arrayRecordCounter, true ); if ( block.getValueBlocks().length > freeBlocksInCurrentRecord ) { propertyRecordsUsed++; freeBlocksInCurrentRecord = PropertyType.getPayloadSizeLongs(); } freeBlocksInCurrentRecord -= block.getValueBlocks().length; } int size = propertyRecordsUsed * propertyRecordSize; size += toIntExact( stringRecordIds.peek() ) * stringRecordSize; size += toIntExact( arrayRecordIds.peek() ) * arrayRecordSize; return size; } }