Search in sources :

Example 1 with Block

use of io.trino.spi.block.Block in project TiBigData by tidb-incubator.

the class TiDBPageSink method appendColumn.

private void appendColumn(Page page, int position, int channel) throws SQLException {
    Block block = page.getBlock(channel);
    int parameter = channel + 1;
    if (block.isNull(position)) {
        statement.setObject(parameter, null);
        return;
    }
    Type type = columnTypes.get(channel);
    switch(type.getDisplayName()) {
        case "boolean":
            statement.setBoolean(parameter, type.getBoolean(block, position));
            break;
        case "tinyint":
            statement.setByte(parameter, SignedBytes.checkedCast(type.getLong(block, position)));
            break;
        case "smallint":
            statement.setShort(parameter, Shorts.checkedCast(type.getLong(block, position)));
            break;
        case "integer":
            statement.setInt(parameter, toIntExact(type.getLong(block, position)));
            break;
        case "bigint":
            statement.setLong(parameter, type.getLong(block, position));
            break;
        case "real":
            statement.setFloat(parameter, intBitsToFloat(toIntExact(type.getLong(block, position))));
            break;
        case "double":
            statement.setDouble(parameter, type.getDouble(block, position));
            break;
        case "date":
            // convert to midnight in default time zone
            long utcMillis = DAYS.toMillis(type.getLong(block, position));
            long localMillis = getInstanceUTC().getZone().getMillisKeepLocal(DateTimeZone.getDefault(), utcMillis);
            statement.setDate(parameter, new Date(localMillis));
            break;
        case "varbinary":
            statement.setBytes(parameter, type.getSlice(block, position).getBytes());
            break;
        default:
            if (type instanceof DecimalType) {
                statement.setBigDecimal(parameter, readBigDecimal((DecimalType) type, block, position));
            } else if (type instanceof VarcharType || type instanceof CharType) {
                statement.setString(parameter, type.getSlice(block, position).toStringUtf8());
            } else if (type instanceof TimestampType) {
                statement.setTimestamp(parameter, new Timestamp(type.getLong(block, position) / 1000 - TimeZone.getDefault().getRawOffset()));
            } else if (type instanceof TimeType) {
                statement.setTime(parameter, new Time(type.getLong(block, position)));
            } else {
                throw new TrinoException(NOT_SUPPORTED, "Unsupported column type: " + type.getDisplayName());
            }
    }
}
Also used : VarcharType(io.trino.spi.type.VarcharType) Time(java.sql.Time) Timestamp(java.sql.Timestamp) Date(java.sql.Date) TimeType(io.trino.spi.type.TimeType) TimeType(io.trino.spi.type.TimeType) Type(io.trino.spi.type.Type) TimestampType(io.trino.spi.type.TimestampType) VarcharType(io.trino.spi.type.VarcharType) CharType(io.trino.spi.type.CharType) DecimalType(io.trino.spi.type.DecimalType) Block(io.trino.spi.block.Block) DecimalType(io.trino.spi.type.DecimalType) TimestampType(io.trino.spi.type.TimestampType) TrinoException(io.trino.spi.TrinoException) CharType(io.trino.spi.type.CharType)

Example 2 with Block

use of io.trino.spi.block.Block in project trino by trinodb.

the class RuleStatsSystemTable method pageSource.

