@Test public void testAppendAndDelete() throws Exception { int cap = 1024; int count = 10; int deleteSpace = 0; ByteBuffer buffer = makeAFrame(cap, count, deleteSpace); int dataOffset = buffer.position(); appender.reset(buffer); int freeSpace = appender.getContiguousFreeSpace(); int[] deleteSet = new int[] {1, 3, 5}; for (int i = 0; i < deleteSet.length; i++) { deleteSpace += assertDeleteSucceed(deleteSet[i], freeSpace, deleteSpace); } ByteBuffer bufferRead = makeAFrame(cap, count * 2, 0); DeletableFrameTupleAppender accessor = new DeletableFrameTupleAppender(recordDescriptor); accessor.reset(bufferRead); for (int i = count; i < accessor.getTupleCount(); i++) { int id = appender.append(accessor, i); dataOffset += assertTupleIsExpected(i, dataOffset); assertEquals(i, id); } appender.reOrganizeBuffer(); dataOffset = 0; for (int i = 0; i < appender.getTupleCount(); i++) { if (ArrayUtils.contains(deleteSet, i)) { continue; } dataOffset += assertTupleIsExpected(i, dataOffset); } }
@Test public void testClear() throws Exception { ByteBuffer buffer = ByteBuffer.allocate(cap); appender.clear(buffer); assertTrue(appender.getBuffer() == buffer); assertTrue(appender.getTupleCount() == 0); assertTrue(appender.getContiguousFreeSpace() == cap - 4 - 4); }
int assertDeleteSucceed(int i, int freeSpaceBeforeDelete, int deleteSpace) { int startOffset = appender.getTupleStartOffset(i); int endOffset = appender.getTupleEndOffset(i); int tupleLength = appender.getTupleLength(i); appender.delete(i); assertEquals(startOffset, appender.getTupleStartOffset(i)); assertEquals(-endOffset, appender.getTupleEndOffset(i)); assertEquals(-tupleLength, appender.getTupleLength(i)); assertEquals(freeSpaceBeforeDelete, appender.getContiguousFreeSpace()); assertEquals(deleteSpace + tupleLength + freeSpaceBeforeDelete, appender.getTotalFreeSpace()); return tupleLength; }
@Test public void testReset() throws Exception { ByteBuffer buffer = ByteBuffer.allocate(cap); appender.reset(buffer); assertTrue(appender.getBuffer() == buffer); assertTrue(appender.getTupleCount() == 0); assertTrue(appender.getContiguousFreeSpace() == cap - 4 - 4); int count = 10; int deleted = 7; buffer = makeAFrame(cap, count, deleted); int pos = buffer.position(); appender.reset(buffer); assertTrue(appender.getBuffer() == buffer); assertTrue(appender.getTupleCount() == count); assertTrue(appender.getContiguousFreeSpace() == cap - 4 - 4 - count * 4 - pos); assertTrue(appender.getTotalFreeSpace() == appender.getContiguousFreeSpace() + deleted); int dataOffset = 0; for (int i = 0; i < count; i++) { dataOffset += assertTupleIsExpected(i, dataOffset); } }
@Test public void testDelete() throws Exception { int count = 10; int deleteSpace = 0; ByteBuffer buffer = makeAFrame(cap, count, deleteSpace); appender.reset(buffer); int freeSpace = appender.getContiguousFreeSpace(); for (int i = 0; i < appender.getTupleCount(); i++) { deleteSpace += assertDeleteSucceed(i, freeSpace, deleteSpace); int innerOffset = deleteSpace; for (int j = i + 1; j < appender.getTupleCount(); j++) { innerOffset += assertTupleIsExpected(j, innerOffset); } } }