ClickHouse/dbms/include/DB/Storages/IStorage.h

135 lines
6.3 KiB
C
Raw Normal View History

2011-08-15 01:12:57 +00:00
#pragma once
2010-03-04 19:20:28 +00:00
2010-03-01 16:59:51 +00:00
#include <Poco/SharedPtr.h>
2010-05-21 19:52:50 +00:00
#include <DB/Core/Defines.h>
2011-08-09 15:57:33 +00:00
#include <DB/Core/Names.h>
2011-08-15 02:24:44 +00:00
#include <DB/Core/NamesAndTypes.h>
2010-03-04 19:20:28 +00:00
#include <DB/Core/Exception.h>
2012-05-22 18:32:45 +00:00
#include <DB/Core/QueryProcessingStage.h>
2011-08-15 01:12:57 +00:00
2010-03-04 19:20:28 +00:00
#include <DB/DataStreams/IBlockInputStream.h>
2010-03-18 19:32:14 +00:00
#include <DB/DataStreams/IBlockOutputStream.h>
2010-03-04 19:20:28 +00:00
2011-08-15 01:12:57 +00:00
#include <DB/Parsers/IAST.h>
2010-03-01 16:59:51 +00:00
namespace DB
{
using Poco::SharedPtr;
/** Хранилище. Отвечает за:
* - хранение данных таблицы;
* - определение, в каком файле (или не файле) хранятся данные;
* - поиск данных и обновление данных;
* - структура хранения данных (сжатие, etc.)
* - конкуррентный доступ к данным (блокировки, etc.)
*/
class IStorage
{
public:
2010-03-04 19:20:28 +00:00
/// Основное имя типа таблицы (например, StorageWithoutKey).
virtual std::string getName() const = 0;
2010-03-01 16:59:51 +00:00
2011-08-15 02:24:44 +00:00
/// Имя самой таблицы (например, hits)
virtual std::string getTableName() const = 0;
/** Получить список имён и типов столбцов таблицы.
*/
2011-11-01 17:12:11 +00:00
virtual const NamesAndTypesList & getColumnsList() const = 0;
NamesAndTypesMap getColumnsMap() const;
const DataTypePtr getDataTypeByName(const String & column_name) const;
2011-08-15 02:24:44 +00:00
2011-10-31 06:37:12 +00:00
/** То же самое, но в виде блока-образца.
*/
Block getSampleBlock() const;
/** Возвращает true, если хранилище получает данные с удалённого сервера или серверов.
*/
virtual bool isRemote() const { return false; }
2010-03-04 19:20:28 +00:00
/** Читать набор столбцов из таблицы.
* Принимает список столбцов, которых нужно прочитать, а также описание запроса,
* из которого может быть извлечена информация о том, каким способом извлекать данные
* (индексы, блокировки и т. п.)
2012-01-09 19:20:48 +00:00
* Возвращает поток с помощью которого можно последовательно читать данные
* или несколько потоков для параллельного чтения данных.
2012-05-22 18:32:45 +00:00
* Также в processed_stage записывается, до какой стадии запрос был обработан.
* (Обычно функция только читает столбцы из списка, но в других случаях,
* например, запрос может быть частично обработан на удалённом сервере.)
2012-01-09 19:20:48 +00:00
*
2012-05-30 04:45:49 +00:00
* threads - рекомендация, сколько потоков возвращать,
* если хранилище может возвращать разное количество потоков.
2010-03-01 16:59:51 +00:00
*/
2012-01-09 19:20:48 +00:00
virtual BlockInputStreams read(
2011-08-09 15:57:33 +00:00
const Names & column_names,
2011-08-15 01:12:57 +00:00
ASTPtr query,
2012-05-22 18:32:45 +00:00
QueryProcessingStage::Enum & processed_stage,
2012-01-09 19:20:48 +00:00
size_t max_block_size = DEFAULT_BLOCK_SIZE,
2012-05-30 04:45:49 +00:00
unsigned threads = 1)
2010-03-04 19:20:28 +00:00
{
2011-08-19 18:31:14 +00:00
throw Exception("Method read() is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
2010-03-04 19:20:28 +00:00
}
2010-03-01 16:59:51 +00:00
2010-03-18 19:32:14 +00:00
/** Пишет данные в таблицу.
* Принимает описание запроса, в котором может содержаться информация о методе записи данных.
* Возвращает объект, с помощью которого можно последовательно писать данные.
*/
2011-08-28 02:22:23 +00:00
virtual BlockOutputStreamPtr write(
2011-08-15 01:12:57 +00:00
ASTPtr query)
2010-03-18 19:32:14 +00:00
{
2011-08-19 18:31:14 +00:00
throw Exception("Method write() is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
}
2011-11-05 23:31:19 +00:00
/** Удалить данные таблицы. После вызова этого метода, использование объекта некорректно (его можно лишь уничтожить).
2012-06-18 06:19:13 +00:00
* Если директория с данными есть, то она будет удалена перед вызовом этого метода.
2011-08-19 18:31:14 +00:00
*/
virtual void drop()
{
throw Exception("Method drop() is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
}
2012-06-18 06:19:13 +00:00
/** Переименовать таблицу.
* Переименование имени в файле с метаданными, имени в списке таблиц в оперативке, осуществляется отдельно.
* В этой функции нужно переименовать директорию с данными, если она есть.
*/
virtual void rename(const String & new_path_to_db, const String & new_name)
{
throw Exception("Method rename() is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
}
2011-08-19 18:31:14 +00:00
/** ALTER таблицы в виде изменения столбцов, не затрагивающий изменение Storage или его параметров.
* (ALTER, затрагивающий изменение движка, делается внешним кодом, путём копирования данных.)
*/
2011-11-01 17:12:11 +00:00
virtual void alter(NamesAndTypesListPtr columns)
2011-08-19 18:31:14 +00:00
{
throw Exception("Method alter() is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
2010-03-18 19:32:14 +00:00
}
2012-07-16 20:25:19 +00:00
/** Выполнить какую-либо фоновую работу. Например, объединение кусков в таблице типа MergeTree.
2012-07-31 16:37:20 +00:00
* Возвращает - была ли выполнена какая-либо работа.
2012-07-16 20:25:19 +00:00
*/
2012-07-31 16:37:20 +00:00
virtual bool optimize()
2012-07-16 20:25:19 +00:00
{
throw Exception("Method optimize() is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
}
2010-03-01 16:59:51 +00:00
virtual ~IStorage() {}
2011-08-15 02:24:44 +00:00
/** Проверить, что все запрошенные имена есть в таблице и заданы корректно.
* (список имён не пустой и имена не повторяются)
*/
void check(const Names & column_names) const;
/** Проверить, что блок с данными для записи содержит все столбцы таблицы с правильными типами,
* и содержит только столбцы таблицы.
*/
void check(const Block & block) const;
2010-03-01 16:59:51 +00:00
};
2011-08-15 01:12:57 +00:00
typedef SharedPtr<IStorage> StoragePtr;
2010-03-01 16:59:51 +00:00
2011-08-15 01:12:57 +00:00
}