use of io.trino.spi.block.ArrayBlock in project trino by trinodb.
the class ListColumnReader method readBlock.
@Override
public Block readBlock() throws IOException {
if (!rowGroupOpen) {
openRowGroup();
}
if (readOffset > 0) {
if (presentStream != null) {
// skip ahead the present bit reader, but count the set bits
// and use this as the skip size for the data reader
readOffset = presentStream.countBitsSet(readOffset);
}
if (readOffset > 0) {
if (lengthStream == null) {
throw new OrcCorruptionException(column.getOrcDataSourceId(), "Value is not null but data stream is not present");
}
long elementSkipSize = lengthStream.sum(readOffset);
elementColumnReader.prepareNextRead(toIntExact(elementSkipSize));
}
}
// We will use the offsetVector as the buffer to read the length values from lengthStream,
// and the length values will be converted in-place to an offset vector.
int[] offsetVector = new int[nextBatchSize + 1];
boolean[] nullVector = null;
if (presentStream == null) {
if (lengthStream == null) {
throw new OrcCorruptionException(column.getOrcDataSourceId(), "Value is not null but data stream is not present");
}
lengthStream.next(offsetVector, nextBatchSize);
} else {
nullVector = new boolean[nextBatchSize];
int nullValues = presentStream.getUnsetBits(nextBatchSize, nullVector);
if (nullValues != nextBatchSize) {
if (lengthStream == null) {
throw new OrcCorruptionException(column.getOrcDataSourceId(), "Value is not null but data stream is not present");
}
lengthStream.next(offsetVector, nextBatchSize - nullValues);
unpackLengthNulls(offsetVector, nullVector, nextBatchSize - nullValues);
}
}
convertLengthVectorToOffsetVector(offsetVector);
int elementCount = offsetVector[offsetVector.length - 1];
Block elements;
if (elementCount > 0) {
elementColumnReader.prepareNextRead(elementCount);
elements = blockFactory.createBlock(elementCount, elementColumnReader::readBlock, true);
} else {
elements = elementType.createBlockBuilder(null, 0).build();
}
Block arrayBlock = ArrayBlock.fromElementBlock(nextBatchSize, Optional.ofNullable(nullVector), offsetVector, elements);
readOffset = 0;
nextBatchSize = 0;
return arrayBlock;
}
use of io.trino.spi.block.ArrayBlock in project trino by trinodb.
the class ParquetReader method readArray.
private ColumnChunk readArray(GroupField field) throws IOException {
List<Type> parameters = field.getType().getTypeParameters();
checkArgument(parameters.size() == 1, "Arrays must have a single type parameter, found %s", parameters.size());
Field elementField = field.getChildren().get(0).get();
ColumnChunk columnChunk = readColumnChunk(elementField);
IntList offsets = new IntArrayList();
BooleanList valueIsNull = new BooleanArrayList();
calculateCollectionOffsets(field, offsets, valueIsNull, columnChunk.getDefinitionLevels(), columnChunk.getRepetitionLevels());
Block arrayBlock = ArrayBlock.fromElementBlock(valueIsNull.size(), Optional.of(valueIsNull.toBooleanArray()), offsets.toIntArray(), columnChunk.getBlock());
return new ColumnChunk(arrayBlock, columnChunk.getDefinitionLevels(), columnChunk.getRepetitionLevels());
}
use of io.trino.spi.block.ArrayBlock in project trino by trinodb.
the class TrinoThriftBigintArray method fromBlock.
public static TrinoThriftBlock fromBlock(Block block) {
checkArgument(block instanceof AbstractArrayBlock, "block is not of an array type");
AbstractArrayBlock arrayBlock = (AbstractArrayBlock) block;
int positions = arrayBlock.getPositionCount();
if (positions == 0) {
return bigintArrayData(new TrinoThriftBigintArray(null, null, null));
}
boolean[] nulls = null;
int[] sizes = null;
for (int position = 0; position < positions; position++) {
if (arrayBlock.isNull(position)) {
if (nulls == null) {
nulls = new boolean[positions];
}
nulls[position] = true;
} else {
if (sizes == null) {
sizes = new int[positions];
}
sizes[position] = arrayBlock.apply((valuesBlock, startPosition, length) -> length, position);
}
}
TrinoThriftBigint values = arrayBlock.apply((valuesBlock, startPosition, length) -> TrinoThriftBigint.fromBlock(valuesBlock), 0).getBigintData();
checkState(values != null, "values must be present");
checkState(totalSize(nulls, sizes) == values.numberOfRecords(), "unexpected number of values");
return bigintArrayData(new TrinoThriftBigintArray(nulls, sizes, values));
}
Aggregations