Search in sources :

Example 1 with Page

use of io.trino.spi.Page in project trino by trinodb.

the class InformationSchemaPageSource method getNextPage.

@Override
public Page getNextPage() {
    if (isFinished()) {
        return null;
    }
    if (pages.isEmpty()) {
        buildPages();
    }
    Page page = pages.poll();
    if (page == null) {
        return null;
    }
    memoryUsageBytes -= page.getRetainedSizeInBytes();
    Page outputPage = projection.apply(page);
    completedBytes += outputPage.getSizeInBytes();
    return outputPage;
}
Also used : Page(io.trino.spi.Page)

Example 2 with Page

use of io.trino.spi.Page 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 Page

use of io.trino.spi.Page in project trino by trinodb.

the class PagePartitioner method partitionBySingleRleValue.

private void partitionBySingleRleValue(Page page, int position, Page partitionFunctionArgs, IntArrayList[] partitionPositions) {
    // copy all positions because all hash function args are the same for every position
    if (nullChannel != -1 && page.getBlock(nullChannel).isNull(0)) {
        verify(page.getBlock(nullChannel) instanceof RunLengthEncodedBlock, "null channel is not RunLengthEncodedBlock", page.getBlock(nullChannel));
        // all positions are null
        int[] allPositions = integersInRange(position, page.getPositionCount());
        for (IntList partitionPosition : partitionPositions) {
            partitionPosition.addElements(position, allPositions);
        }
    } else {
        // extract rle page to prevent JIT profile pollution
        Page rlePage = extractRlePage(partitionFunctionArgs);
        int partition = partitionFunction.getPartition(rlePage, 0);
        IntArrayList positions = partitionPositions[partition];
        for (int i = position; i < page.getPositionCount(); i++) {
            positions.add(i);
        }
    }
}
Also used : Page(io.trino.spi.Page) PageSplitterUtil.splitPage(io.trino.execution.buffer.PageSplitterUtil.splitPage) RunLengthEncodedBlock(io.trino.spi.block.RunLengthEncodedBlock) IntArrayList(it.unimi.dsi.fastutil.ints.IntArrayList) IntList(it.unimi.dsi.fastutil.ints.IntList)

Example 4 with Page

use of io.trino.spi.Page 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)

Example 5 with Page

use of io.trino.spi.Page in project trino by trinodb.

the class PagePartitioner method flush.

public void flush(boolean force) {
    try (PagesSerde.PagesSerdeContext context = serde.newContext()) {
        // add all full pages to output buffer
        for (int partition = 0; partition < pageBuilders.length; partition++) {
            PageBuilder partitionPageBuilder = pageBuilders[partition];
            if (!partitionPageBuilder.isEmpty() && (force || partitionPageBuilder.isFull())) {
                Page pagePartition = partitionPageBuilder.build();
                partitionPageBuilder.reset();
                operatorContext.recordOutput(pagePartition.getSizeInBytes(), pagePartition.getPositionCount());
                outputBuffer.enqueue(partition, splitAndSerializePage(context, pagePartition));
                pagesAdded.incrementAndGet();
                rowsAdded.addAndGet(pagePartition.getPositionCount());
            }
        }
    }
}
Also used : PagesSerde(io.trino.execution.buffer.PagesSerde) Page(io.trino.spi.Page) PageSplitterUtil.splitPage(io.trino.execution.buffer.PageSplitterUtil.splitPage) PageBuilder(io.trino.spi.PageBuilder)

Aggregations

Page (io.trino.spi.Page)579 Test (org.testng.annotations.Test)334 Block (io.trino.spi.block.Block)153 Type (io.trino.spi.type.Type)127 MaterializedResult (io.trino.testing.MaterializedResult)109 PlanNodeId (io.trino.sql.planner.plan.PlanNodeId)91 RowPagesBuilder (io.trino.RowPagesBuilder)72 RunLengthEncodedBlock (io.trino.spi.block.RunLengthEncodedBlock)68 ImmutableList (com.google.common.collect.ImmutableList)65 ArrayList (java.util.ArrayList)48 BlockBuilder (io.trino.spi.block.BlockBuilder)46 Optional (java.util.Optional)43 TaskContext (io.trino.operator.TaskContext)42 TestingTaskContext (io.trino.testing.TestingTaskContext)41 List (java.util.List)41 DictionaryBlock (io.trino.spi.block.DictionaryBlock)38 OperatorAssertion.toMaterializedResult (io.trino.operator.OperatorAssertion.toMaterializedResult)37 Slice (io.airlift.slice.Slice)36 OperatorFactory (io.trino.operator.OperatorFactory)32 LazyBlock (io.trino.spi.block.LazyBlock)32