@Override public BlockBuilder createBlockBuilder(BlockBuilderStatus blockBuilderStatus, int expectedEntries, int expectedBytesPerEntry) { return new ArrayBlockBuilder(elementType, blockBuilderStatus, expectedEntries, expectedBytesPerEntry); }
@Override public BlockBuilder appendStructureInternal(Block block, int position) { if (!(block instanceof AbstractArrayBlock)) { throw new IllegalArgumentException(); } AbstractArrayBlock arrayBlock = (AbstractArrayBlock) block; BlockBuilder entryBuilder = beginBlockEntry(); int startValueOffset = arrayBlock.getOffset(position); int endValueOffset = arrayBlock.getOffset(position + 1); for (int i = startValueOffset; i < endValueOffset; i++) { if (arrayBlock.getRawElementBlock().isNull(i)) { entryBuilder.appendNull(); } else { arrayBlock.getRawElementBlock().writePositionTo(i, entryBuilder); } } closeEntry(); return this; }
@Override public BlockBuilder appendNull() { if (currentEntryOpened) { throw new IllegalStateException("Current entry must be closed before a null can be written"); } entryAdded(true); return this; }
@Override public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus) { int newSize = calculateBlockResetSize(getPositionCount()); return new ArrayBlockBuilder(blockBuilderStatus, values.newBlockBuilderLike(blockBuilderStatus), newSize); }
private static Block createTestBlock() { ArrayBlockBuilder blockBuilder = (ArrayBlockBuilder) TYPE.createBlockBuilder(new BlockBuilderStatus(), 3); ArrayElementBlockWriter arrayElementBlockWriter; arrayElementBlockWriter = blockBuilder.beginBlockEntry(); BIGINT.writeLong(arrayElementBlockWriter, 1); VARCHAR.writeSlice(arrayElementBlockWriter, utf8Slice("cat")); blockBuilder.closeEntry(); arrayElementBlockWriter = blockBuilder.beginBlockEntry(); BIGINT.writeLong(arrayElementBlockWriter, 2); VARCHAR.writeSlice(arrayElementBlockWriter, utf8Slice("cats")); blockBuilder.closeEntry(); arrayElementBlockWriter = blockBuilder.beginBlockEntry(); BIGINT.writeLong(arrayElementBlockWriter, 3); VARCHAR.writeSlice(arrayElementBlockWriter, utf8Slice("dog")); blockBuilder.closeEntry(); return blockBuilder.build(); }
@Override public BlockBuilder appendStructure(Block block) { if (currentEntryOpened) { throw new IllegalStateException("Expected current entry to be closed but was opened"); } currentEntryOpened = true; for (int i = 0; i < block.getPositionCount(); i++) { if (block.isNull(i)) { values.appendNull(); } else { block.writePositionTo(i, values); } } closeEntry(); return this; }
@Override public String toString() { StringBuilder sb = new StringBuilder("ArrayBlockBuilder{"); sb.append("positionCount=").append(getPositionCount()); sb.append('}'); return sb.toString(); } }
@Override public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus) { int newSize = calculateBlockResetSize(getPositionCount()); return new ArrayBlockBuilder(blockBuilderStatus, values.newBlockBuilderLike(blockBuilderStatus), newSize); }
@Override public BlockBuilder appendStructure(Block block) { if (currentEntryOpened) { throw new IllegalStateException("Expected current entry to be closed but was opened"); } currentEntryOpened = true; for (int i = 0; i < block.getPositionCount(); i++) { if (block.isNull(i)) { values.appendNull(); } else { block.writePositionTo(i, values); } } closeEntry(); return this; }
@Override public String toString() { StringBuilder sb = new StringBuilder("ArrayBlockBuilder{"); sb.append("positionCount=").append(getPositionCount()); sb.append('}'); return sb.toString(); } }
private static BlockBuilder createBlockBuilderWithValues(long[][] expectedValues) { BlockBuilder blockBuilder = new ArrayBlockBuilder(BIGINT, null, 100, 100); return writeValues(expectedValues, blockBuilder); }
@Override public BlockBuilder appendStructureInternal(Block block, int position) { if (!(block instanceof AbstractArrayBlock)) { throw new IllegalArgumentException(); } AbstractArrayBlock arrayBlock = (AbstractArrayBlock) block; BlockBuilder entryBuilder = beginBlockEntry(); int startValueOffset = arrayBlock.getOffset(position); int endValueOffset = arrayBlock.getOffset(position + 1); for (int i = startValueOffset; i < endValueOffset; i++) { if (arrayBlock.getRawElementBlock().isNull(i)) { entryBuilder.appendNull(); } else { arrayBlock.getRawElementBlock().writePositionTo(i, entryBuilder); } } closeEntry(); return this; }
@Override public BlockBuilder closeEntry() { if (!currentEntryOpened) { throw new IllegalStateException("Expected entry to be opened but was closed"); } entryAdded(false); currentEntryOpened = false; return this; }
private static BlockBuilder createBlockBuilderWithValues(long[][][] expectedValues) { BlockBuilder blockBuilder = new ArrayBlockBuilder(new ArrayBlockBuilder(BIGINT, null, 100, 100), null, 100); for (long[][] expectedValue : expectedValues) { if (expectedValue == null) { blockBuilder.appendNull(); } else { BlockBuilder intermediateBlockBuilder = new ArrayBlockBuilder(BIGINT, null, 100, 100); for (int j = 0; j < expectedValue.length; j++) { if (expectedValue[j] == null) { intermediateBlockBuilder.appendNull(); } else { BlockBuilder innerMostBlockBuilder = BIGINT.createBlockBuilder(null, expectedValue.length); for (long v : expectedValue[j]) { BIGINT.writeLong(innerMostBlockBuilder, v); } intermediateBlockBuilder.appendStructure(innerMostBlockBuilder.build()); } } blockBuilder.appendStructure(intermediateBlockBuilder.build()); } } return blockBuilder; }
@Override public BlockBuilder closeEntry() { if (!currentEntryOpened) { throw new IllegalStateException("Expected entry to be opened but was closed"); } entryAdded(false); currentEntryOpened = false; return this; }
@Test public void testArrayBlock() { BlockBuilder arrayBlockBuilder = new ArrayBlockBuilder(BIGINT, null, EXPECTED_ENTRIES); for (int i = 0; i < EXPECTED_ENTRIES; i++) { BlockBuilder arrayElementBuilder = arrayBlockBuilder.beginBlockEntry(); writeNativeValue(BIGINT, arrayElementBuilder, castIntegerToObject(i, BIGINT)); arrayBlockBuilder.closeEntry(); } checkRetainedSize(arrayBlockBuilder.build(), false); }
@Override public BlockBuilder appendNull() { if (currentEntryOpened) { throw new IllegalStateException("Current entry must be closed before a null can be written"); } entryAdded(true); return this; }
@Test public void testLazyBlockBuilderInitialization() { long[][] expectedValues = new long[ARRAY_SIZES.length][]; Random rand = new Random(47); for (int i = 0; i < ARRAY_SIZES.length; i++) { expectedValues[i] = rand.longs(ARRAY_SIZES[i]).toArray(); } BlockBuilder emptyBlockBuilder = new ArrayBlockBuilder(BIGINT, null, 0, 0); BlockBuilder blockBuilder = new ArrayBlockBuilder(BIGINT, null, 100, 100); assertEquals(blockBuilder.getSizeInBytes(), emptyBlockBuilder.getSizeInBytes()); assertEquals(blockBuilder.getRetainedSizeInBytes(), emptyBlockBuilder.getRetainedSizeInBytes()); writeValues(expectedValues, blockBuilder); assertTrue(blockBuilder.getSizeInBytes() > emptyBlockBuilder.getSizeInBytes()); assertTrue(blockBuilder.getRetainedSizeInBytes() > emptyBlockBuilder.getRetainedSizeInBytes()); blockBuilder = blockBuilder.newBlockBuilderLike(null); assertEquals(blockBuilder.getSizeInBytes(), emptyBlockBuilder.getSizeInBytes()); assertEquals(blockBuilder.getRetainedSizeInBytes(), emptyBlockBuilder.getRetainedSizeInBytes()); }
@Test public void testRetainedSizeInBytes() { int expectedEntries = 1000; BlockBuilder arrayBlockBuilder = new ArrayBlockBuilder(BIGINT, null, expectedEntries); long initialRetainedSize = arrayBlockBuilder.getRetainedSizeInBytes(); for (int i = 0; i < expectedEntries; i++) { BlockBuilder arrayElementBuilder = arrayBlockBuilder.beginBlockEntry(); BIGINT.writeLong(arrayElementBuilder, i); arrayBlockBuilder.closeEntry(); } assertTrue(arrayBlockBuilder.getRetainedSizeInBytes() >= (expectedEntries * Long.BYTES + ClassLayout.parseClass(LongArrayBlockBuilder.class).instanceSize() + initialRetainedSize)); }
private void testIsFull(PageBuilderStatus pageBuilderStatus) { BlockBuilder blockBuilder = new ArrayBlockBuilder(BIGINT, pageBuilderStatus.createBlockBuilderStatus(), EXPECTED_ENTRY_COUNT); assertTrue(pageBuilderStatus.isEmpty()); while (!pageBuilderStatus.isFull()) { BlockBuilder elementBuilder = blockBuilder.beginBlockEntry(); BIGINT.writeLong(elementBuilder, 12); elementBuilder.appendNull(); BIGINT.writeLong(elementBuilder, 34); blockBuilder.closeEntry(); } assertEquals(blockBuilder.getPositionCount(), EXPECTED_ENTRY_COUNT); assertEquals(pageBuilderStatus.isFull(), true); }