aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/clickhouse/src/Processors/Transforms/ExtractColumnsTransform.cpp
blob: 44bf5582290f06244aebac006796718bb0a85673 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <Processors/Transforms/ExtractColumnsTransform.h>
#include <Interpreters/getColumnFromBlock.h>

namespace DB
{

ExtractColumnsTransform::ExtractColumnsTransform(const Block & header_, const NamesAndTypesList & requested_columns_)
    : ISimpleTransform(header_, transformHeader(header_, requested_columns_), false), requested_columns(requested_columns_)
{

}

Block ExtractColumnsTransform::transformHeader(Block header, const NamesAndTypesList & requested_columns_)
{
    ColumnsWithTypeAndName columns;
    columns.reserve(requested_columns_.size());
    for (const auto & required_column : requested_columns_)
        columns.emplace_back(getColumnFromBlock(header, required_column), required_column.type, required_column.name);

    return Block(std::move(columns));
}

void ExtractColumnsTransform::transform(Chunk & chunk)
{
    size_t num_rows = chunk.getNumRows();
    auto block = getInputPort().getHeader().cloneWithColumns(chunk.detachColumns());
    Columns columns;
    columns.reserve(requested_columns.size());
    for (const auto & required_column : requested_columns)
        columns.emplace_back(getColumnFromBlock(block, required_column));

    chunk.setColumns(std::move(columns), num_rows);
}

}