2015-01-18 08:25:56 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <vector>
|
2015-10-05 00:44:40 +00:00
|
|
|
|
#include <DB/Common/Stopwatch.h>
|
2015-01-18 08:25:56 +00:00
|
|
|
|
|
|
|
|
|
#include <DB/Core/Types.h>
|
|
|
|
|
|
2016-10-26 22:27:38 +00:00
|
|
|
|
#if __APPLE__
|
|
|
|
|
#include <common/apple_rt.h>
|
|
|
|
|
#endif
|
2015-01-18 08:25:56 +00:00
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
class Block;
|
|
|
|
|
class ReadBuffer;
|
|
|
|
|
class WriteBuffer;
|
|
|
|
|
|
|
|
|
|
/// Информация для профайлинга. См. IProfilingBlockInputStream.h
|
|
|
|
|
struct BlockStreamProfileInfo
|
|
|
|
|
{
|
|
|
|
|
bool started = false;
|
|
|
|
|
Stopwatch total_stopwatch {CLOCK_MONOTONIC_COARSE}; /// Время с учётом ожидания
|
|
|
|
|
|
|
|
|
|
String stream_name; /// Короткое имя потока, для которого собирается информация
|
|
|
|
|
|
|
|
|
|
size_t rows = 0;
|
|
|
|
|
size_t blocks = 0;
|
|
|
|
|
size_t bytes = 0;
|
|
|
|
|
|
|
|
|
|
/// Информация о вложенных потоках - для выделения чистого времени работы.
|
|
|
|
|
using BlockStreamProfileInfos = std::vector<const BlockStreamProfileInfo *>;
|
|
|
|
|
BlockStreamProfileInfos nested_infos;
|
|
|
|
|
|
|
|
|
|
/// Собрать BlockStreamProfileInfo для ближайших в дереве источников с именем name. Пример; собрать все info для PartialSorting stream-ов.
|
|
|
|
|
void collectInfosForStreamsWithName(const char * name, BlockStreamProfileInfos & res) const;
|
|
|
|
|
|
|
|
|
|
/** Получить число строк, если бы не было LIMIT-а.
|
|
|
|
|
* Если нет LIMIT-а - возвращается 0.
|
|
|
|
|
* Если запрос не содержит ORDER BY, то число может быть занижено - возвращается количество строк в блоках, которые были прочитаны до LIMIT-а.
|
|
|
|
|
* Если запрос содержит ORDER BY, то возвращается точное число строк, которое было бы, если убрать LIMIT.
|
|
|
|
|
*/
|
|
|
|
|
size_t getRowsBeforeLimit() const;
|
|
|
|
|
bool hasAppliedLimit() const;
|
|
|
|
|
|
|
|
|
|
void update(Block & block);
|
|
|
|
|
|
2016-01-25 21:40:13 +00:00
|
|
|
|
/// Методы для бинарной [де]сериализации. Передаются не все поля.
|
2015-01-18 08:25:56 +00:00
|
|
|
|
void read(ReadBuffer & in);
|
|
|
|
|
void write(WriteBuffer & out) const;
|
|
|
|
|
|
2016-01-25 21:40:13 +00:00
|
|
|
|
/// Установить поля из другого объекта, но только те, которые передаются по сети (методами выше).
|
|
|
|
|
void setFrom(const BlockStreamProfileInfo & rhs);
|
|
|
|
|
|
2015-01-18 08:25:56 +00:00
|
|
|
|
private:
|
|
|
|
|
void calculateRowsBeforeLimit() const;
|
|
|
|
|
|
|
|
|
|
/// Для этих полей сделаем accessor'ы, т.к. их необходимо предварительно вычислять.
|
|
|
|
|
mutable bool applied_limit = false; /// Применялся ли LIMIT
|
|
|
|
|
mutable size_t rows_before_limit = 0;
|
|
|
|
|
mutable bool calculated_rows_before_limit = false; /// Вычислялось ли поле rows_before_limit
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|