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

82 lines
3.1 KiB
C
Raw Normal View History

2011-08-28 02:22:23 +00:00
#pragma once
#include <Poco/SharedPtr.h>
2010-03-01 16:59:51 +00:00
#include <DB/Core/Block.h>
namespace DB
{
2011-08-28 02:22:23 +00:00
using Poco::SharedPtr;
2010-03-01 16:59:51 +00:00
/** Интерфейс потока для чтения данных по блокам из БД.
* Реляционные операции предполагается делать также реализациями этого интерфейса.
*/
class IBlockInputStream
{
public:
2011-09-04 21:23:19 +00:00
typedef SharedPtr<IBlockInputStream> BlockInputStreamPtr;
typedef std::vector<BlockInputStreamPtr> BlockInputStreams;
2010-03-01 16:59:51 +00:00
/** Прочитать следующий блок.
* Если блоков больше нет - вернуть пустой блок (для которого operator bool возвращает false).
*/
virtual Block read() = 0;
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;
2012-03-05 02:34:20 +00:00
virtual String getShortName() const; /// То же самое, но без BlockInputStream на конце.
2011-09-04 21:23:19 +00:00
2011-10-24 12:10:59 +00:00
/** Создать копию объекта.
* Предполагается, что функция вызывается только до использования объекта (сразу после создания, до вызова других методов),
* только для того, чтобы можно было преобразовать параметр, переданный по ссылке в shared ptr.
*/
virtual BlockInputStreamPtr clone() = 0;
2011-09-04 21:23:19 +00:00
BlockInputStreams & getChildren() { return children; }
2012-03-05 02:34:20 +00:00
2012-06-25 03:42:08 +00:00
void dumpTree(std::ostream & ostr, size_t indent = 0, size_t multiplier = 1);
2012-03-05 02:34:20 +00:00
void dumpTreeWithProfile(std::ostream & ostr, size_t indent = 0);
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);
2012-06-25 03:42:08 +00:00
/** Получить текст, который идентифицирует этот источник и всё поддерево.
* Обычно он содержит идентификатор источника и getTreeID от всех детей.
*/
String getTreeID() const;
/** Проверить глубину конвейера.
* Если задано max_depth и глубина больше - кинуть исключение.
*/
size_t checkDepth(size_t max_depth) const;
2011-09-04 21:23:19 +00:00
protected:
BlockInputStreams children;
2012-03-09 04:45:27 +00:00
private:
void getLeavesImpl(BlockInputStreams & res, BlockInputStreamPtr this_shared_ptr = NULL);
size_t checkDepthImpl(size_t max_depth, size_t remaining_depth) const;
2010-03-01 16:59:51 +00:00
};
2011-08-28 02:22:23 +00:00
2011-09-04 21:23:19 +00:00
typedef IBlockInputStream::BlockInputStreamPtr BlockInputStreamPtr;
typedef IBlockInputStream::BlockInputStreams BlockInputStreams;
2011-08-28 02:22:23 +00:00
2010-03-01 16:59:51 +00:00
}