@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); }
@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 testAppend() throws Exception { int count = 10; ByteBuffer bufferRead = makeAFrame(cap, count, 0); DeletableFrameTupleAppender accessor = new DeletableFrameTupleAppender(recordDescriptor); accessor.reset(bufferRead); ByteBuffer bufferWrite = ByteBuffer.allocate(cap); appender.clear(bufferWrite); for (int i = 0; i < accessor.getTupleCount(); i++) { appender.append(accessor, i); } for (int i = 0; i < bufferRead.capacity(); i++) { assertEquals(bufferRead.get(i), bufferWrite.get(i)); } }
@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); } } }
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; }
int assertTupleIsExpected(int i, int dataOffset) { int lenStrMeta = UTF8StringUtil.getNumBytesToStoreLength(i); int tupleLength = 2 * 4 + 4 + lenStrMeta + i + 1; assertEquals(dataOffset, appender.getTupleStartOffset(i)); assertEquals(tupleLength, appender.getTupleLength(i)); assertEquals(dataOffset + 2 * 4, appender.getAbsoluteFieldStartOffset(i, 0)); assertEquals(4, appender.getFieldLength(i, 0)); assertEquals( i + 1, IntSerDeUtils.getInt( appender.getBuffer().array(), appender.getAbsoluteFieldStartOffset(i, 0))); assertEquals(dataOffset + 2 * 4 + 4, appender.getAbsoluteFieldStartOffset(i, 1)); assertEquals(lenStrMeta + i + 1, appender.getFieldLength(i, 1)); 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 testReOrganizeBuffer() throws Exception { int count = 10; testDelete(); appender.reOrganizeBuffer(); ByteBuffer bufferRead = makeAFrame(cap, count, 0); DeletableFrameTupleAppender accessor = new DeletableFrameTupleAppender(recordDescriptor); accessor.reset(bufferRead); for (int i = 0; i < accessor.getTupleCount(); i++) { appender.append(accessor, i); } for (int i = 0; i < bufferRead.capacity(); i++) { assertEquals(bufferRead.get(i), appender.getBuffer().get(i)); } }
@Test public void testResetAfterDelete() throws Exception { testDelete(); appender.reset(appender.getBuffer()); assertEquals(cap - appender.getTupleCount() * 4 - 4 - 4, appender.getTotalFreeSpace()); }