private void startNewPage() { if (currentPageBuilder != null) { completedPagesMemorySize += currentPageBuilder.getRetainedSizeInBytes(); currentPageBuilder = currentPageBuilder.newPageBuilderLike(); } else { currentPageBuilder = new PageBuilder(types); } for (int i = 0; i < types.size(); i++) { channelBuilders.get(i).add(currentPageBuilder.getBlockBuilder(i)); } }
valueBlocksRetainedSizeInBytes += currentPageBuilder.getRetainedSizeInBytes(); sumPositions.add(totalPositions); currentPageBuilder = currentPageBuilder.newPageBuilderLike(); values.add(currentPageBuilder);
@Test public void testNewBlockBuilderLike() { ArrayType longArrayType = new ArrayType(BIGINT); ArrayType arrayType = new ArrayType(longArrayType); List<Type> channels = ImmutableList.of(BIGINT, VARCHAR, arrayType); PageBuilder pageBuilder = new PageBuilder(channels); BlockBuilder bigintBlockBuilder = pageBuilder.getBlockBuilder(0); BlockBuilder varcharBlockBuilder = pageBuilder.getBlockBuilder(1); BlockBuilder arrayBlockBuilder = pageBuilder.getBlockBuilder(2); for (int i = 0; i < 100; i++) { BIGINT.writeLong(bigintBlockBuilder, i); VARCHAR.writeSlice(varcharBlockBuilder, Slices.utf8Slice("test" + i)); Block longArrayBlock = new ArrayType(BIGINT) .createBlockBuilder(null, 1) .appendStructure(BIGINT.createBlockBuilder(null, 2).writeLong(i).closeEntry().writeLong(i * 2).closeEntry().build()); arrayBlockBuilder.appendStructure(longArrayBlock); pageBuilder.declarePosition(); } PageBuilder newPageBuilder = pageBuilder.newPageBuilderLike(); for (int i = 0; i < channels.size(); i++) { assertEquals(newPageBuilder.getType(i), pageBuilder.getType(i)); // we should get new block builder instances assertNotEquals(pageBuilder.getBlockBuilder(i), newPageBuilder.getBlockBuilder(i)); assertEquals(newPageBuilder.getBlockBuilder(i).getPositionCount(), 0); assertTrue(newPageBuilder.getBlockBuilder(i).getRetainedSizeInBytes() < pageBuilder.getBlockBuilder(i).getRetainedSizeInBytes()); } }