diff --git a/core/trino-spi/pom.xml b/core/trino-spi/pom.xml index 467a0a4a8400..365627801ea9 100644 --- a/core/trino-spi/pom.xml +++ b/core/trino-spi/pom.xml @@ -1036,6 +1036,169 @@ java.method.removed method void io.trino.spi.block.VariableWidthBlock::writeSliceTo(int, int, int, io.airlift.slice.SliceOutput) + + java.class.nowFinal + class io.trino.spi.block.ArrayBlock + class io.trino.spi.block.ArrayBlock + + + java.class.nowFinal + class io.trino.spi.block.ByteArrayBlock + class io.trino.spi.block.ByteArrayBlock + + + java.class.nowFinal + class io.trino.spi.block.DictionaryBlock + class io.trino.spi.block.DictionaryBlock + + + java.class.nowFinal + class io.trino.spi.block.Fixed12Block + class io.trino.spi.block.Fixed12Block + + + java.class.nowFinal + class io.trino.spi.block.Int128ArrayBlock + class io.trino.spi.block.Int128ArrayBlock + + + java.class.nowFinal + class io.trino.spi.block.IntArrayBlock + class io.trino.spi.block.IntArrayBlock + + + java.class.nowFinal + class io.trino.spi.block.LazyBlock + class io.trino.spi.block.LazyBlock + + + java.class.nowFinal + class io.trino.spi.block.LongArrayBlock + class io.trino.spi.block.LongArrayBlock + + + java.class.nowFinal + class io.trino.spi.block.MapBlock + class io.trino.spi.block.MapBlock + + + java.class.nowFinal + class io.trino.spi.block.RowBlock + class io.trino.spi.block.RowBlock + + + java.class.nowFinal + class io.trino.spi.block.RunLengthEncodedBlock + class io.trino.spi.block.RunLengthEncodedBlock + + + java.class.nowFinal + class io.trino.spi.block.ShortArrayBlock + class io.trino.spi.block.ShortArrayBlock + + + java.class.nowFinal + class io.trino.spi.block.VariableWidthBlock + class io.trino.spi.block.VariableWidthBlock + + + java.method.visibilityReduced + method int io.trino.spi.block.ArrayBlock::getOffsetBase() + method int io.trino.spi.block.ArrayBlock::getOffsetBase() + protected + package + + + java.method.visibilityReduced + method int[] io.trino.spi.block.ArrayBlock::getOffsets() + method int[] io.trino.spi.block.ArrayBlock::getOffsets() + protected + package + + + java.method.visibilityReduced + method io.trino.spi.block.Block io.trino.spi.block.ArrayBlock::getRawElementBlock() + method io.trino.spi.block.Block io.trino.spi.block.ArrayBlock::getRawElementBlock() + protected + package + + + java.method.visibilityReduced + method void io.trino.spi.block.MapBlock::ensureHashTableLoaded() + method void io.trino.spi.block.MapBlock::ensureHashTableLoaded() + protected + package + + + java.method.visibilityReduced + method io.trino.spi.block.MapHashTables io.trino.spi.block.MapBlock::getHashTables() + method io.trino.spi.block.MapHashTables io.trino.spi.block.MapBlock::getHashTables() + protected + package + + + java.method.visibilityReduced + method io.trino.spi.type.MapType io.trino.spi.block.MapBlock::getMapType() + method io.trino.spi.type.MapType io.trino.spi.block.MapBlock::getMapType() + protected + package + + + java.method.visibilityReduced + method int io.trino.spi.block.MapBlock::getOffsetBase() + method int io.trino.spi.block.MapBlock::getOffsetBase() + protected + package + + + java.method.visibilityReduced + method int[] io.trino.spi.block.MapBlock::getOffsets() + method int[] io.trino.spi.block.MapBlock::getOffsets() + protected + package + + + java.method.visibilityReduced + method io.trino.spi.block.Block io.trino.spi.block.MapBlock::getRawKeyBlock() + method io.trino.spi.block.Block io.trino.spi.block.MapBlock::getRawKeyBlock() + protected + package + + + java.method.visibilityReduced + method io.trino.spi.block.Block io.trino.spi.block.MapBlock::getRawValueBlock() + method io.trino.spi.block.Block io.trino.spi.block.MapBlock::getRawValueBlock() + protected + package + + + java.method.visibilityReduced + method int[] io.trino.spi.block.RowBlock::getFieldBlockOffsets() + method int[] io.trino.spi.block.RowBlock::getFieldBlockOffsets() + protected + package + + + java.method.visibilityReduced + method int io.trino.spi.block.RowBlock::getOffsetBase() + method int io.trino.spi.block.RowBlock::getOffsetBase() + protected + package + + + java.method.visibilityReduced + method java.util.List<io.trino.spi.block.Block> io.trino.spi.block.RowBlock::getRawFieldBlocks() + method java.util.List<io.trino.spi.block.Block> io.trino.spi.block.RowBlock::getRawFieldBlocks() + protected + package + + + java.method.visibilityReduced + method int io.trino.spi.block.VariableWidthBlock::getPositionOffset(int) + method int io.trino.spi.block.VariableWidthBlock::getPositionOffset(int) + protected + package + diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/ArrayBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/ArrayBlock.java index a95abd2700bc..9aad1d9da67e 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/ArrayBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/ArrayBlock.java @@ -36,7 +36,7 @@ import static java.util.Collections.singletonList; import static java.util.Objects.requireNonNull; -public class ArrayBlock +public final class ArrayBlock implements ValueBlock { private static final int INSTANCE_SIZE = instanceSize(ArrayBlock.class); @@ -73,7 +73,7 @@ public static ArrayBlock fromElementBlock(int positionCount, Optional } /** - * Create an array block directly without per element validations. + * Create an array block directly without per-element validations. */ static ArrayBlock createArrayBlockInternal(int arrayOffset, int positionCount, @Nullable boolean[] valueIsNull, int[] offsets, Block values) { @@ -167,23 +167,23 @@ public void retainedBytesForEachPart(ObjLongConsumer consumer) consumer.accept(this, INSTANCE_SIZE); } - protected Block getRawElementBlock() + Block getRawElementBlock() { return values; } - protected int[] getOffsets() + int[] getOffsets() { return offsets; } - protected int getOffsetBase() + int getOffsetBase() { return arrayOffset; } @Override - public final List getChildren() + public List getChildren() { return singletonList(values); } @@ -310,7 +310,7 @@ public long getRegionSizeInBytes(int position, int length) } @Override - public final long getPositionsSizeInBytes(boolean[] positions, int selectedArrayPositions) + public long getPositionsSizeInBytes(boolean[] positions, int selectedArrayPositions) { int positionCount = getPositionCount(); checkValidPositions(positions, positionCount); 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 e712cfdb3ef0..5cf302fd2d44 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 @@ -23,7 +23,8 @@ import static io.trino.spi.block.BlockUtil.checkArrayRange; import static io.trino.spi.block.DictionaryId.randomDictionaryId; -public interface Block +public sealed interface Block + permits DictionaryBlock, RunLengthEncodedBlock, LazyBlock, ValueBlock { /** * Gets the length of the value at the {@code position}. 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 44d45ca0a4c7..744c6753445c 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 @@ -30,7 +30,7 @@ import static io.trino.spi.block.BlockUtil.copyIsNullAndAppendNull; import static io.trino.spi.block.BlockUtil.ensureCapacity; -public class ByteArrayBlock +public final class ByteArrayBlock implements ValueBlock { private static final int INSTANCE_SIZE = instanceSize(ByteArrayBlock.class); 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 a110d1897d1e..cfb7a67de253 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 @@ -32,7 +32,7 @@ import static java.util.Collections.singletonList; import static java.util.Objects.requireNonNull; -public class DictionaryBlock +public final class DictionaryBlock implements Block { private static final int INSTANCE_SIZE = instanceSize(DictionaryBlock.class) + instanceSize(DictionaryId.class); @@ -526,7 +526,7 @@ public String toString() } @Override - public final List getChildren() + public List getChildren() { return singletonList(getDictionary()); } @@ -694,7 +694,7 @@ public static List compactRelatedBlocks(List b positionCount, compactDictionary, newIds, - !(compactDictionary instanceof DictionaryBlock), + true, false, newDictionaryId)); } diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/Fixed12Block.java b/core/trino-spi/src/main/java/io/trino/spi/block/Fixed12Block.java index 92ef4cf88c30..f38e059ad2f6 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/Fixed12Block.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/Fixed12Block.java @@ -28,7 +28,7 @@ import static io.trino.spi.block.BlockUtil.copyIsNullAndAppendNull; import static io.trino.spi.block.BlockUtil.ensureCapacity; -public class Fixed12Block +public final class Fixed12Block implements ValueBlock { private static final int INSTANCE_SIZE = instanceSize(Fixed12Block.class); 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 641c23ac4d9c..57b8e4ac9bd4 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 @@ -29,7 +29,7 @@ import static io.trino.spi.block.BlockUtil.copyIsNullAndAppendNull; import static io.trino.spi.block.BlockUtil.ensureCapacity; -public class Int128ArrayBlock +public final class Int128ArrayBlock implements ValueBlock { private static final int INSTANCE_SIZE = instanceSize(Int128ArrayBlock.class); 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 2aa843d23a29..93fa86da8456 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 @@ -29,7 +29,7 @@ import static io.trino.spi.block.BlockUtil.copyIsNullAndAppendNull; import static io.trino.spi.block.BlockUtil.ensureCapacity; -public class IntArrayBlock +public final class IntArrayBlock implements ValueBlock { private static final int INSTANCE_SIZE = instanceSize(IntArrayBlock.class); 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 bf6c6515903c..8579f7ca93fb 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 @@ -30,7 +30,7 @@ import static java.util.Objects.requireNonNull; // This class is not considered thread-safe. -public class LazyBlock +public final class LazyBlock implements Block { private static final int INSTANCE_SIZE = instanceSize(LazyBlock.class) + instanceSize(LazyData.class); @@ -213,7 +213,7 @@ public boolean mayHaveNull() } @Override - public final List getChildren() + public List getChildren() { return singletonList(getBlock()); } @@ -390,7 +390,7 @@ private void load(boolean recursive) } /** - * If block is unloaded, add the listeners; otherwise call this method on child blocks + * If the block is unloaded, add the listeners; otherwise call this method on child blocks */ @SuppressWarnings("AccessingNonPublicFieldOfAnotherObject") private static void addListenersRecursive(Block block, List> listeners) 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 e0b39437b01a..2b9aec633844 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 @@ -29,7 +29,7 @@ import static io.trino.spi.block.BlockUtil.ensureCapacity; import static java.lang.Math.toIntExact; -public class LongArrayBlock +public final class LongArrayBlock implements ValueBlock { private static final int INSTANCE_SIZE = instanceSize(LongArrayBlock.class); diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/MapBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/MapBlock.java index 63d53285597d..d7c78df45d46 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/MapBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/MapBlock.java @@ -40,7 +40,7 @@ import static java.lang.String.format; import static java.util.Objects.requireNonNull; -public class MapBlock +public final class MapBlock implements ValueBlock { private static final int INSTANCE_SIZE = instanceSize(MapBlock.class); @@ -187,27 +187,27 @@ private MapBlock( this.retainedSizeInBytes = INSTANCE_SIZE + sizeOf(offsets) + sizeOf(mapIsNull); } - protected Block getRawKeyBlock() + Block getRawKeyBlock() { return keyBlock; } - protected Block getRawValueBlock() + Block getRawValueBlock() { return valueBlock; } - protected MapHashTables getHashTables() + MapHashTables getHashTables() { return hashTables; } - protected int[] getOffsets() + int[] getOffsets() { return offsets; } - protected int getOffsetBase() + int getOffsetBase() { return startOffset; } @@ -302,7 +302,7 @@ public Block getLoadedBlock() hashTables); } - protected void ensureHashTableLoaded() + void ensureHashTableLoaded() { hashTables.buildAllHashTablesIfNecessary(keyBlock, offsets, mapIsNull); } @@ -325,12 +325,12 @@ public MapBlock copyWithAppendedNull() } @Override - public final List getChildren() + public List getChildren() { return List.of(keyBlock, valueBlock); } - protected MapType getMapType() + MapType getMapType() { return mapType; } @@ -460,7 +460,7 @@ private OptionalInt keyAndValueFixedSizeInBytesPerRow() } @Override - public final long getPositionsSizeInBytes(boolean[] positions, int selectedMapPositions) + public long getPositionsSizeInBytes(boolean[] positions, int selectedMapPositions) { int positionCount = getPositionCount(); checkValidPositions(positions, positionCount); diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/RowBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/RowBlock.java index 29240dc835f3..ba373813e9d8 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/RowBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/RowBlock.java @@ -35,7 +35,7 @@ import static java.lang.String.format; import static java.util.Objects.requireNonNull; -public class RowBlock +public final class RowBlock implements ValueBlock { private static final int INSTANCE_SIZE = instanceSize(RowBlock.class); @@ -144,18 +144,18 @@ private RowBlock(int startOffset, int positionCount, @Nullable boolean[] rowIsNu this.retainedSizeInBytes = INSTANCE_SIZE + sizeOf(fieldBlockOffsets) + sizeOf(rowIsNull); } - protected List getRawFieldBlocks() + List getRawFieldBlocks() { return fieldBlocksList; } @Nullable - protected int[] getFieldBlockOffsets() + int[] getFieldBlockOffsets() { return fieldBlockOffsets; } - protected int getOffsetBase() + int getOffsetBase() { return startOffset; } @@ -281,13 +281,13 @@ public RowBlock copyWithAppendedNull() } @Override - public final List getChildren() + public List getChildren() { return List.of(fieldBlocks); } // the offset in each field block, it can also be viewed as the "entry-based" offset in the RowBlock - public final int getFieldBlockOffset(int position) + public int getFieldBlockOffset(int position) { int[] offsets = fieldBlockOffsets; if (offsets != null) { @@ -363,14 +363,14 @@ public RowBlock getRegion(int position, int length) } @Override - public final OptionalInt fixedSizeInBytesPerPosition() + public OptionalInt fixedSizeInBytesPerPosition() { if (!mayHaveNull()) { // when null rows are present, we can't use the fixed field sizes to infer the correct // size for arbitrary position selection OptionalInt fieldSize = fixedSizeInBytesPerFieldPosition(); if (fieldSize.isPresent()) { - // must include the row block overhead in addition to the per position size in bytes + // must include the row block overhead in addition to the per-position size in bytes return OptionalInt.of(fieldSize.getAsInt() + (Integer.BYTES + Byte.BYTES)); // offsets + rowIsNull } } @@ -415,7 +415,7 @@ public long getRegionSizeInBytes(int position, int length) } @Override - public final long getPositionsSizeInBytes(boolean[] positions, int selectedRowPositions) + public long getPositionsSizeInBytes(boolean[] positions, int selectedRowPositions) { int positionCount = getPositionCount(); checkValidPositions(positions, positionCount); @@ -432,7 +432,7 @@ public final long getPositionsSizeInBytes(boolean[] positions, int selectedRowPo int selectedFieldPositionCount = selectedRowPositions; boolean[] rowIsNull = this.rowIsNull; if (rowIsNull != null) { - // Some positions in usedPositions may be null which must be removed from the selectedFieldPositionCount + // Some positions of usedPositions may be null, and these must be removed from the selectedFieldPositionCount int offsetBase = startOffset; for (int i = 0; i < positions.length; i++) { if (positions[i] && rowIsNull[i + offsetBase]) { 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 8b4620f44fe0..6ad42a33d77c 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 @@ -31,7 +31,7 @@ import static java.util.Collections.singletonList; import static java.util.Objects.requireNonNull; -public class RunLengthEncodedBlock +public final class RunLengthEncodedBlock implements Block { private static final int INSTANCE_SIZE = instanceSize(RunLengthEncodedBlock.class); @@ -91,7 +91,7 @@ private RunLengthEncodedBlock(ValueBlock value, int positionCount) } @Override - public final List getChildren() + public List getChildren() { return singletonList(value); } @@ -102,7 +102,7 @@ public ValueBlock getValue() } /** - * Positions count will always be at least 2 + * Position count will always be at least 2 */ @Override public int getPositionCount() 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 3ff986ad69b4..336a5b845539 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 @@ -28,7 +28,7 @@ import static io.trino.spi.block.BlockUtil.copyIsNullAndAppendNull; import static io.trino.spi.block.BlockUtil.ensureCapacity; -public class ShortArrayBlock +public final class ShortArrayBlock implements ValueBlock { private static final int INSTANCE_SIZE = instanceSize(ShortArrayBlock.class); diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/ValueBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/ValueBlock.java index f55f5567b20c..500769a29a13 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/ValueBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/ValueBlock.java @@ -13,7 +13,7 @@ */ package io.trino.spi.block; -public interface ValueBlock +public non-sealed interface ValueBlock extends Block { @Override diff --git a/core/trino-spi/src/main/java/io/trino/spi/block/VariableWidthBlock.java b/core/trino-spi/src/main/java/io/trino/spi/block/VariableWidthBlock.java index 3a828298091e..931d4cae70eb 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/block/VariableWidthBlock.java +++ b/core/trino-spi/src/main/java/io/trino/spi/block/VariableWidthBlock.java @@ -34,7 +34,7 @@ import static io.trino.spi.block.BlockUtil.copyIsNullAndAppendNull; import static io.trino.spi.block.BlockUtil.copyOffsetsAndAppendNull; -public class VariableWidthBlock +public final class VariableWidthBlock implements ValueBlock { private static final int INSTANCE_SIZE = instanceSize(VariableWidthBlock.class); @@ -101,7 +101,7 @@ public int getRawSliceOffset(int position) return getPositionOffset(position); } - protected final int getPositionOffset(int position) + int getPositionOffset(int position) { return offsets[position + arrayOffset]; } diff --git a/lib/trino-orc/src/test/java/io/trino/orc/TestDictionaryBuilder.java b/lib/trino-orc/src/test/java/io/trino/orc/TestDictionaryBuilder.java index 9ed19323cb46..3a56af57f175 100644 --- a/lib/trino-orc/src/test/java/io/trino/orc/TestDictionaryBuilder.java +++ b/lib/trino-orc/src/test/java/io/trino/orc/TestDictionaryBuilder.java @@ -14,7 +14,6 @@ package io.trino.orc; import com.google.common.collect.ImmutableSet; -import io.airlift.slice.Slice; import io.trino.orc.writer.DictionaryBuilder; import io.trino.spi.block.VariableWidthBlock; import org.testng.annotations.Test; @@ -34,18 +33,9 @@ public void testSkipReservedSlots() Set positions = new HashSet<>(); DictionaryBuilder dictionaryBuilder = new DictionaryBuilder(64); for (int i = 0; i < 64; i++) { - positions.add(dictionaryBuilder.putIfAbsent(new TestHashCollisionBlock(1, wrappedBuffer(new byte[] {1}), new int[] {0, 1}, new boolean[] {false}), 0)); - positions.add(dictionaryBuilder.putIfAbsent(new TestHashCollisionBlock(1, wrappedBuffer(new byte[] {2}), new int[] {0, 1}, new boolean[] {false}), 0)); + positions.add(dictionaryBuilder.putIfAbsent(new VariableWidthBlock(1, wrappedBuffer(new byte[] {1}), new int[] {0, 1}, Optional.of(new boolean[] {false})), 0)); + positions.add(dictionaryBuilder.putIfAbsent(new VariableWidthBlock(1, wrappedBuffer(new byte[] {2}), new int[] {0, 1}, Optional.of(new boolean[] {false})), 0)); } assertEquals(positions, ImmutableSet.of(1, 2)); } - - private static class TestHashCollisionBlock - extends VariableWidthBlock - { - public TestHashCollisionBlock(int positionCount, Slice slice, int[] offsets, boolean[] valueIsNull) - { - super(positionCount, slice, offsets, Optional.of(valueIsNull)); - } - } }