Skip to content

Commit

Permalink
Introduce newBlockBuilderLike() with expectedEntries
Browse files Browse the repository at this point in the history
  • Loading branch information
Ying Su authored and mbasmanova committed Oct 23, 2020
1 parent ee56436 commit 8ad5079
Show file tree
Hide file tree
Showing 14 changed files with 134 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import static com.facebook.presto.common.block.BlockUtil.calculateBlockResetSize;
import static io.airlift.slice.SizeOf.sizeOf;
import static java.lang.Math.max;
import static java.lang.Math.toIntExact;
import static java.util.Objects.requireNonNull;

public class ArrayBlockBuilder
Expand Down Expand Up @@ -292,6 +293,14 @@ public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus)
return new ArrayBlockBuilder(blockBuilderStatus, values.newBlockBuilderLike(blockBuilderStatus), newSize);
}

@Override
public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus, int expectedEntries)
{
int newSize = max(calculateBlockResetSize(positionCount), expectedEntries);
int valueExpectedEntries = positionCount == 0 ? expectedEntries : toIntExact((long) offsets[positionCount] * newSize / positionCount);
return new ArrayBlockBuilder(blockBuilderStatus, values.newBlockBuilderLike(blockBuilderStatus, valueExpectedEntries), newSize);
}

@Override
public String toString()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,9 @@ default BlockBuilder appendStructureInternal(Block block, int position)
* Creates a new block builder of the same type based on the current usage statistics of this block builder.
*/
BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus);

/**
* Creates a new block builder of the same type based on the expectedEntries and the current usage statistics of this block builder.
*/
BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus, int expectedEntries);
}
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,12 @@ public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus)
return new ByteArrayBlockBuilder(blockBuilderStatus, calculateBlockResetSize(positionCount));
}

@Override
public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus, int expectedEntries)
{
return new ByteArrayBlockBuilder(blockBuilderStatus, max(calculateBlockResetSize(positionCount), expectedEntries));
}

private void growCapacity()
{
int newSize;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,12 @@ public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus)
return new Int128ArrayBlockBuilder(blockBuilderStatus, calculateBlockResetSize(positionCount));
}

@Override
public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus, int expectedEntries)
{
return new Int128ArrayBlockBuilder(blockBuilderStatus, max(calculateBlockResetSize(positionCount), expectedEntries));
}

private void growCapacity()
{
int newSize;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,12 @@ public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus)
return new IntArrayBlockBuilder(blockBuilderStatus, calculateBlockResetSize(positionCount));
}

@Override
public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus, int expectedEntries)
{
return new IntArrayBlockBuilder(blockBuilderStatus, max(calculateBlockResetSize(positionCount), expectedEntries));
}

private void growCapacity()
{
int newSize;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ public LongArrayBlockBuilder(@Nullable BlockBuilderStatus blockBuilderStatus, in
{
this.blockBuilderStatus = blockBuilderStatus;
this.initialEntryCount = max(expectedEntries, 1);

updateDataSize();
}

Expand Down Expand Up @@ -115,6 +114,12 @@ public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus)
return new LongArrayBlockBuilder(blockBuilderStatus, calculateBlockResetSize(positionCount));
}

@Override
public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus, int expectedEntries)
{
return new LongArrayBlockBuilder(blockBuilderStatus, max(calculateBlockResetSize(positionCount), expectedEntries));
}

private void growCapacity()
{
int newSize;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
import static com.facebook.presto.common.block.BlockUtil.calculateBlockResetSize;
import static com.facebook.presto.common.block.MapBlock.createMapBlockInternal;
import static io.airlift.slice.SizeOf.sizeOf;
import static java.lang.Math.max;
import static java.lang.Math.toIntExact;
import static java.lang.String.format;
import static java.util.Objects.requireNonNull;

Expand Down Expand Up @@ -455,6 +457,22 @@ public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus)
newNegativeOneFilledArray(newSize * HASH_MULTIPLIER));
}

@Override
public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus, int expectedEntries)
{
int newSize = max(calculateBlockResetSize(getPositionCount()), expectedEntries);
int nestedExpectedEntries = positionCount == 0 ? expectedEntries : toIntExact((long) offsets[positionCount] * newSize / positionCount);
return new MapBlockBuilder(
keyBlockEquals,
keyBlockHashCode,
blockBuilderStatus,
keyBlockBuilder.newBlockBuilderLike(blockBuilderStatus, nestedExpectedEntries),
valueBlockBuilder.newBlockBuilderLike(blockBuilderStatus, nestedExpectedEntries),
new int[newSize + 1],
new boolean[newSize],
newNegativeOneFilledArray(newSize * HASH_MULTIPLIER));
}

@Override
protected void ensureHashTableLoaded(MethodHandle keyBlockHashCode) {}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
import static com.facebook.presto.common.block.BlockUtil.calculateBlockResetSize;
import static com.facebook.presto.common.block.RowBlock.createRowBlockInternal;
import static io.airlift.slice.SizeOf.sizeOf;
import static java.lang.Math.max;
import static java.lang.Math.toIntExact;
import static java.lang.String.format;
import static java.util.Objects.requireNonNull;

Expand Down Expand Up @@ -298,4 +300,16 @@ public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus)
}
return new RowBlockBuilder(blockBuilderStatus, newBlockBuilders, new int[newSize + 1], new boolean[newSize]);
}

