From e696cb1645f36a6a5a87e06f258b8243d024f53f Mon Sep 17 00:00:00 2001 From: Dain Sundstrom Date: Thu, 13 Jan 2022 18:19:11 -0800 Subject: [PATCH] Remove Block writePositionTo and BlockBuilder appendStructure These methods are use almost exclusively by tests and have a huge footprint in our SPI. Additionally, the methods are dangerous to use because they do not interact with Types. The methods are replaced with the existing Type appendTo or writeObject methods. --- .../io/trino/operator/GroupByIdBlock.java | 6 -- .../aggregation/BlockBuilderCopier.java | 7 +- .../arrayagg/SingleArrayAggregationState.java | 2 +- .../SingleMultimapAggregationState.java | 2 +- .../io/trino/block/AbstractTestBlock.java | 54 ----------- .../java/io/trino/block/BlockAssertions.java | 19 ++-- .../java/io/trino/block/TestArrayBlock.java | 16 ++-- .../java/io/trino/block/TestBlockBuilder.java | 7 +- .../io/trino/block/TestColumnarArray.java | 7 +- .../operator/BenchmarkUnnestOperator.java | 2 +- .../operator/scalar/BenchmarkArrayFilter.java | 2 +- .../operator/unnest/TestingUnnesterUtil.java | 13 +-- .../io/trino/type/TestArrayOperators.java | 13 +-- .../trino/spi/block/AbstractArrayBlock.java | 7 -- .../io/trino/spi/block/AbstractMapBlock.java | 7 -- .../io/trino/spi/block/AbstractRowBlock.java | 7 -- .../spi/block/AbstractSingleArrayBlock.java | 7 -- .../spi/block/AbstractSingleMapBlock.java | 12 --- .../spi/block/AbstractSingleRowBlock.java | 7 -- .../spi/block/AbstractVariableWidthBlock.java | 7 -- .../io/trino/spi/block/ArrayBlockBuilder.java | 48 +--------- .../main/java/io/trino/spi/block/Block.java | 5 -- .../java/io/trino/spi/block/BlockBuilder.java | 17 ---- .../io/trino/spi/block/ByteArrayBlock.java | 8 -- .../spi/block/ByteArrayBlockBuilder.java | 8 -- .../io/trino/spi/block/DictionaryBlock.java | 6 -- .../io/trino/spi/block/Int128ArrayBlock.java | 9 -- .../spi/block/Int128ArrayBlockBuilder.java | 9 -- .../io/trino/spi/block/Int96ArrayBlock.java | 9 -- .../spi/block/Int96ArrayBlockBuilder.java | 9 -- .../io/trino/spi/block/IntArrayBlock.java | 8 -- .../trino/spi/block/IntArrayBlockBuilder.java | 8 -- .../java/io/trino/spi/block/LazyBlock.java | 6 -- .../io/trino/spi/block/LongArrayBlock.java | 8 -- .../spi/block/LongArrayBlockBuilder.java | 8 -- .../io/trino/spi/block/MapBlockBuilder.java | 90 ------------------- .../io/trino/spi/block/RowBlockBuilder.java | 50 ----------- .../spi/block/RunLengthEncodedBlock.java | 7 -- .../io/trino/spi/block/ShortArrayBlock.java | 8 -- .../spi/block/ShortArrayBlockBuilder.java | 8 -- .../spi/block/SingleArrayBlockWriter.java | 16 ---- .../trino/spi/block/SingleMapBlockWriter.java | 26 ------ .../trino/spi/block/SingleRowBlockWriter.java | 18 ---- .../java/io/trino/spi/type/ArrayType.java | 10 ++- .../main/java/io/trino/spi/type/MapType.java | 13 ++- .../main/java/io/trino/spi/type/RowType.java | 11 ++- .../spi/block/TestArrayBlockBuilder.java | 3 +- .../hive/TestReaderProjectionsAdapter.java | 19 +--- .../BenchmarkProjectionPushdownHive.java | 2 +- 49 files changed, 80 insertions(+), 571 deletions(-) diff --git a/core/trino-main/src/main/java/io/trino/operator/GroupByIdBlock.java b/core/trino-main/src/main/java/io/trino/operator/GroupByIdBlock.java index df5c6d49b5e2..46fa4b9093c3 100644 --- a/core/trino-main/src/main/java/io/trino/operator/GroupByIdBlock.java +++ b/core/trino-main/src/main/java/io/trino/operator/GroupByIdBlock.java @@ -135,12 +135,6 @@ public void writeBytesTo(int position, int offset, int length, BlockBuilder bloc block.writeBytesTo(position, offset, length, blockBuilder); } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - block.writePositionTo(position, blockBuilder); - } - @Override public boolean equals(int position, int offset, Block otherBlock, int otherPosition, int otherOffset, int length) { diff --git a/core/trino-main/src/main/java/io/trino/operator/aggregation/BlockBuilderCopier.java b/core/trino-main/src/main/java/io/trino/operator/aggregation/BlockBuilderCopier.java index 2d612939ecaf..7321f0407843 100644 --- a/core/trino-main/src/main/java/io/trino/operator/aggregation/BlockBuilderCopier.java +++ b/core/trino-main/src/main/java/io/trino/operator/aggregation/BlockBuilderCopier.java @@ -14,12 +14,13 @@ package io.trino.operator.aggregation; import io.trino.spi.block.BlockBuilder; +import io.trino.spi.type.Type; -public class BlockBuilderCopier +public final class BlockBuilderCopier { private BlockBuilderCopier() {} - public static BlockBuilder copyBlockBuilder(BlockBuilder blockBuilder) + public static BlockBuilder copyBlockBuilder(Type type, BlockBuilder blockBuilder) { if (blockBuilder == null) { return null; @@ -27,7 +28,7 @@ public static BlockBuilder copyBlockBuilder(BlockBuilder blockBuilder) BlockBuilder copy = blockBuilder.newBlockBuilderLike(null); for (int i = 0; i < blockBuilder.getPositionCount(); i++) { - copy.appendStructure(blockBuilder.getSingleValueBlock(i)); + type.appendTo(blockBuilder, i, copy); } return copy; diff --git a/core/trino-main/src/main/java/io/trino/operator/aggregation/arrayagg/SingleArrayAggregationState.java b/core/trino-main/src/main/java/io/trino/operator/aggregation/arrayagg/SingleArrayAggregationState.java index dcc7c65c5550..3adbf406b639 100644 --- a/core/trino-main/src/main/java/io/trino/operator/aggregation/arrayagg/SingleArrayAggregationState.java +++ b/core/trino-main/src/main/java/io/trino/operator/aggregation/arrayagg/SingleArrayAggregationState.java @@ -92,6 +92,6 @@ public void reset() @Override public AccumulatorState copy() { - return new SingleArrayAggregationState(copyBlockBuilder(blockBuilder), type); + return new SingleArrayAggregationState(copyBlockBuilder(type, blockBuilder), type); } } diff --git a/core/trino-main/src/main/java/io/trino/operator/aggregation/multimapagg/SingleMultimapAggregationState.java b/core/trino-main/src/main/java/io/trino/operator/aggregation/multimapagg/SingleMultimapAggregationState.java index 29a998d2d3f0..e692f8baecad 100644 --- a/core/trino-main/src/main/java/io/trino/operator/aggregation/multimapagg/SingleMultimapAggregationState.java +++ b/core/trino-main/src/main/java/io/trino/operator/aggregation/multimapagg/SingleMultimapAggregationState.java @@ -96,6 +96,6 @@ public void reset() @Override public AccumulatorState copy() { - return new SingleMultimapAggregationState(keyType, valueType, copyBlockBuilder(keyBlockBuilder), copyBlockBuilder(valueBlockBuilder)); + return new SingleMultimapAggregationState(keyType, valueType, copyBlockBuilder(keyType, keyBlockBuilder), copyBlockBuilder(valueType, valueBlockBuilder)); } } diff --git a/core/trino-main/src/test/java/io/trino/block/AbstractTestBlock.java b/core/trino-main/src/test/java/io/trino/block/AbstractTestBlock.java index b47b4b176cfb..294e2294437f 100644 --- a/core/trino-main/src/test/java/io/trino/block/AbstractTestBlock.java +++ b/core/trino-main/src/test/java/io/trino/block/AbstractTestBlock.java @@ -36,7 +36,6 @@ import java.lang.reflect.Modifier; import java.util.Arrays; import java.util.List; -import java.util.Map; import java.util.function.Supplier; import static io.airlift.slice.SizeOf.SIZE_OF_BYTE; @@ -70,12 +69,6 @@ protected void assertBlock(Block block, Supplier newBlockBuild assertBlockPositions(block, newBlockBuilder, expectedValues); assertBlockPositions(copyBlockViaBlockSerde(block), newBlockBuilder, expectedValues); - assertBlockPositions(copyBlockViaWritePositionTo(block, newBlockBuilder), newBlockBuilder, expectedValues); - if (expectedValues.getClass().getComponentType().isArray() || - expectedValues.getClass().getComponentType() == List.class || - expectedValues.getClass().getComponentType() == Map.class) { - assertBlockPositions(copyBlockViaWriteStructure(block, newBlockBuilder), newBlockBuilder, expectedValues); - } assertBlockSize(block); assertRetainedSize(block); @@ -249,16 +242,6 @@ protected void assertBlockPosition(Block block, Supplier newBl assertPositionValue(copyBlockViaBlockSerde(block.getRegion(0, position + 1)), position, expectedValue); assertPositionValue(copyBlockViaBlockSerde(block.getRegion(position, block.getPositionCount() - position)), 0, expectedValue); - assertPositionValue(copyBlockViaWritePositionTo(block.getRegion(position, 1), newBlockBuilder), 0, expectedValue); - assertPositionValue(copyBlockViaWritePositionTo(block.getRegion(0, position + 1), newBlockBuilder), position, expectedValue); - assertPositionValue(copyBlockViaWritePositionTo(block.getRegion(position, block.getPositionCount() - position), newBlockBuilder), 0, expectedValue); - - if (expectedValueType.isArray() || expectedValueType == List.class || expectedValueType == Map.class) { - assertPositionValue(copyBlockViaWriteStructure(block.getRegion(position, 1), newBlockBuilder), 0, expectedValue); - assertPositionValue(copyBlockViaWriteStructure(block.getRegion(0, position + 1), newBlockBuilder), position, expectedValue); - assertPositionValue(copyBlockViaWriteStructure(block.getRegion(position, block.getPositionCount() - position), newBlockBuilder), 0, expectedValue); - } - assertPositionValue(block.copyRegion(position, 1), 0, expectedValue); assertPositionValue(block.copyRegion(0, position + 1), position, expectedValue); assertPositionValue(block.copyRegion(position, block.getPositionCount() - position), 0, expectedValue); @@ -432,34 +415,6 @@ private static Block copyBlockViaBlockSerde(Block block) return BLOCK_ENCODING_SERDE.readBlock(sliceOutput.slice().getInput()); } - private static Block copyBlockViaWritePositionTo(Block block, Supplier newBlockBuilder) - { - BlockBuilder blockBuilder = newBlockBuilder.get(); - for (int i = 0; i < block.getPositionCount(); i++) { - if (block.isNull(i)) { - blockBuilder.appendNull(); - } - else { - block.writePositionTo(i, blockBuilder); - } - } - return blockBuilder.build(); - } - - private static Block copyBlockViaWriteStructure(Block block, Supplier newBlockBuilder) - { - BlockBuilder blockBuilder = newBlockBuilder.get(); - for (int i = 0; i < block.getPositionCount(); i++) { - if (block.isNull(i)) { - blockBuilder.appendNull(); - } - else { - blockBuilder.appendStructure(block.getObject(i, Block.class)); - } - } - return blockBuilder.build(); - } - private static Block toSingeValuedBlock(Slice expectedValue) { BlockBuilder blockBuilder = VARBINARY.createBlockBuilder(null, 1, expectedValue.length()); @@ -504,15 +459,6 @@ protected static T[] alternatingNullValues(T[] objects) return objectsWithNulls; } - protected static Slice[] createExpectedUniqueValues(int positionCount) - { - Slice[] expectedValues = new Slice[positionCount]; - for (int position = 0; position < positionCount; position++) { - expectedValues[position] = Slices.copyOf(createExpectedValue(position)); - } - return expectedValues; - } - protected static void assertEstimatedDataSizeForStats(BlockBuilder blockBuilder, Slice[] expectedSliceValues) { Block block = blockBuilder.build(); diff --git a/core/trino-main/src/test/java/io/trino/block/BlockAssertions.java b/core/trino-main/src/test/java/io/trino/block/BlockAssertions.java index 80cf7787e5b6..ea83827a88ab 100644 --- a/core/trino-main/src/test/java/io/trino/block/BlockAssertions.java +++ b/core/trino-main/src/test/java/io/trino/block/BlockAssertions.java @@ -498,33 +498,36 @@ public static Block createRowBlock(List fieldTypes, Object[]... rows) rowBlockBuilder.appendNull(); continue; } + verify(row.length == fieldTypes.size()); BlockBuilder singleRowBlockWriter = rowBlockBuilder.beginBlockEntry(); - for (Object fieldValue : row) { + for (int fieldIndex = 0; fieldIndex < fieldTypes.size(); fieldIndex++) { + Type fieldType = fieldTypes.get(fieldIndex); + Object fieldValue = row[fieldIndex]; if (fieldValue == null) { singleRowBlockWriter.appendNull(); continue; } if (fieldValue instanceof String) { - VARCHAR.writeSlice(singleRowBlockWriter, utf8Slice((String) fieldValue)); + fieldType.writeSlice(singleRowBlockWriter, utf8Slice((String) fieldValue)); } else if (fieldValue instanceof Slice) { - VARBINARY.writeSlice(singleRowBlockWriter, (Slice) fieldValue); + fieldType.writeSlice(singleRowBlockWriter, (Slice) fieldValue); } else if (fieldValue instanceof Double) { - DOUBLE.writeDouble(singleRowBlockWriter, (Double) fieldValue); + fieldType.writeDouble(singleRowBlockWriter, (Double) fieldValue); } else if (fieldValue instanceof Long) { - BIGINT.writeLong(singleRowBlockWriter, (Long) fieldValue); + fieldType.writeLong(singleRowBlockWriter, (Long) fieldValue); } else if (fieldValue instanceof Boolean) { - BOOLEAN.writeBoolean(singleRowBlockWriter, (Boolean) fieldValue); + fieldType.writeBoolean(singleRowBlockWriter, (Boolean) fieldValue); } else if (fieldValue instanceof Block) { - singleRowBlockWriter.appendStructure((Block) fieldValue); + fieldType.writeObject(singleRowBlockWriter, fieldValue); } else if (fieldValue instanceof Integer) { - INTEGER.writeLong(singleRowBlockWriter, (Integer) fieldValue); + fieldType.writeLong(singleRowBlockWriter, (Integer) fieldValue); } else { throw new IllegalArgumentException(); diff --git a/core/trino-main/src/test/java/io/trino/block/TestArrayBlock.java b/core/trino-main/src/test/java/io/trino/block/TestArrayBlock.java index da9ff4ce0cd3..7196e5f583e2 100644 --- a/core/trino-main/src/test/java/io/trino/block/TestArrayBlock.java +++ b/core/trino-main/src/test/java/io/trino/block/TestArrayBlock.java @@ -197,20 +197,20 @@ private static BlockBuilder createBlockBuilderWithValues(long[][][] expectedValu blockBuilder.appendNull(); } else { - BlockBuilder intermediateBlockBuilder = new ArrayBlockBuilder(BIGINT, null, 100, 100); + BlockBuilder intermediateBlockBuilder = blockBuilder.beginBlockEntry(); for (int j = 0; j < expectedValue.length; j++) { if (expectedValue[j] == null) { intermediateBlockBuilder.appendNull(); } else { - BlockBuilder innerMostBlockBuilder = BIGINT.createBlockBuilder(null, expectedValue.length); + BlockBuilder innerMostBlockBuilder = intermediateBlockBuilder.beginBlockEntry(); for (long v : expectedValue[j]) { BIGINT.writeLong(innerMostBlockBuilder, v); } - intermediateBlockBuilder.appendStructure(innerMostBlockBuilder.build()); + intermediateBlockBuilder.closeEntry(); } } - blockBuilder.appendStructure(intermediateBlockBuilder.build()); + blockBuilder.closeEntry(); } } return blockBuilder; @@ -229,11 +229,11 @@ private static BlockBuilder writeValues(long[][] expectedValues, BlockBuilder bl blockBuilder.appendNull(); } else { - BlockBuilder elementBlockBuilder = BIGINT.createBlockBuilder(null, expectedValue.length); + BlockBuilder elementBlockBuilder = blockBuilder.beginBlockEntry(); for (long v : expectedValue) { BIGINT.writeLong(elementBlockBuilder, v); } - blockBuilder.appendStructure(elementBlockBuilder); + blockBuilder.closeEntry(); } } return blockBuilder; @@ -247,11 +247,11 @@ private static BlockBuilder createBlockBuilderWithValues(Slice[][] expectedValue blockBuilder.appendNull(); } else { - BlockBuilder elementBlockBuilder = VARCHAR.createBlockBuilder(null, expectedValue.length); + BlockBuilder elementBlockBuilder = blockBuilder.beginBlockEntry(); for (Slice v : expectedValue) { VARCHAR.writeSlice(elementBlockBuilder, v); } - blockBuilder.appendStructure(elementBlockBuilder.build()); + blockBuilder.closeEntry(); } } return blockBuilder; diff --git a/core/trino-main/src/test/java/io/trino/block/TestBlockBuilder.java b/core/trino-main/src/test/java/io/trino/block/TestBlockBuilder.java index 3b9dd1066acf..378c78629928 100644 --- a/core/trino-main/src/test/java/io/trino/block/TestBlockBuilder.java +++ b/core/trino-main/src/test/java/io/trino/block/TestBlockBuilder.java @@ -66,10 +66,9 @@ public void testNewBlockBuilderLike() 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); + BlockBuilder blockBuilder = longArrayType.createBlockBuilder(null, 1); + longArrayType.writeObject(blockBuilder, BIGINT.createBlockBuilder(null, 2).writeLong(i).writeLong(i * 2).build()); + arrayType.writeObject(arrayBlockBuilder, blockBuilder); pageBuilder.declarePosition(); } diff --git a/core/trino-main/src/test/java/io/trino/block/TestColumnarArray.java b/core/trino-main/src/test/java/io/trino/block/TestColumnarArray.java index 297394b38684..3888a13ced82 100644 --- a/core/trino-main/src/test/java/io/trino/block/TestColumnarArray.java +++ b/core/trino-main/src/test/java/io/trino/block/TestColumnarArray.java @@ -15,12 +15,12 @@ import io.airlift.slice.Slice; import io.airlift.slice.Slices; -import io.trino.spi.block.ArrayBlockBuilder; import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; import io.trino.spi.block.ColumnarArray; import io.trino.spi.block.DictionaryBlock; import io.trino.spi.block.RunLengthEncodedBlock; +import io.trino.spi.type.ArrayType; import org.testng.annotations.Test; import java.lang.reflect.Array; @@ -128,7 +128,8 @@ private static void assertColumnarArray(Block block, T[] expectedValues) public static BlockBuilder createBlockBuilderWithValues(Slice[][] expectedValues) { - BlockBuilder blockBuilder = new ArrayBlockBuilder(VARCHAR, null, 100, 100); + ArrayType arrayType = new ArrayType(VARCHAR); + BlockBuilder blockBuilder = arrayType.createBlockBuilder(null, 100, 100); for (Slice[] expectedValue : expectedValues) { if (expectedValue == null) { blockBuilder.appendNull(); @@ -143,7 +144,7 @@ public static BlockBuilder createBlockBuilderWithValues(Slice[][] expectedValues VARCHAR.writeSlice(elementBlockBuilder, v); } } - blockBuilder.appendStructure(elementBlockBuilder.build()); + arrayType.writeObject(blockBuilder, elementBlockBuilder.build()); } } return blockBuilder; diff --git a/core/trino-main/src/test/java/io/trino/operator/BenchmarkUnnestOperator.java b/core/trino-main/src/test/java/io/trino/operator/BenchmarkUnnestOperator.java index 04bf46a17b3c..c145efa0a7c1 100644 --- a/core/trino-main/src/test/java/io/trino/operator/BenchmarkUnnestOperator.java +++ b/core/trino-main/src/test/java/io/trino/operator/BenchmarkUnnestOperator.java @@ -326,7 +326,7 @@ private Block produceArrayBlock(ArrayType arrayType, int entries, double primiti for (int i = 0; i < entries; i++) { int arrayLength = minNestedCardinality + random.nextInt(maxNestedCardinality - minNestedCardinality); - builder.appendStructure(produceBlock(elementType, arrayLength, primitiveNullsRatio, rowNullsRatio)); + arrayType.writeObject(builder, produceBlock(elementType, arrayLength, primitiveNullsRatio, rowNullsRatio)); } return builder.build(); } diff --git a/core/trino-main/src/test/java/io/trino/operator/scalar/BenchmarkArrayFilter.java b/core/trino-main/src/test/java/io/trino/operator/scalar/BenchmarkArrayFilter.java index 1a0e9ee6158c..9f1920548d17 100644 --- a/core/trino-main/src/test/java/io/trino/operator/scalar/BenchmarkArrayFilter.java +++ b/core/trino-main/src/test/java/io/trino/operator/scalar/BenchmarkArrayFilter.java @@ -239,7 +239,7 @@ public static Block filter(Type type, Block block, MethodHandle function) throw new RuntimeException(t); } if (TRUE.equals(keep)) { - block.writePositionTo(position, resultBuilder); + type.appendTo(block, position, resultBuilder); } } return resultBuilder.build(); diff --git a/core/trino-main/src/test/java/io/trino/operator/unnest/TestingUnnesterUtil.java b/core/trino-main/src/test/java/io/trino/operator/unnest/TestingUnnesterUtil.java index 3053a82e0cf1..12da3214a7d7 100644 --- a/core/trino-main/src/test/java/io/trino/operator/unnest/TestingUnnesterUtil.java +++ b/core/trino-main/src/test/java/io/trino/operator/unnest/TestingUnnesterUtil.java @@ -15,9 +15,9 @@ import io.airlift.slice.Slice; import io.airlift.slice.Slices; -import io.trino.spi.block.ArrayBlockBuilder; import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; +import io.trino.spi.type.ArrayType; import io.trino.spi.type.RowType; import static com.google.common.base.Preconditions.checkArgument; @@ -46,14 +46,14 @@ public static Block createSimpleBlock(Slice[] values) public static Block createArrayBlock(Slice[][] values) { - BlockBuilder blockBuilder = new ArrayBlockBuilder(VARCHAR, null, 100, 100); + ArrayType arrayType = new ArrayType(VARCHAR); + BlockBuilder blockBuilder = arrayType.createBlockBuilder(null, 100, 100); for (Slice[] expectedValue : values) { if (expectedValue == null) { blockBuilder.appendNull(); } else { - Block elementBlock = createSimpleBlock(expectedValue); - blockBuilder.appendStructure(elementBlock); + arrayType.writeObject(blockBuilder, createSimpleBlock(expectedValue)); } } return blockBuilder.build(); @@ -61,7 +61,8 @@ public static Block createArrayBlock(Slice[][] values) public static Block createArrayBlockOfRowBlocks(Slice[][][] elements, RowType rowType) { - BlockBuilder arrayBlockBuilder = new ArrayBlockBuilder(rowType, null, 100, 100); + ArrayType arrayType = new ArrayType(rowType); + BlockBuilder arrayBlockBuilder = arrayType.createBlockBuilder(null, 100, 100); for (int i = 0; i < elements.length; i++) { if (elements[i] == null) { arrayBlockBuilder.appendNull(); @@ -86,7 +87,7 @@ public static Block createArrayBlockOfRowBlocks(Slice[][][] elements, RowType ro elementBlockBuilder.closeEntry(); } } - arrayBlockBuilder.appendStructure(elementBlockBuilder.build()); + arrayType.writeObject(arrayBlockBuilder, elementBlockBuilder.build()); } } return arrayBlockBuilder.build(); diff --git a/core/trino-main/src/test/java/io/trino/type/TestArrayOperators.java b/core/trino-main/src/test/java/io/trino/type/TestArrayOperators.java index 53c13cce4045..271408a116f3 100644 --- a/core/trino-main/src/test/java/io/trino/type/TestArrayOperators.java +++ b/core/trino-main/src/test/java/io/trino/type/TestArrayOperators.java @@ -22,6 +22,7 @@ import io.trino.operator.scalar.AbstractTestFunctions; import io.trino.spi.TrinoException; import io.trino.spi.block.Block; +import io.trino.spi.block.BlockBuilder; import io.trino.spi.function.LiteralParameters; import io.trino.spi.function.ScalarFunction; import io.trino.spi.function.SqlType; @@ -103,15 +104,15 @@ public static Slice uncheckedToJson(@SqlType("varchar(x)") Slice slice) @Test public void testStackRepresentation() { - Block actualBlock = arrayBlockOf(new ArrayType(BIGINT), arrayBlockOf(BIGINT, 1L, 2L), arrayBlockOf(BIGINT, 3L)); + ArrayType arrayType = new ArrayType(BIGINT); + Block actualBlock = arrayBlockOf(arrayType, arrayBlockOf(BIGINT, 1L, 2L), arrayBlockOf(BIGINT, 3L)); DynamicSliceOutput actualSliceOutput = new DynamicSliceOutput(100); writeBlock(functionAssertions.getPlannerContext().getBlockEncodingSerde(), actualSliceOutput, actualBlock); - Block expectedBlock = new ArrayType(BIGINT) - .createBlockBuilder(null, 3) - .appendStructure(BIGINT.createBlockBuilder(null, 2).writeLong(1).closeEntry().writeLong(2).closeEntry().build()) - .appendStructure(BIGINT.createBlockBuilder(null, 1).writeLong(3).closeEntry().build()) - .build(); + BlockBuilder expectedBlockBuilder = arrayType.createBlockBuilder(null, 3); + arrayType.writeObject(expectedBlockBuilder, BIGINT.createBlockBuilder(null, 2).writeLong(1).writeLong(2).build()); + arrayType.writeObject(expectedBlockBuilder, BIGINT.createBlockBuilder(null, 1).writeLong(3).build()); + Block expectedBlock = expectedBlockBuilder.build(); DynamicSliceOutput expectedSliceOutput = new DynamicSliceOutput(100); writeBlock(functionAssertions.getPlannerContext().getBlockEncodingSerde(), expectedSliceOutput, expectedBlock); diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/AbstractArrayBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/AbstractArrayBlock.java index c0a0e134ce25..10e95c45d695 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/AbstractArrayBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/AbstractArrayBlock.java @@ -167,13 +167,6 @@ public T getObject(int position, Class clazz) return clazz.cast(getRawElementBlock().getRegion(startValueOffset, endValueOffset - startValueOffset)); } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - blockBuilder.appendStructureInternal(this, position); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/AbstractMapBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/AbstractMapBlock.java index c37d64ffaf6a..e410348fe3e8 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/AbstractMapBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/AbstractMapBlock.java @@ -260,13 +260,6 @@ public T getObject(int position, Class clazz) this)); } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - blockBuilder.appendStructureInternal(this, position); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/AbstractRowBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/AbstractRowBlock.java index 80b24089d310..58e39bbd47b1 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/AbstractRowBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/AbstractRowBlock.java @@ -205,13 +205,6 @@ public T getObject(int position, Class clazz) return clazz.cast(new SingleRowBlock(getFieldBlockOffset(position), getRawFieldBlocks())); } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - blockBuilder.appendStructureInternal(this, position); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/AbstractSingleArrayBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/AbstractSingleArrayBlock.java index 4c8125698728..ed4928cd679d 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/AbstractSingleArrayBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/AbstractSingleArrayBlock.java @@ -114,13 +114,6 @@ public void writeBytesTo(int position, int offset, int length, BlockBuilder bloc getBlock().writeBytesTo(position + start, offset, length, blockBuilder); } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - getBlock().writePositionTo(position + start, blockBuilder); - } - @Override public boolean equals(int position, int offset, Block otherBlock, int otherPosition, int otherOffset, int length) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/AbstractSingleMapBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/AbstractSingleMapBlock.java index 7ff04d7fdbbe..d585d28267a3 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/AbstractSingleMapBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/AbstractSingleMapBlock.java @@ -212,18 +212,6 @@ public T getObject(int position, Class clazz) } } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - position = getAbsolutePosition(position); - if (position % 2 == 0) { - getRawKeyBlock().writePositionTo(position / 2, blockBuilder); - } - else { - getRawValueBlock().writePositionTo(position / 2, blockBuilder); - } - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/AbstractSingleRowBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/AbstractSingleRowBlock.java index 8e16755611c0..f4dc616d34b7 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/AbstractSingleRowBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/AbstractSingleRowBlock.java @@ -138,13 +138,6 @@ public T getObject(int position, Class clazz) return getRawFieldBlock(position).getObject(getRowIndex(), clazz); } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkFieldIndex(position); - getRawFieldBlock(position).writePositionTo(getRowIndex(), blockBuilder); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/AbstractVariableWidthBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/AbstractVariableWidthBlock.java index bdfabee0f23f..af8ce7aa3ded 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/AbstractVariableWidthBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/AbstractVariableWidthBlock.java @@ -120,13 +120,6 @@ public void writeBytesTo(int position, int offset, int length, BlockBuilder bloc blockBuilder.writeBytes(getRawSlice(position), getPositionOffset(position) + offset, length); } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - writeBytesTo(position, 0, getSliceLength(position), blockBuilder); - blockBuilder.closeEntry(); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/ArrayBlockBuilder.java b/core/trino-spi/src/main/java/io/trino/spi/block/ArrayBlockBuilder.java index e55cd89a982b..9d0741be8452 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/ArrayBlockBuilder.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/ArrayBlockBuilder.java @@ -146,57 +146,11 @@ public boolean mayHaveNull() return hasNullValue; } - @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 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 SingleArrayBlockWriter beginBlockEntry() { if (currentEntryOpened) { - throw new IllegalStateException("Expected current entry to be closed but was closed"); + throw new IllegalStateException("Expected current entry to be closed but was opened"); } currentEntryOpened = true; return new SingleArrayBlockWriter(values, values.getPositionCount()); diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/Block.java b/core/trino-spi/src/main/java/io/trino/spi/block/Block.java index 872daae20e65..99ece8231dfc 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/Block.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/Block.java @@ -111,11 +111,6 @@ default void writeBytesTo(int position, int offset, int length, BlockBuilder blo throw new UnsupportedOperationException(getClass().getName()); } - /** - * Appends the value at {@code position} to {@code blockBuilder} and close the entry. - */ - void writePositionTo(int position, BlockBuilder blockBuilder); - /** * Is the byte sequences at {@code offset} in the value at {@code position} equal * to the byte sequence at {@code otherOffset} in the value at {@code otherPosition} diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/BlockBuilder.java b/core/trino-spi/src/main/java/io/trino/spi/block/BlockBuilder.java index e74782fb32e6..aa05ec39b86b 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/BlockBuilder.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/BlockBuilder.java @@ -87,23 +87,6 @@ default Block getPositions(int[] visiblePositions, int offset, int length) */ BlockBuilder appendNull(); - /** - * Append a struct to the block and close the entry. - */ - default BlockBuilder appendStructure(Block value) - { - throw new UnsupportedOperationException(getClass().getName()); - } - - /** - * Do not use this interface outside block package. - * Instead, use Block.writePositionTo(BlockBuilder, position) - */ - default BlockBuilder appendStructureInternal(Block block, int position) - { - throw new UnsupportedOperationException(getClass().getName()); - } - /** * Builds the block. This method can be called multiple times. */ diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/ByteArrayBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/ByteArrayBlock.java index f99c2426f1f2..6bb663d6e502 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/ByteArrayBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/ByteArrayBlock.java @@ -147,14 +147,6 @@ public boolean isNull(int position) return valueIsNull != null && valueIsNull[position + arrayOffset]; } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - blockBuilder.writeByte(values[position + arrayOffset]); - blockBuilder.closeEntry(); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/ByteArrayBlockBuilder.java b/core/trino-spi/src/main/java/io/trino/spi/block/ByteArrayBlockBuilder.java index 5a789cc520de..afe44b4e1d02 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/ByteArrayBlockBuilder.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/ByteArrayBlockBuilder.java @@ -204,14 +204,6 @@ public boolean isNull(int position) return valueIsNull[position]; } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - blockBuilder.writeByte(values[position]); - blockBuilder.closeEntry(); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/DictionaryBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/DictionaryBlock.java index bcc112b311e1..1adb280a52db 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/DictionaryBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/DictionaryBlock.java @@ -186,12 +186,6 @@ public void writeBytesTo(int position, int offset, int length, BlockBuilder bloc dictionary.writeBytesTo(getId(position), offset, length, blockBuilder); } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - dictionary.writePositionTo(getId(position), blockBuilder); - } - @Override public boolean equals(int position, int offset, Block otherBlock, int otherPosition, int otherOffset, int length) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/Int128ArrayBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/Int128ArrayBlock.java index 1ddf66f09f78..bde239a5dfaf 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/Int128ArrayBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/Int128ArrayBlock.java @@ -151,15 +151,6 @@ public boolean isNull(int position) return valueIsNull != null && valueIsNull[position + positionOffset]; } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - blockBuilder.writeLong(values[(position + positionOffset) * 2]); - blockBuilder.writeLong(values[((position + positionOffset) * 2) + 1]); - blockBuilder.closeEntry(); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/Int128ArrayBlockBuilder.java b/core/trino-spi/src/main/java/io/trino/spi/block/Int128ArrayBlockBuilder.java index c32669c47876..cdbb4d6ccb37 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/Int128ArrayBlockBuilder.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/Int128ArrayBlockBuilder.java @@ -221,15 +221,6 @@ public boolean isNull(int position) return valueIsNull[position]; } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - blockBuilder.writeLong(values[position * 2]); - blockBuilder.writeLong(values[(position * 2) + 1]); - blockBuilder.closeEntry(); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/Int96ArrayBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/Int96ArrayBlock.java index b733196c1c1e..70ea24829d7a 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/Int96ArrayBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/Int96ArrayBlock.java @@ -165,15 +165,6 @@ public boolean isNull(int position) return valueIsNull != null && valueIsNull[position + positionOffset]; } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - blockBuilder.writeLong(high[position + positionOffset]); - blockBuilder.writeInt(low[position + positionOffset]); - blockBuilder.closeEntry(); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/Int96ArrayBlockBuilder.java b/core/trino-spi/src/main/java/io/trino/spi/block/Int96ArrayBlockBuilder.java index b39ba18d008e..d405a821cbd2 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/Int96ArrayBlockBuilder.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/Int96ArrayBlockBuilder.java @@ -254,15 +254,6 @@ public boolean isNull(int position) return valueIsNull[position]; } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - blockBuilder.writeLong(high[position]); - blockBuilder.writeInt(low[position]); - blockBuilder.closeEntry(); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/IntArrayBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/IntArrayBlock.java index 4bc48fed4907..b187f66a421b 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/IntArrayBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/IntArrayBlock.java @@ -147,14 +147,6 @@ public boolean isNull(int position) return valueIsNull != null && valueIsNull[position + arrayOffset]; } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - blockBuilder.writeInt(values[position + arrayOffset]); - blockBuilder.closeEntry(); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/IntArrayBlockBuilder.java b/core/trino-spi/src/main/java/io/trino/spi/block/IntArrayBlockBuilder.java index 889ee237d331..5f612c4ac5d2 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/IntArrayBlockBuilder.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/IntArrayBlockBuilder.java @@ -204,14 +204,6 @@ public boolean isNull(int position) return valueIsNull[position]; } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - blockBuilder.writeInt(values[position]); - blockBuilder.closeEntry(); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/LazyBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/LazyBlock.java index c23dec07b10b..0661df2cc01b 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/LazyBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/LazyBlock.java @@ -117,12 +117,6 @@ public void writeBytesTo(int position, int offset, int length, BlockBuilder bloc getBlock().writeBytesTo(position, offset, length, blockBuilder); } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - getBlock().writePositionTo(position, blockBuilder); - } - @Override public boolean equals(int position, int offset, Block otherBlock, int otherPosition, int otherOffset, int length) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/LongArrayBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/LongArrayBlock.java index 96371e267d3d..14fa6630902e 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/LongArrayBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/LongArrayBlock.java @@ -194,14 +194,6 @@ public boolean isNull(int position) return valueIsNull != null && valueIsNull[position + arrayOffset]; } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - blockBuilder.writeLong(values[position + arrayOffset]); - blockBuilder.closeEntry(); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/LongArrayBlockBuilder.java b/core/trino-spi/src/main/java/io/trino/spi/block/LongArrayBlockBuilder.java index c92d9df68efa..041fdf7b70bf 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/LongArrayBlockBuilder.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/LongArrayBlockBuilder.java @@ -251,14 +251,6 @@ public boolean isNull(int position) return valueIsNull[position]; } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - blockBuilder.writeLong(values[position]); - blockBuilder.closeEntry(); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/MapBlockBuilder.java b/core/trino-spi/src/main/java/io/trino/spi/block/MapBlockBuilder.java index cc00ea960c95..ef49b63e651b 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/MapBlockBuilder.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/MapBlockBuilder.java @@ -226,32 +226,6 @@ public void closeEntryStrict() hashTables.buildHashTableStrict(keyBlockBuilder, previousAggregatedEntryCount, entryCount); } - private void closeEntry(Optional providedHashTable, int providedHashTableOffset) - { - if (!currentEntryOpened) { - throw new IllegalStateException("Expected entry to be opened but was closed"); - } - - entryAdded(false); - currentEntryOpened = false; - - ensureHashTableSize(); - int previousAggregatedEntryCount = offsets[positionCount - 1]; - int aggregatedEntryCount = offsets[positionCount]; - - if (providedHashTable.isPresent()) { - int hashTableOffset = previousAggregatedEntryCount * HASH_MULTIPLIER; - int hashTableSize = (aggregatedEntryCount - previousAggregatedEntryCount) * HASH_MULTIPLIER; - int[] rawProvidedHashTable = providedHashTable.get(); - int[] rawHashTables = hashTables.get(); - System.arraycopy(rawProvidedHashTable, providedHashTableOffset, rawHashTables, hashTableOffset, hashTableSize); - } - else { - int entryCount = aggregatedEntryCount - previousAggregatedEntryCount; - hashTables.buildHashTable(keyBlockBuilder, previousAggregatedEntryCount, entryCount); - } - } - @Override public BlockBuilder appendNull() { @@ -320,70 +294,6 @@ public String toString() '}'; } - @Override - public BlockBuilder appendStructure(Block block) - { - if (!(block instanceof SingleMapBlock)) { - throw new IllegalArgumentException("Expected SingleMapBlock"); - } - if (currentEntryOpened) { - throw new IllegalStateException("Expected current entry to be closed but was opened"); - } - currentEntryOpened = true; - - SingleMapBlock singleMapBlock = (SingleMapBlock) block; - int blockPositionCount = singleMapBlock.getPositionCount(); - if (blockPositionCount % 2 != 0) { - throw new IllegalArgumentException(format("block position count is not even: %s", blockPositionCount)); - } - for (int i = 0; i < blockPositionCount; i += 2) { - if (singleMapBlock.isNull(i)) { - throw new IllegalArgumentException("Map keys must not be null"); - } - singleMapBlock.writePositionTo(i, keyBlockBuilder); - if (singleMapBlock.isNull(i + 1)) { - valueBlockBuilder.appendNull(); - } - else { - singleMapBlock.writePositionTo(i + 1, valueBlockBuilder); - } - } - - closeEntry(singleMapBlock.tryGetHashTable(), singleMapBlock.getOffset() / 2 * HASH_MULTIPLIER); - return this; - } - - @Override - public BlockBuilder appendStructureInternal(Block block, int position) - { - if (!(block instanceof AbstractMapBlock)) { - throw new IllegalArgumentException("Expected AbstractMapBlock"); - } - if (currentEntryOpened) { - throw new IllegalStateException("Expected current entry to be closed but was opened"); - } - currentEntryOpened = true; - - AbstractMapBlock mapBlock = (AbstractMapBlock) block; - int startValueOffset = mapBlock.getOffset(position); - int endValueOffset = mapBlock.getOffset(position + 1); - for (int i = startValueOffset; i < endValueOffset; i++) { - if (mapBlock.getRawKeyBlock().isNull(i)) { - throw new IllegalArgumentException("Map keys must not be null"); - } - mapBlock.getRawKeyBlock().writePositionTo(i, keyBlockBuilder); - if (mapBlock.getRawValueBlock().isNull(i)) { - valueBlockBuilder.appendNull(); - } - else { - mapBlock.getRawValueBlock().writePositionTo(i, valueBlockBuilder); - } - } - - closeEntry(mapBlock.getHashTables().tryGet(), startValueOffset * HASH_MULTIPLIER); - return this; - } - @Override public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/RowBlockBuilder.java b/core/trino-spi/src/main/java/io/trino/spi/block/RowBlockBuilder.java index 355cbdbd496f..0cfe1eaafae5 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/RowBlockBuilder.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/RowBlockBuilder.java @@ -232,56 +232,6 @@ public String toString() return format("RowBlockBuilder{numFields=%d, positionCount=%d", numFields, getPositionCount()); } - @Override - public BlockBuilder appendStructure(Block block) - { - if (!(block instanceof AbstractSingleRowBlock)) { - throw new IllegalStateException("Expected AbstractSingleRowBlock"); - } - if (currentEntryOpened) { - throw new IllegalStateException("Expected current entry to be closed but was opened"); - } - - int blockPositionCount = block.getPositionCount(); - if (blockPositionCount != numFields) { - throw new IllegalArgumentException(format("block position count (%s) is not equal to number of fields (%s)", blockPositionCount, numFields)); - } - for (int i = 0; i < blockPositionCount; i++) { - if (block.isNull(i)) { - fieldBlockBuilders[i].appendNull(); - } - else { - block.writePositionTo(i, fieldBlockBuilders[i]); - } - } - entryAdded(false); - return this; - } - - @Override - public BlockBuilder appendStructureInternal(Block block, int position) - { - if (!(block instanceof AbstractRowBlock)) { - throw new IllegalArgumentException(); - } - - AbstractRowBlock rowBlock = (AbstractRowBlock) block; - BlockBuilder entryBuilder = this.beginBlockEntry(); - - int fieldBlockOffset = rowBlock.getFieldBlockOffset(position); - for (int i = 0; i < rowBlock.numFields; i++) { - if (rowBlock.getRawFieldBlocks()[i].isNull(fieldBlockOffset)) { - entryBuilder.appendNull(); - } - else { - rowBlock.getRawFieldBlocks()[i].writePositionTo(fieldBlockOffset, entryBuilder); - } - } - - closeEntry(); - return this; - } - @Override public BlockBuilder newBlockBuilderLike(BlockBuilderStatus blockBuilderStatus) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/RunLengthEncodedBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/RunLengthEncodedBlock.java index b048e3e391b9..a438690ea79a 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/RunLengthEncodedBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/RunLengthEncodedBlock.java @@ -236,13 +236,6 @@ public void writeBytesTo(int position, int offset, int length, BlockBuilder bloc value.writeBytesTo(0, offset, length, blockBuilder); } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - value.writePositionTo(0, blockBuilder); - } - @Override public boolean equals(int position, int offset, Block otherBlock, int otherPosition, int otherOffset, int length) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/ShortArrayBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/ShortArrayBlock.java index cf38a0882f3c..5a29e15837fc 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/ShortArrayBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/ShortArrayBlock.java @@ -147,14 +147,6 @@ public boolean isNull(int position) return valueIsNull != null && valueIsNull[position + arrayOffset]; } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - blockBuilder.writeShort(values[position + arrayOffset]); - blockBuilder.closeEntry(); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/ShortArrayBlockBuilder.java b/core/trino-spi/src/main/java/io/trino/spi/block/ShortArrayBlockBuilder.java index 94854b35a573..a04cd9bd0825 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/ShortArrayBlockBuilder.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/ShortArrayBlockBuilder.java @@ -204,14 +204,6 @@ public boolean isNull(int position) return valueIsNull[position]; } - @Override - public void writePositionTo(int position, BlockBuilder blockBuilder) - { - checkReadablePosition(position); - blockBuilder.writeShort(values[position]); - blockBuilder.closeEntry(); - } - @Override public Block getSingleValueBlock(int position) { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/SingleArrayBlockWriter.java b/core/trino-spi/src/main/java/io/trino/spi/block/SingleArrayBlockWriter.java index 3ea2767666a3..1eb9c88bb1d7 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/SingleArrayBlockWriter.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/SingleArrayBlockWriter.java @@ -97,22 +97,6 @@ public BlockBuilder writeBytes(Slice source, int sourceIndex, int length) return this; } - @Override - public BlockBuilder appendStructure(Block block) - { - blockBuilder.appendStructure(block); - entryAdded(); - return this; - } - - @Override - public BlockBuilder appendStructureInternal(Block block, int position) - { - blockBuilder.appendStructureInternal(block, position); - entryAdded(); - return this; - } - @Override public BlockBuilder beginBlockEntry() { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/SingleMapBlockWriter.java b/core/trino-spi/src/main/java/io/trino/spi/block/SingleMapBlockWriter.java index 640e6913c46d..00627e1c3b37 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/SingleMapBlockWriter.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/SingleMapBlockWriter.java @@ -148,32 +148,6 @@ public BlockBuilder writeBytes(Slice source, int sourceIndex, int length) return this; } - @Override - public BlockBuilder appendStructure(Block block) - { - if (writeToValueNext) { - valueBlockBuilder.appendStructure(block); - } - else { - keyBlockBuilder.appendStructure(block); - } - entryAdded(); - return this; - } - - @Override - public BlockBuilder appendStructureInternal(Block block, int position) - { - if (writeToValueNext) { - valueBlockBuilder.appendStructureInternal(block, position); - } - else { - keyBlockBuilder.appendStructureInternal(block, position); - } - entryAdded(); - return this; - } - @Override public BlockBuilder beginBlockEntry() { diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/SingleRowBlockWriter.java b/core/trino-spi/src/main/java/io/trino/spi/block/SingleRowBlockWriter.java index f12dfc85c653..926938dcf16e 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/SingleRowBlockWriter.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/SingleRowBlockWriter.java @@ -146,24 +146,6 @@ public BlockBuilder writeBytes(Slice source, int sourceIndex, int length) return this; } - @Override - public BlockBuilder appendStructure(Block block) - { - checkFieldIndexToWrite(); - fieldBlockBuilders[currentFieldIndexToWrite].appendStructure(block); - entryAdded(); - return this; - } - - @Override - public BlockBuilder appendStructureInternal(Block block, int position) - { - checkFieldIndexToWrite(); - fieldBlockBuilders[currentFieldIndexToWrite].appendStructureInternal(block, position); - entryAdded(); - return this; - } - @Override public BlockBuilder beginBlockEntry() { diff --git a/core/trino-spi/src/main/java/io/trino/spi/type/ArrayType.java b/core/trino-spi/src/main/java/io/trino/spi/type/ArrayType.java index e577c7611aba..f1ed1506f37e 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/type/ArrayType.java +++ b/core/trino-spi/src/main/java/io/trino/spi/type/ArrayType.java @@ -219,7 +219,7 @@ public void appendTo(Block block, int position, BlockBuilder blockBuilder) blockBuilder.appendNull(); } else { - block.writePositionTo(position, blockBuilder); + writeObject(blockBuilder, getObject(block, position)); } } @@ -250,7 +250,13 @@ public Block getObject(Block block, int position) @Override public void writeObject(BlockBuilder blockBuilder, Object value) { - blockBuilder.appendStructure((Block) value); + Block arrayBlock = (Block) value; + + BlockBuilder entryBuilder = blockBuilder.beginBlockEntry(); + for (int i = 0; i < arrayBlock.getPositionCount(); i++) { + elementType.appendTo(arrayBlock, i, entryBuilder); + } + blockBuilder.closeEntry(); } @Override diff --git a/core/trino-spi/src/main/java/io/trino/spi/type/MapType.java b/core/trino-spi/src/main/java/io/trino/spi/type/MapType.java index bcf4958799e8..b741abaed7f8 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/type/MapType.java +++ b/core/trino-spi/src/main/java/io/trino/spi/type/MapType.java @@ -235,7 +235,7 @@ public void appendTo(Block block, int position, BlockBuilder blockBuilder) blockBuilder.appendNull(); } else { - block.writePositionTo(position, blockBuilder); + writeObject(blockBuilder, getObject(block, position)); } } @@ -251,7 +251,16 @@ public void writeObject(BlockBuilder blockBuilder, Object value) if (!(value instanceof SingleMapBlock)) { throw new IllegalArgumentException("Maps must be represented with SingleMapBlock"); } - blockBuilder.appendStructure((Block) value); + + SingleMapBlock singleMapBlock = (SingleMapBlock) value; + BlockBuilder entryBuilder = blockBuilder.beginBlockEntry(); + + for (int i = 0; i < singleMapBlock.getPositionCount(); i += 2) { + keyType.appendTo(singleMapBlock, i, entryBuilder); + valueType.appendTo(singleMapBlock, i + 1, entryBuilder); + } + + blockBuilder.closeEntry(); } @Override diff --git a/core/trino-spi/src/main/java/io/trino/spi/type/RowType.java b/core/trino-spi/src/main/java/io/trino/spi/type/RowType.java index 487f2d4b7def..07ad42c3727a 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/type/RowType.java +++ b/core/trino-spi/src/main/java/io/trino/spi/type/RowType.java @@ -235,7 +235,7 @@ public void appendTo(Block block, int position, BlockBuilder blockBuilder) blockBuilder.appendNull(); } else { - block.writePositionTo(position, blockBuilder); + writeObject(blockBuilder, getObject(block, position)); } } @@ -248,7 +248,14 @@ public Block getObject(Block block, int position) @Override public void writeObject(BlockBuilder blockBuilder, Object value) { - blockBuilder.appendStructure((Block) value); + Block rowBlock = (Block) value; + + BlockBuilder entryBuilder = blockBuilder.beginBlockEntry(); + for (int i = 0; i < rowBlock.getPositionCount(); i++) { + fields.get(i).getType().appendTo(rowBlock, i, entryBuilder); + } + + blockBuilder.closeEntry(); } @Override diff --git a/core/trino-spi/src/test/java/io/trino/spi/block/TestArrayBlockBuilder.java b/core/trino-spi/src/test/java/io/trino/spi/block/TestArrayBlockBuilder.java index 1f95cde83927..5d669ac76f4c 100644 --- a/core/trino-spi/src/test/java/io/trino/spi/block/TestArrayBlockBuilder.java +++ b/core/trino-spi/src/test/java/io/trino/spi/block/TestArrayBlockBuilder.java @@ -69,8 +69,7 @@ public void testConcurrentWriting() BlockBuilder blockBuilder = new ArrayBlockBuilder(BIGINT, null, EXPECTED_ENTRY_COUNT); BlockBuilder elementBlockWriter = blockBuilder.beginBlockEntry(); elementBlockWriter.writeLong(45).closeEntry(); - Block longArrayBlockBuilder = new LongArrayBlockBuilder(null, 1).writeLong(123).closeEntry().build(); - assertThatThrownBy(() -> blockBuilder.appendStructure(longArrayBlockBuilder)) + assertThatThrownBy(blockBuilder::beginBlockEntry) .isInstanceOf(IllegalStateException.class) .hasMessage("Expected current entry to be closed but was opened"); } diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestReaderProjectionsAdapter.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestReaderProjectionsAdapter.java index f71acfabf75b..eac2452834e4 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestReaderProjectionsAdapter.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestReaderProjectionsAdapter.java @@ -270,24 +270,7 @@ private static Block createProjectedColumnBlock(Block data, Type finalType, Type else { int lastDereference = dereferences.get(dereferences.size() - 1); - if (currentData.isNull(lastDereference)) { - // Append null if the last dereference is null - builder.appendNull(); - } - else { - // Append actual values otherwise - if (finalType.equals(BIGINT)) { - Long value = currentData.getLong(lastDereference, 0); - builder.writeLong(value); - } - else if (finalType instanceof RowType) { - Block block = currentData.getObject(lastDereference, Block.class); - builder.appendStructure(block); - } - else { - throw new UnsupportedOperationException(); - } - } + finalType.appendTo(currentData, lastDereference, builder); } } diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/benchmark/BenchmarkProjectionPushdownHive.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/benchmark/BenchmarkProjectionPushdownHive.java index 66817fae6af9..a243696b549f 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/benchmark/BenchmarkProjectionPushdownHive.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/benchmark/BenchmarkProjectionPushdownHive.java @@ -288,7 +288,7 @@ else if (type instanceof ArrayType) { BlockBuilder blockBuilder = type.createBlockBuilder(null, rowCount); for (int i = 0; i < rowCount; i++) { Block elementBlock = createBlock(elementType, DEFAULT_ARRAY_SIZE); - blockBuilder.appendStructure(elementBlock); + type.writeObject(blockBuilder, elementBlock); } return blockBuilder.build();