@Override
public ConnectorPageSource pageSource(ConnectorTransactionHandle transactionHandle, ConnectorSession session, TupleDomain<Integer> constraint) {
    checkState(ruleStatsRecorder.isPresent(), "Rule stats system table can return results only on coordinator");
    Map<Class<?>, RuleStats> ruleStats = ruleStatsRecorder.get().getStats();
    int positionCount = ruleStats.size();
    Map<String, BlockBuilder> blockBuilders = ruleStatsTable.getColumns().stream().collect(toImmutableMap(ColumnMetadata::getName, column -> column.getType().createBlockBuilder(null, positionCount)));
    for (Map.Entry<Class<?>, RuleStats> entry : ruleStats.entrySet()) {
        RuleStats stats = entry.getValue();
        VARCHAR.writeString(blockBuilders.get("rule_name"), entry.getKey().getSimpleName());
        BIGINT.writeLong(blockBuilders.get("invocations"), stats.getInvocations());
        BIGINT.writeLong(blockBuilders.get("matches"), stats.getHits());
        BIGINT.writeLong(blockBuilders.get("failures"), stats.getFailures());
        DOUBLE.writeDouble(blockBuilders.get("average_time"), stats.getTime().getAvg());
        BlockBuilder mapWriter = blockBuilders.get("time_distribution_percentiles").beginBlockEntry();
        for (Map.Entry<Double, Double> percentile : stats.getTime().getPercentiles().entrySet()) {
            DOUBLE.writeDouble(mapWriter, percentile.getKey());
            DOUBLE.writeDouble(mapWriter, percentile.getValue());
        }
        blockBuilders.get("time_distribution_percentiles").closeEntry();
    }
    Block[] blocks = ruleStatsTable.getColumns().stream().map(column -> blockBuilders.get(column.getName()).build()).toArray(Block[]::new);
    return new FixedPageSource(ImmutableList.of(new Page(positionCount, blocks)));
}
Also used : TableMetadataBuilder.tableMetadataBuilder(io.trino.metadata.MetadataUtil.TableMetadataBuilder.tableMetadataBuilder) ColumnMetadata(io.trino.spi.connector.ColumnMetadata) Page(io.trino.spi.Page) ConnectorTableMetadata(io.trino.spi.connector.ConnectorTableMetadata) RuleStatsRecorder(io.trino.sql.planner.RuleStatsRecorder) Inject(javax.inject.Inject) VARCHAR(io.trino.spi.type.VarcharType.VARCHAR) ImmutableList(com.google.common.collect.ImmutableList) Block(io.trino.spi.block.Block) Map(java.util.Map) Objects.requireNonNull(java.util.Objects.requireNonNull) ConnectorPageSource(io.trino.spi.connector.ConnectorPageSource) SINGLE_COORDINATOR(io.trino.spi.connector.SystemTable.Distribution.SINGLE_COORDINATOR) ConnectorSession(io.trino.spi.connector.ConnectorSession) TupleDomain(io.trino.spi.predicate.TupleDomain) SchemaTableName(io.trino.spi.connector.SchemaTableName) Preconditions.checkState(com.google.common.base.Preconditions.checkState) DOUBLE(io.trino.spi.type.DoubleType.DOUBLE) RuleStats(io.trino.sql.planner.iterative.RuleStats) ImmutableMap.toImmutableMap(com.google.common.collect.ImmutableMap.toImmutableMap) FixedPageSource(io.trino.spi.connector.FixedPageSource) BIGINT(io.trino.spi.type.BigintType.BIGINT) Optional(java.util.Optional) BlockBuilder(io.trino.spi.block.BlockBuilder) TypeSignature.mapType(io.trino.spi.type.TypeSignature.mapType) TypeManager(io.trino.spi.type.TypeManager) SystemTable(io.trino.spi.connector.SystemTable) ConnectorTransactionHandle(io.trino.spi.connector.ConnectorTransactionHandle) Page(io.trino.spi.Page) FixedPageSource(io.trino.spi.connector.FixedPageSource) RuleStats(io.trino.sql.planner.iterative.RuleStats) Block(io.trino.spi.block.Block) Map(java.util.Map) ImmutableMap.toImmutableMap(com.google.common.collect.ImmutableMap.toImmutableMap) BlockBuilder(io.trino.spi.block.BlockBuilder)

Example 3 with Block

use of io.trino.spi.block.Block in project trino by trinodb.

the class InternalBlockEncodingSerde method writeBlock.

