ClickHouse/dbms/include/DB/DataStreams/IBlockInputStream.h

117 lines
4.9 KiB
C++
Raw Normal View History

2011-08-28 02:22:23 +00:00
#pragma once
#include <vector>
#include <memory>
#include <functional>
#include <boost/noncopyable.hpp>
2010-03-01 16:59:51 +00:00
#include <DB/Core/Block.h>
namespace DB
{
class IBlockInputStream;
using BlockInputStreamPtr = std::shared_ptr<IBlockInputStream>;
using BlockInputStreams = std::vector<BlockInputStreamPtr>;
class TableStructureReadLock;
using TableStructureReadLockPtr = std::shared_ptr<TableStructureReadLock>;
using TableStructureReadLocks = std::vector<TableStructureReadLockPtr>;
using TableStructureReadLocksList = std::list<TableStructureReadLockPtr>;
struct Progress;
2011-08-28 02:22:23 +00:00
/** Коллбэк для отслеживания прогресса выполнения запроса.
* Используется в IProfilingBlockInputStream и Context-е.
* Функция принимает количество строк в последнем блоке, количество байт в последнем блоке.
* Следует иметь ввиду, что колбэк может вызываться из разных потоков.
*/
using ProgressCallback = std::function<void(const Progress & progress)>;
2011-08-28 02:22:23 +00:00
2010-03-01 16:59:51 +00:00
/** Интерфейс потока для чтения данных по блокам из БД.
* Реляционные операции предполагается делать также реализациями этого интерфейса.
*/
class IBlockInputStream : private boost::noncopyable
2010-03-01 16:59:51 +00:00
{
public:
IBlockInputStream() {}
2010-03-01 16:59:51 +00:00
/** Прочитать следующий блок.
* Если блоков больше нет - вернуть пустой блок (для которого operator bool возвращает false).
*/
virtual Block read() = 0;
2015-10-12 14:53:16 +00:00
/** Получить информацию про последний полученный блок.
*/
virtual BlockExtraInfo getBlockExtraInfo() const
{
throw Exception("Method getBlockExtraInfo is not supported by the data stream " + getName(), ErrorCodes::NOT_IMPLEMENTED);
}
2011-10-31 06:37:12 +00:00
/** Прочитать что-нибудь перед началом всех данных или после конца всех данных.
2013-09-13 20:33:09 +00:00
* В функции readSuffix можно реализовать финализацию, которая может привести к исключению.
* readPrefix() должна вызываться до первого вызова read().
* readSuffix() должна вызываться после того, как read() вернула пустой блок, или после вызова cancel(), но не во время выполнения read().
2011-10-31 06:37:12 +00:00
*/
virtual void readPrefix() {}
virtual void readSuffix() {}
2010-03-01 16:59:51 +00:00
virtual ~IBlockInputStream() {}
2011-09-04 21:23:19 +00:00
/** Для вывода дерева преобразований потока данных (плана выполнения запроса).
*/
virtual String getName() const = 0;
/** Уникальный идентификатор части конвейера выполнения запроса.
* Источники с одинаковым идентификатором считаются идентичными
* (выдающими одинаковые данные), и могут быть заменены на один источник
* при одновременном выполнении сразу нескольких запросов.
* Если источник нельзя склеивать ни с каким другим - верните в качестве идентификатора адрес объекта.
*/
virtual String getID() const = 0;
2011-09-04 21:23:19 +00:00
BlockInputStreams & getChildren() { return children; }
2012-06-25 03:42:08 +00:00
void dumpTree(std::ostream & ostr, size_t indent = 0, size_t multiplier = 1);
2011-09-04 21:23:19 +00:00
2012-03-09 04:45:27 +00:00
/// Получить листовые источники (не считая этот).
BlockInputStreams getLeaves();
2012-08-23 23:49:28 +00:00
/// Получить количество строк и байт, прочитанных в листовых источниках.
void getLeafRowsBytes(size_t & rows, size_t & bytes);
/** Проверить глубину конвейера.
* Если задано max_depth и глубина больше - кинуть исключение.
*/
size_t checkDepth(size_t max_depth) const;
/** Не давать изменить таблицу, пока жив поток блоков.
*/
void addTableLock(const TableStructureReadLockPtr & lock) { table_locks.push_back(lock); }
2013-05-04 05:20:07 +00:00
protected:
TableStructureReadLocks table_locks;
2012-03-09 04:45:27 +00:00
BlockInputStreams children;
2012-03-09 04:45:27 +00:00
private:
2014-04-08 07:31:51 +00:00
void getLeavesImpl(BlockInputStreams & res, BlockInputStreamPtr this_shared_ptr = nullptr);
size_t checkDepthImpl(size_t max_depth, size_t level) const;
2013-05-04 05:20:07 +00:00
/** Получить текст, который идентифицирует этот источник и всё поддерево.
* В отличие от getID - без учёта параметров.
*/
String getTreeID() const;
2010-03-01 16:59:51 +00:00
};
2011-08-28 02:22:23 +00:00
2010-03-01 16:59:51 +00:00
}