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();