2011-08-27 22:43:31 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
2012-05-09 08:16:09 +00:00
|
|
|
|
#include <boost/function.hpp>
|
|
|
|
|
|
2012-12-25 17:25:44 +00:00
|
|
|
|
#include <statdaemons/Stopwatch.h>
|
2011-08-27 22:43:31 +00:00
|
|
|
|
|
2011-09-05 00:51:25 +00:00
|
|
|
|
#include <DB/Core/Names.h>
|
|
|
|
|
|
2012-12-25 17:25:44 +00:00
|
|
|
|
#include <DB/Interpreters/Limits.h>
|
2013-08-28 20:47:22 +00:00
|
|
|
|
#include <DB/Interpreters/Quota.h>
|
2012-12-25 17:25:44 +00:00
|
|
|
|
|
2011-08-27 22:43:31 +00:00
|
|
|
|
#include <DB/DataStreams/IBlockInputStream.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Информация для профайлинга.
|
|
|
|
|
struct BlockStreamProfileInfo
|
|
|
|
|
{
|
|
|
|
|
bool started;
|
2013-05-20 12:21:51 +00:00
|
|
|
|
Stopwatch work_stopwatch; /// Время вычислений (выполнения функции read())
|
2012-12-25 17:25:44 +00:00
|
|
|
|
Stopwatch total_stopwatch; /// Время с учётом ожидания
|
2013-05-22 12:10:33 +00:00
|
|
|
|
|
|
|
|
|
String stream_name; /// Короткое имя потока, для которого собирается информация
|
2011-08-27 22:43:31 +00:00
|
|
|
|
|
|
|
|
|
size_t rows;
|
|
|
|
|
size_t blocks;
|
|
|
|
|
size_t bytes;
|
|
|
|
|
|
2011-09-26 01:50:32 +00:00
|
|
|
|
/// Информация о вложенных потоках - для выделения чистого времени работы.
|
|
|
|
|
typedef std::vector<const BlockStreamProfileInfo *> BlockStreamProfileInfos;
|
|
|
|
|
BlockStreamProfileInfos nested_infos;
|
|
|
|
|
|
2011-09-05 00:51:25 +00:00
|
|
|
|
String column_names;
|
|
|
|
|
|
2013-05-22 14:57:43 +00:00
|
|
|
|
BlockStreamProfileInfo() :
|
|
|
|
|
started(false), rows(0), blocks(0), bytes(0),
|
|
|
|
|
applied_limit(false), rows_before_limit(0), calculated_rows_before_limit(false)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size_t getRowsBeforeLimit() const;
|
|
|
|
|
bool hasAppliedLimit() const;
|
2011-08-27 22:43:31 +00:00
|
|
|
|
|
2012-05-17 19:15:53 +00:00
|
|
|
|
void update(Block & block);
|
2013-05-22 14:57:43 +00:00
|
|
|
|
void print(std::ostream & ostr) const;
|
|
|
|
|
|
|
|
|
|
/// Методы для бинарной [де]сериализации
|
|
|
|
|
void read(ReadBuffer & in);
|
|
|
|
|
void write(WriteBuffer & out) const;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
void calculateRowsBeforeLimit() const;
|
|
|
|
|
|
|
|
|
|
/// Для этих полей сделаем accessor'ы, т.к. их необходимо предварительно вычислять.
|
|
|
|
|
mutable bool applied_limit; /// Применялся ли LIMIT
|
|
|
|
|
mutable size_t rows_before_limit; /// Число строк до выполнения LIMIT
|
|
|
|
|
mutable bool calculated_rows_before_limit; /// Вычислялось ли поле rows_before_limit
|
2011-08-27 22:43:31 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2012-05-09 08:16:09 +00:00
|
|
|
|
/** Смотрит за тем, как работает источник блоков.
|
2011-08-27 22:43:31 +00:00
|
|
|
|
* Позволяет получить информацию для профайлинга:
|
|
|
|
|
* строк в секунду, блоков в секунду, мегабайт в секунду и т. п.
|
2012-05-09 08:16:09 +00:00
|
|
|
|
* Позволяет остановить чтение данных (во вложенных источниках).
|
2011-08-27 22:43:31 +00:00
|
|
|
|
*/
|
2011-09-04 21:23:19 +00:00
|
|
|
|
class IProfilingBlockInputStream : public IBlockInputStream
|
2011-08-27 22:43:31 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
2013-08-28 20:47:22 +00:00
|
|
|
|
IProfilingBlockInputStream(StoragePtr owned_storage_ = StoragePtr())
|
2013-09-07 02:03:13 +00:00
|
|
|
|
: IBlockInputStream(owned_storage_), is_cancelled(false), enabled_extremes(false), quota(NULL), quota_mode(QUOTA_READ), prev_elapsed(0) {}
|
2012-10-17 19:55:56 +00:00
|
|
|
|
|
2011-08-27 22:43:31 +00:00
|
|
|
|
Block read();
|
2011-09-04 21:23:19 +00:00
|
|
|
|
|
2012-08-23 23:49:28 +00:00
|
|
|
|
/// Получить информацию о скорости выполнения.
|
2011-08-27 22:43:31 +00:00
|
|
|
|
const BlockStreamProfileInfo & getInfo() const;
|
|
|
|
|
|
2013-09-01 04:55:41 +00:00
|
|
|
|
/// Получить "тотальные" значения. Берёт их из себя или из первого дочернего источника, в котором они есть. Их может не быть.
|
|
|
|
|
const Block & getTotals() const;
|
2013-09-07 02:03:13 +00:00
|
|
|
|
/// То же самое для минимумов и максимумов.
|
|
|
|
|
const Block & getExtremes() const;
|
2013-09-01 04:55:41 +00:00
|
|
|
|
|
2012-10-20 05:54:35 +00:00
|
|
|
|
|
2012-10-18 19:24:46 +00:00
|
|
|
|
/** Установить колбэк прогресса выполнения.
|
|
|
|
|
* Колбэк пробрасывается во все источники.
|
|
|
|
|
* По-умолчанию, он вызывается для листовых источников, после каждого блока.
|
|
|
|
|
* (Но это может быть переопределено в методе progress())
|
|
|
|
|
* Функция принимает количество строк в последнем блоке, количество байт в последнем блоке.
|
|
|
|
|
* Следует иметь ввиду, что колбэк может вызываться из разных потоков.
|
|
|
|
|
*/
|
|
|
|
|
void setProgressCallback(ProgressCallback callback);
|
|
|
|
|
|
|
|
|
|
virtual void progress(Block & block);
|
|
|
|
|
|
|
|
|
|
|
2012-10-17 19:55:56 +00:00
|
|
|
|
/** Попросить прервать получение данных как можно скорее.
|
|
|
|
|
* По-умолчанию - просто выставляет флаг is_cancelled и просит прерваться всех детей.
|
2012-11-10 05:13:46 +00:00
|
|
|
|
* Эта функция может вызываться несколько раз, в том числе, одновременно из разных потоков.
|
2012-10-17 19:55:56 +00:00
|
|
|
|
*/
|
|
|
|
|
virtual void cancel();
|
|
|
|
|
|
2012-10-18 19:24:46 +00:00
|
|
|
|
/** Требуется ли прервать получение данных.
|
2012-10-20 05:54:35 +00:00
|
|
|
|
*/
|
2012-10-18 19:24:46 +00:00
|
|
|
|
bool isCancelled()
|
|
|
|
|
{
|
|
|
|
|
return is_cancelled;
|
|
|
|
|
}
|
2012-05-17 19:15:53 +00:00
|
|
|
|
|
2012-12-25 17:25:44 +00:00
|
|
|
|
/// Используется подмножество ограничений из Limits.
|
|
|
|
|
struct LocalLimits
|
|
|
|
|
{
|
|
|
|
|
size_t max_rows_to_read;
|
|
|
|
|
size_t max_bytes_to_read;
|
|
|
|
|
Limits::OverflowMode read_overflow_mode;
|
|
|
|
|
|
|
|
|
|
Poco::Timespan max_execution_time;
|
|
|
|
|
Limits::OverflowMode timeout_overflow_mode;
|
|
|
|
|
|
|
|
|
|
/// В строчках в секунду.
|
|
|
|
|
size_t min_execution_speed;
|
|
|
|
|
/// Проверять, что скорость не слишком низкая, после прошествия указанного времени.
|
|
|
|
|
Poco::Timespan timeout_before_checking_execution_speed;
|
|
|
|
|
|
|
|
|
|
LocalLimits()
|
|
|
|
|
: max_rows_to_read(0), max_bytes_to_read(0), read_overflow_mode(Limits::THROW),
|
|
|
|
|
max_execution_time(0), timeout_overflow_mode(Limits::THROW),
|
|
|
|
|
min_execution_speed(0), timeout_before_checking_execution_speed(0)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** Установить ограничения для проверки на каждый блок. */
|
|
|
|
|
void setLimits(const LocalLimits & limits_)
|
|
|
|
|
{
|
|
|
|
|
limits = limits_;
|
|
|
|
|
}
|
|
|
|
|
|
2013-08-28 20:47:22 +00:00
|
|
|
|
|
|
|
|
|
/// Какая квота используется - на объём исходных данных или на объём результата.
|
|
|
|
|
enum QuotaMode
|
|
|
|
|
{
|
|
|
|
|
QUOTA_READ,
|
|
|
|
|
QUOTA_RESULT,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/// Установить квоту.
|
|
|
|
|
void setQuota(QuotaForIntervals & quota_, QuotaMode quota_mode_)
|
|
|
|
|
{
|
|
|
|
|
quota = "a_;
|
|
|
|
|
quota_mode = quota_mode_;
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-07 02:03:13 +00:00
|
|
|
|
/// Включить рассчёт минимумов и максимумов по столбцам результата.
|
|
|
|
|
void enableExtremes() { enabled_extremes = true; }
|
|
|
|
|
|
2012-05-21 20:38:34 +00:00
|
|
|
|
protected:
|
2011-08-27 22:43:31 +00:00
|
|
|
|
BlockStreamProfileInfo info;
|
2012-10-17 19:55:56 +00:00
|
|
|
|
volatile bool is_cancelled;
|
2012-05-09 15:15:45 +00:00
|
|
|
|
ProgressCallback progress_callback;
|
2012-10-20 02:10:47 +00:00
|
|
|
|
|
2013-09-07 02:03:13 +00:00
|
|
|
|
bool enabled_extremes;
|
|
|
|
|
|
2013-09-01 04:55:41 +00:00
|
|
|
|
/// Дополнительная информация, которая может образоваться в процессе работы.
|
|
|
|
|
|
|
|
|
|
/// Тотальные значения при агрегации.
|
|
|
|
|
Block totals;
|
2013-09-07 02:03:13 +00:00
|
|
|
|
/// Минимумы и максимумы. Первая строчка блока - минимумы, вторая - максимумы.
|
|
|
|
|
Block extremes;
|
2013-09-01 04:55:41 +00:00
|
|
|
|
|
|
|
|
|
/// Ограничения и квоты.
|
|
|
|
|
|
2012-12-25 17:25:44 +00:00
|
|
|
|
LocalLimits limits;
|
|
|
|
|
|
2013-08-28 20:47:22 +00:00
|
|
|
|
QuotaForIntervals * quota; /// Если NULL - квота не используется.
|
|
|
|
|
QuotaMode quota_mode;
|
2013-08-28 21:36:16 +00:00
|
|
|
|
double prev_elapsed;
|
2013-08-28 20:47:22 +00:00
|
|
|
|
|
2012-10-20 02:10:47 +00:00
|
|
|
|
/// Наследники должны реализовать эту функцию.
|
|
|
|
|
virtual Block readImpl() = 0;
|
2013-09-07 02:03:13 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void updateExtremes(Block & block);
|
|
|
|
|
bool checkLimits();
|
|
|
|
|
void checkQuota(Block & block);
|
2011-08-27 22:43:31 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|