@Override
public void writeBlock(SliceOutput output, Block block) {
    while (true) {
        // get the encoding name
        String encodingName = block.getEncodingName();
        // look up the BlockEncoding
        BlockEncoding blockEncoding = blockEncodings.apply(encodingName);
        // see if a replacement block should be written instead
        Optional<Block> replacementBlock = blockEncoding.replacementBlockForWrite(block);
        if (replacementBlock.isPresent()) {
            block = replacementBlock.get();
            continue;
        }
        // write the name to the output
        writeLengthPrefixedString(output, encodingName);
        // write the block to the output
        blockEncoding.writeBlock(this, output, block);
        break;
    }
}
Also used : Block(io.trino.spi.block.Block) BlockEncoding(io.trino.spi.block.BlockEncoding)

Example 4 with Block

use of io.trino.spi.block.Block in project trino by trinodb.

the class ArrayConcatFunction method concat.

@UsedByGeneratedCode
public static Block concat(Type elementType, Object state, Block[] blocks) {
    int resultPositionCount = 0;
    // fast path when there is at most one non empty block
    Block nonEmptyBlock = null;
    for (int i = 0; i < blocks.length; i++) {
        resultPositionCount += blocks[i].getPositionCount();
        if (blocks[i].getPositionCount() > 0) {
            nonEmptyBlock = blocks[i];
        }
    }
    if (nonEmptyBlock == null) {
        return blocks[0];
    }
    if (resultPositionCount == nonEmptyBlock.getPositionCount()) {
        return nonEmptyBlock;
    }
    PageBuilder pageBuilder = (PageBuilder) state;
    if (pageBuilder.isFull()) {
        pageBuilder.reset();
    }
    BlockBuilder blockBuilder = pageBuilder.getBlockBuilder(0);
    for (int blockIndex = 0; blockIndex < blocks.length; blockIndex++) {
        Block block = blocks[blockIndex];
        for (int i = 0; i < block.getPositionCount(); i++) {
            elementType.appendTo(block, i, blockBuilder);
        }
    }
    pageBuilder.declarePositions(resultPositionCount);
    return blockBuilder.getRegion(blockBuilder.getPositionCount() - resultPositionCount, resultPositionCount);
}
Also used : Block(io.trino.spi.block.Block) PageBuilder(io.trino.spi.PageBuilder) BlockBuilder(io.trino.spi.block.BlockBuilder) UsedByGeneratedCode(io.trino.annotation.UsedByGeneratedCode)

Example 5 with Block

use of io.trino.spi.block.Block in project trino by trinodb.

the class PagePartitioner method partitionPositions.

