ClickHouse/dbms/src/Processors/Transforms/ExpressionTransform.cpp

41 lines
1020 B
C++
Raw Normal View History

#include <Processors/Transforms/ExpressionTransform.h>
#include <Interpreters/ExpressionAnalyzer.h>
namespace DB
{
static Block transformHeader(Block header, const ExpressionActionsPtr & expression)
{
expression->execute(header, true);
return header;
}
2019-04-10 11:04:56 +00:00
ExpressionTransform::ExpressionTransform(const Block & header, ExpressionActionsPtr expression, bool on_totals, bool default_totals)
2019-04-10 10:52:20 +00:00
: ISimpleTransform(header, transformHeader(header, expression), on_totals)
, expression(std::move(expression))
2019-04-09 14:08:52 +00:00
, on_totals(on_totals)
2019-04-10 11:04:56 +00:00
, default_totals(default_totals)
{
}
void ExpressionTransform::transform(Chunk & chunk)
{
2019-04-05 10:52:07 +00:00
auto block = getInputPort().getHeader().cloneWithColumns(chunk.detachColumns());
2019-04-09 14:08:52 +00:00
if (on_totals)
2019-04-10 10:52:20 +00:00
{
2019-04-10 11:04:56 +00:00
if (default_totals && !expression->hasTotalsInJoin())
2019-04-10 10:52:20 +00:00
return;
2019-04-09 14:08:52 +00:00
expression->executeOnTotals(block);
2019-04-10 10:52:20 +00:00
}
2019-04-09 14:08:52 +00:00
else
expression->execute(block);
auto num_rows = block.rows();
chunk.setColumns(block.getColumns(), num_rows);
}
}