mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 23:52:03 +00:00
dbms: added expression calculation on totals [#CONV-8366].
This commit is contained in:
parent
97b923fd7b
commit
706aad9e63
@ -35,6 +35,19 @@ public:
|
||||
return res.str();
|
||||
}
|
||||
|
||||
const Block & getTotals()
|
||||
{
|
||||
if (IProfilingBlockInputStream * child = dynamic_cast<IProfilingBlockInputStream *>(&*children.back()))
|
||||
{
|
||||
totals = child->getTotals();
|
||||
|
||||
if (totals)
|
||||
expression->execute(totals);
|
||||
}
|
||||
|
||||
return totals;
|
||||
}
|
||||
|
||||
protected:
|
||||
Block readImpl()
|
||||
{
|
||||
|
@ -77,8 +77,13 @@ public:
|
||||
/// Получить информацию о скорости выполнения.
|
||||
const BlockStreamProfileInfo & getInfo() const;
|
||||
|
||||
/// Получить "тотальные" значения. Берёт их из себя или из первого дочернего источника, в котором они есть. Их может не быть.
|
||||
const Block & getTotals() const;
|
||||
/** Получить "тотальные" значения.
|
||||
* Реализация по-умолчанию берёт их из себя или из первого дочернего источника, в котором они есть.
|
||||
* Переопределённый метод может провести некоторые вычисления. Например, применить выражение к totals дочернего источника.
|
||||
* Тотальных значений может не быть - тогда возвращается пустой блок.
|
||||
*/
|
||||
virtual const Block & getTotals();
|
||||
|
||||
/// То же самое для минимумов и максимумов.
|
||||
const Block & getExtremes() const;
|
||||
|
||||
|
@ -357,14 +357,14 @@ void IProfilingBlockInputStream::setProgressCallback(ProgressCallback callback)
|
||||
}
|
||||
|
||||
|
||||
const Block & IProfilingBlockInputStream::getTotals() const
|
||||
const Block & IProfilingBlockInputStream::getTotals()
|
||||
{
|
||||
if (totals)
|
||||
return totals;
|
||||
|
||||
for (BlockInputStreams::const_iterator it = children.begin(); it != children.end(); ++it)
|
||||
for (BlockInputStreams::iterator it = children.begin(); it != children.end(); ++it)
|
||||
{
|
||||
if (const IProfilingBlockInputStream * child = dynamic_cast<const IProfilingBlockInputStream *>(&**it))
|
||||
if (IProfilingBlockInputStream * child = dynamic_cast<IProfilingBlockInputStream *>(&**it))
|
||||
{
|
||||
const Block & res = child->getTotals();
|
||||
if (res)
|
||||
|
@ -16,7 +16,7 @@ void copyData(IBlockInputStream & from, IBlockOutputStream & to)
|
||||
to.write(block);
|
||||
|
||||
/// Для вывода дополнительной информации в некоторых форматах.
|
||||
if (const IProfilingBlockInputStream * input = dynamic_cast<const IProfilingBlockInputStream *>(&from))
|
||||
if (IProfilingBlockInputStream * input = dynamic_cast<IProfilingBlockInputStream *>(&from))
|
||||
{
|
||||
if (input->getInfo().hasAppliedLimit())
|
||||
to.setRowsBeforeLimit(input->getInfo().getRowsBeforeLimit());
|
||||
|
@ -279,7 +279,7 @@ void TCPHandler::sendTotals()
|
||||
if (client_revision < DBMS_MIN_REVISION_WITH_TOTALS_EXTREMES)
|
||||
return;
|
||||
|
||||
if (const IProfilingBlockInputStream * input = dynamic_cast<const IProfilingBlockInputStream *>(&*state.io.in))
|
||||
if (IProfilingBlockInputStream * input = dynamic_cast<IProfilingBlockInputStream *>(&*state.io.in))
|
||||
{
|
||||
const Block & totals = input->getTotals();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user