private IntArrayList[] partitionPositions(Page page) {
    verify(page.getPositionCount() > 0, "position count is 0");
    IntArrayList[] partitionPositions = initPositions(page);
    int position;
    // Handle "any row" replication outside the inner loop processing
    if (replicatesAnyRow && !hasAnyRowBeenReplicated) {
        for (IntList partitionPosition : partitionPositions) {
            partitionPosition.add(0);
        }
        hasAnyRowBeenReplicated = true;
        position = 1;
    } else {
        position = 0;
    }
    Page partitionFunctionArgs = getPartitionFunctionArguments(page);
    if (partitionFunctionArgs.getChannelCount() > 0 && onlyRleBlocks(partitionFunctionArgs)) {
        // we need at least one Rle block since with no blocks partition function
        // can return a different value per invocation (e.g. RoundRobinBucketFunction)
        partitionBySingleRleValue(page, position, partitionFunctionArgs, partitionPositions);
    } else if (partitionFunctionArgs.getChannelCount() == 1 && isDictionaryProcessingFaster(partitionFunctionArgs.getBlock(0))) {
        partitionBySingleDictionary(page, position, partitionFunctionArgs, partitionPositions);
    } else {
        partitionGeneric(page, position, aPosition -> partitionFunction.getPartition(partitionFunctionArgs, aPosition), partitionPositions);
    }
    return partitionPositions;
}
Also used : Arrays(java.util.Arrays) ListenableFuture(com.google.common.util.concurrent.ListenableFuture) Slice(io.airlift.slice.Slice) PageBuilder(io.trino.spi.PageBuilder) NullableValue(io.trino.spi.predicate.NullableValue) IntUnaryOperator(java.util.function.IntUnaryOperator) Type(io.trino.spi.type.Type) Page(io.trino.spi.Page) DEFAULT_MAX_PAGE_SIZE_IN_BYTES(io.trino.spi.block.PageBuilderStatus.DEFAULT_MAX_PAGE_SIZE_IN_BYTES) OptionalInt(java.util.OptionalInt) Supplier(java.util.function.Supplier) OperatorContext(io.trino.operator.OperatorContext) DictionaryBlock(io.trino.spi.block.DictionaryBlock) Preconditions.checkArgument(com.google.common.base.Preconditions.checkArgument) OutputBuffer(io.trino.execution.buffer.OutputBuffer) ImmutableList(com.google.common.collect.ImmutableList) PagesSerdeFactory(io.trino.execution.buffer.PagesSerdeFactory) Block(io.trino.spi.block.Block) Verify.verify(com.google.common.base.Verify.verify) Objects.requireNonNull(java.util.Objects.requireNonNull) PartitionedOutputInfo(io.trino.operator.output.PartitionedOutputOperator.PartitionedOutputInfo) Math.toIntExact(java.lang.Math.toIntExact) Nullable(javax.annotation.Nullable) RunLengthEncodedBlock(io.trino.spi.block.RunLengthEncodedBlock) PartitionFunction(io.trino.operator.PartitionFunction) Math.min(java.lang.Math.min) PagesSerde(io.trino.execution.buffer.PagesSerde) PageSplitterUtil.splitPage(io.trino.execution.buffer.PageSplitterUtil.splitPage) Ints(com.google.common.primitives.Ints) Objects(java.util.Objects) AtomicLong(java.util.concurrent.atomic.AtomicLong) DataSize(io.airlift.units.DataSize) List(java.util.List) IntList(it.unimi.dsi.fastutil.ints.IntList) Optional(java.util.Optional) Math.max(java.lang.Math.max) BlockBuilder(io.trino.spi.block.BlockBuilder) IntArrayList(it.unimi.dsi.fastutil.ints.IntArrayList) Page(io.trino.spi.Page) PageSplitterUtil.splitPage(io.trino.execution.buffer.PageSplitterUtil.splitPage) IntArrayList(it.unimi.dsi.fastutil.ints.IntArrayList) IntList(it.unimi.dsi.fastutil.ints.IntList)

Aggregations

Block (io.trino.spi.block.Block)520 Test (org.testng.annotations.Test)161 Page (io.trino.spi.Page)145 RunLengthEncodedBlock (io.trino.spi.block.RunLengthEncodedBlock)107 BlockBuilder (io.trino.spi.block.BlockBuilder)105 DictionaryBlock (io.trino.spi.block.DictionaryBlock)103 Type (io.trino.spi.type.Type)89 BlockAssertions.createLongsBlock (io.trino.block.BlockAssertions.createLongsBlock)65 Slice (io.airlift.slice.Slice)61 TrinoException (io.trino.spi.TrinoException)41 BlockAssertions.createLongSequenceBlock (io.trino.block.BlockAssertions.createLongSequenceBlock)39 LazyBlock (io.trino.spi.block.LazyBlock)37 ArrayType (io.trino.spi.type.ArrayType)31 RowType (io.trino.spi.type.RowType)31 ArrayList (java.util.ArrayList)31 LongArrayBlock (io.trino.spi.block.LongArrayBlock)29 VariableWidthBlock (io.trino.spi.block.VariableWidthBlock)28 BlockAssertions.createStringsBlock (io.trino.block.BlockAssertions.createStringsBlock)26 ImmutableList (com.google.common.collect.ImmutableList)25 DecimalType (io.trino.spi.type.DecimalType)25