dbms: added expression calculation on totals [#CONV-8366].

This commit is contained in:
Alexey Milovidov 2013-09-08 08:27:06 +00:00
parent 97b923fd7b
commit 706aad9e63
5 changed files with 25 additions and 7 deletions

View File

@ -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()
{

View File

@ -77,8 +77,13 @@ public:
/// Получить информацию о скорости выполнения.
const BlockStreamProfileInfo & getInfo() const;
/// Получить "тотальные" значения. Берёт их из себя или из первого дочернего источника, в котором они есть. Их может не быть.
const Block & getTotals() const;
/** Получить "тотальные" значения.
* Реализация по-умолчанию берёт их из себя или из первого дочернего источника, в котором они есть.
* Переопределённый метод может провести некоторые вычисления. Например, применить выражение к totals дочернего источника.
* Тотальных значений может не быть - тогда возвращается пустой блок.
*/
virtual const Block & getTotals();
/// То же самое для минимумов и максимумов.
const Block & getExtremes() const;

View File

@ -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)

View File

@ -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());

View File

@ -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();