ClickHouse/dbms/include/DB/DataStreams/IProfilingBlockInputStream.h
2012-08-23 23:49:28 +00:00

82 lines
3.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <boost/function.hpp>
#include <Poco/Stopwatch.h>
#include <DB/Core/Names.h>
#include <DB/DataStreams/IBlockInputStream.h>
namespace DB
{
/// Информация для профайлинга.
struct BlockStreamProfileInfo
{
bool started;
Poco::Stopwatch work_stopwatch; /// Время вычислений (выполнения функции read())
Poco::Stopwatch total_stopwatch; /// Время с учётом ожидания
size_t rows;
size_t blocks;
size_t bytes;
/// Информация о вложенных потоках - для выделения чистого времени работы.
typedef std::vector<const BlockStreamProfileInfo *> BlockStreamProfileInfos;
BlockStreamProfileInfos nested_infos;
String column_names;
BlockStreamProfileInfo() : started(false), rows(0), blocks(0), bytes(0) {}
void update(Block & block);
void print(std::ostream & ostr) const;
};
/** Смотрит за тем, как работает источник блоков.
* Позволяет получить информацию для профайлинга:
* строк в секунду, блоков в секунду, мегабайт в секунду и т. п.
* Позволяет остановить чтение данных (во вложенных источниках).
*/
class IProfilingBlockInputStream : public IBlockInputStream
{
public:
Block read();
/// Наследники должны реализовать эту функцию.
virtual Block readImpl() = 0;
/// Получить информацию о скорости выполнения.
const BlockStreamProfileInfo & getInfo() const;
/** Установить колбэк, который вызывается, чтобы проверить, не был ли запрос остановлен.
* Колбэк пробрасывается во все листовые источники и вызывается там перед чтением данных.
* Следует иметь ввиду, что колбэк может вызываться из разных потоков.
*/
typedef boost::function<bool()> IsCancelledCallback;
void setIsCancelledCallback(IsCancelledCallback callback);
/** Установить колбэк прогресса выполнения.
* Колбэк пробрасывается во все источники.
* По-умолчанию, он вызывается для листовых источников, после каждого блока.
* (Но это может быть переопределено в методе progress())
* Функция принимает количество строк в последнем блоке, количество байт в последнем блоке.
* Следует иметь ввиду, что колбэк может вызываться из разных потоков.
*/
typedef boost::function<void(size_t, size_t)> ProgressCallback;
void setProgressCallback(ProgressCallback callback);
virtual void progress(Block & block);
protected:
BlockStreamProfileInfo info;
IsCancelledCallback is_cancelled_callback;
ProgressCallback progress_callback;
};
}