2014-02-27 12:49:21 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <DB/DataStreams/IProfilingBlockInputStream.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
2016-01-13 00:32:59 +00:00
|
|
|
|
class ExpressionActions;
|
2014-02-27 12:49:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Принимает блоки после группировки, с нефиализированными агрегатными функциями.
|
|
|
|
|
* Вычисляет тотальные значения в соответствии с totals_mode.
|
|
|
|
|
* Если нужно, вычисляет выражение из HAVING и фильтрует им строки. Отдает финализированные и отфильтрованные блоки.
|
|
|
|
|
*/
|
|
|
|
|
class TotalsHavingBlockInputStream : public IProfilingBlockInputStream
|
|
|
|
|
{
|
2016-01-13 00:32:59 +00:00
|
|
|
|
private:
|
|
|
|
|
using ExpressionActionsPtr = std::shared_ptr<ExpressionActions>;
|
|
|
|
|
|
2014-02-27 12:49:21 +00:00
|
|
|
|
public:
|
2016-01-13 00:32:59 +00:00
|
|
|
|
TotalsHavingBlockInputStream(
|
|
|
|
|
BlockInputStreamPtr input_,
|
|
|
|
|
bool overflow_row_, ExpressionActionsPtr expression_,
|
|
|
|
|
const std::string & filter_column_, TotalsMode totals_mode_, double auto_include_threshold_);
|
2014-02-27 12:49:21 +00:00
|
|
|
|
|
2015-06-08 20:22:02 +00:00
|
|
|
|
String getName() const override { return "TotalsHaving"; }
|
2014-02-27 12:49:21 +00:00
|
|
|
|
|
2016-01-13 00:32:59 +00:00
|
|
|
|
String getID() const override;
|
2014-02-27 12:49:21 +00:00
|
|
|
|
|
2014-11-08 23:52:18 +00:00
|
|
|
|
const Block & getTotals() override;
|
2014-03-06 19:27:11 +00:00
|
|
|
|
|
2014-02-27 12:49:21 +00:00
|
|
|
|
protected:
|
2014-11-08 23:52:18 +00:00
|
|
|
|
Block readImpl() override;
|
2014-02-27 12:49:21 +00:00
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
bool overflow_row;
|
|
|
|
|
ExpressionActionsPtr expression;
|
|
|
|
|
String filter_column_name;
|
|
|
|
|
TotalsMode totals_mode;
|
2015-01-02 05:28:21 +00:00
|
|
|
|
double auto_include_threshold;
|
2015-02-04 05:07:51 +00:00
|
|
|
|
size_t passed_keys = 0;
|
|
|
|
|
size_t total_keys = 0;
|
2014-02-27 12:49:21 +00:00
|
|
|
|
|
2015-01-02 05:28:21 +00:00
|
|
|
|
/** Здесь находятся значения, не прошедшие max_rows_to_group_by.
|
|
|
|
|
* Они прибавляются или не прибавляются к current_totals в зависимости от totals_mode.
|
|
|
|
|
*/
|
2014-02-27 12:49:21 +00:00
|
|
|
|
Block overflow_aggregates;
|
|
|
|
|
|
2015-01-02 05:28:21 +00:00
|
|
|
|
/// Здесь накапливаются тотальные значения. После окончания работы, они будут помещены в IProfilingBlockInputStream::totals.
|
|
|
|
|
Block current_totals;
|
2014-02-27 12:49:21 +00:00
|
|
|
|
|
2015-01-02 05:28:21 +00:00
|
|
|
|
/// Если filter == nullptr - прибавлять все строки. Иначе - только строки, проходящие фильтр (HAVING).
|
|
|
|
|
void addToTotals(Block & totals, Block & block, const IColumn::Filter * filter);
|
2014-02-27 12:49:21 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|