@Override
public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus, int expectedEntries)
{
int newSize = max(calculateBlockResetSize(getPositionCount()), expectedEntries);
BlockBuilder[] newBlockBuilders = new BlockBuilder[numFields];
int nestedExpectedEntries = positionCount == 0 ? expectedEntries : toIntExact((long) fieldBlockOffsets[positionCount] * newSize / positionCount);
for (int i = 0; i < numFields; i++) {
newBlockBuilders[i] = fieldBlockBuilders[i].newBlockBuilderLike(blockBuilderStatus, nestedExpectedEntries);
}
return new RowBlockBuilder(blockBuilderStatus, newBlockBuilders, new int[newSize + 1], new boolean[newSize]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,12 @@ public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus)
return new ShortArrayBlockBuilder(blockBuilderStatus, calculateBlockResetSize(positionCount));
}

@Override
public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus, int expectedEntries)
{
return new ShortArrayBlockBuilder(blockBuilderStatus, max(calculateBlockResetSize(positionCount), expectedEntries));
}

private void growCapacity()
{
int newSize;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,12 @@ public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus)
throw new UnsupportedOperationException();
}

@Override
public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus, int expectedEntries)
{
throw new UnsupportedOperationException();
}

@Override
public String toString()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,12 @@ public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus)
throw new UnsupportedOperationException();
}

@Override
public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus, int expectedEntries)
{
throw new UnsupportedOperationException();
}

@Override
public String toString()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,12 @@ public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus)
throw new UnsupportedOperationException();
}

@Override
public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus, int expectedEntries)
{
throw new UnsupportedOperationException();
}

@Override
public String toString()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,9 @@
import static io.airlift.slice.SizeOf.SIZE_OF_LONG;
import static io.airlift.slice.SizeOf.SIZE_OF_SHORT;
import static io.airlift.slice.SizeOf.sizeOf;
import static java.lang.Math.max;
import static java.lang.Math.min;
import static java.lang.Math.toIntExact;

public class VariableWidthBlockBuilder
extends AbstractVariableWidthBlock
Expand Down Expand Up @@ -381,6 +383,16 @@ public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus)
return new VariableWidthBlockBuilder(blockBuilderStatus, calculateBlockResetSize(positions), calculateBlockResetBytes(currentSizeInBytes));
}

@Override
public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus, int expectedEntries)
{
int newSize = max(calculateBlockResetSize(positions), expectedEntries);
int currentSizeInBytes = offsets[positions];
return new VariableWidthBlockBuilder(blockBuilderStatus,
newSize,
max(calculateBlockResetBytes(currentSizeInBytes), positions == 0 ? currentSizeInBytes : toIntExact((long) currentSizeInBytes * newSize / positions)));
}

private int getOffset(int position)
{
return offsets[position];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,12 @@
import org.testng.annotations.Test;

import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.IntStream;

import static com.facebook.presto.block.BlockAssertions.assertBlockEquals;
import static com.facebook.presto.common.block.ArrayBlock.fromElementBlock;
import static com.facebook.presto.common.type.BigintType.BIGINT;
import static com.facebook.presto.common.type.VarcharType.VARCHAR;
import static org.testng.Assert.assertEquals;
Expand Down Expand Up @@ -80,6 +83,31 @@ public void testNewBlockBuilderLike()
assertEquals(newPageBuilder.getBlockBuilder(i).getPositionCount(), 0);
assertTrue(newPageBuilder.getBlockBuilder(i).getRetainedSizeInBytes() < pageBuilder.getBlockBuilder(i).getRetainedSizeInBytes());
}

BlockBuilder newBigintBlockBuilder = bigintBlockBuilder.newBlockBuilderLike(null, 200);
assertEquals(newBigintBlockBuilder.getPositionCount(), 0);
assertEquals(newBigintBlockBuilder.getRetainedSizeInBytes(), 80);
newBigintBlockBuilder.writeLong(0);
assertEquals(newBigintBlockBuilder.getPositionCount(), 1);
// Reserved 200 longs and booleans for nulls array
assertEquals(newBigintBlockBuilder.getRetainedSizeInBytes(), 1880);

BlockBuilder newVarcharBlockBuilder = varcharBlockBuilder.newBlockBuilderLike(null, 200);
assertEquals(newVarcharBlockBuilder.getPositionCount(), 0);
assertEquals(newVarcharBlockBuilder.getRetainedSizeInBytes(), 164);
newVarcharBlockBuilder.writeLong(0);
newVarcharBlockBuilder.closeEntry();
assertEquals(newVarcharBlockBuilder.getPositionCount(), 1);
// Reserved 200 varchars of average length 5.9, and 201 ints for offsets and 200 booleans for nulls
assertEquals(newVarcharBlockBuilder.getRetainedSizeInBytes(), 2360);

BlockBuilder newArrayBlockBuilder = arrayBlockBuilder.newBlockBuilderLike(null, 200);
assertEquals(newArrayBlockBuilder.getPositionCount(), 0);
assertEquals(newArrayBlockBuilder.getRetainedSizeInBytes(), 248);
newArrayBlockBuilder.appendStructure(fromElementBlock(1, Optional.empty(), IntStream.range(0, 2).toArray(), newBigintBlockBuilder.build()));
assertEquals(newArrayBlockBuilder.getPositionCount(), 1);
// Reserved 200 ARRAY(ARRAY(BIGINT)), and 201 ints for offsets and 200 booleans for nulls
assertEquals(newArrayBlockBuilder.getRetainedSizeInBytes(), 5848);
}

@Test
Expand Down

0 comments on commit 8ad5079

Please sign in to comment.