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

209 lines
10 KiB
C
Raw Normal View History

2011-08-15 01:12:57 +00:00
#pragma once
2010-03-04 19:20:28 +00:00
#include <Yandex/logger_useful.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>
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>
2011-08-15 01:12:57 +00:00
#include <DB/Parsers/IAST.h>
2013-08-07 13:07:42 +00:00
#include <DB/Parsers/ASTAlterQuery.h>
#include <DB/Interpreters/Settings.h>
#include <DB/Storages/StoragePtr.h>
#include "DatabaseDropper.h"
#include <Poco/File.h>
2010-03-01 16:59:51 +00:00
namespace DB
{
class Context;
2010-03-01 16:59:51 +00:00
/** Хранилище. Отвечает за:
* - хранение данных таблицы;
* - определение, в каком файле (или не файле) хранятся данные;
* - поиск данных и обновление данных;
* - структура хранения данных (сжатие, etc.)
* - конкуррентный доступ к данным (блокировки, etc.)
*/
2012-11-30 00:52:45 +00:00
class IStorage : private boost::noncopyable
2010-03-01 16:59:51 +00:00
{
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;
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; }
/** Возвращает true, если хранилище поддерживает запросы с секцией SAMPLE.
*/
virtual bool supportsSampling() const { return false; }
2013-04-23 11:08:41 +00:00
/** Возвращает true, если хранилище поддерживает запросы с секцией FINAL.
*/
virtual bool supportsFinal() const { return false; }
/** Возвращает true, если хранилище поддерживает запросы с секцией PREWHERE.
*/
virtual bool supportsPrewhere() 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
*
* settings - настройки на один запрос.
* Обычно Storage не заботится об этих настройках, так как они применяются в интерпретаторе.
* Но, например, при распределённой обработке запроса, настройки передаются на удалённый сервер.
*
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,
const Settings & settings,
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
{
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
{
throw Exception("Method write is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
2011-08-19 18:31:14 +00:00
}
2011-11-05 23:31:19 +00:00
/** Удалить данные таблицы. После вызова этого метода, использование объекта некорректно (его можно лишь уничтожить).
2011-08-19 18:31:14 +00:00
*/
void drop()
{
drop_on_destroy = true;
}
/** Вызывается перед удалением директории с данными и вызовом деструктора.
* Если не требуется никаких действий, кроме удаления директории с данными, этот метод можно оставить пустым.
*/
virtual void dropImpl() {}
2011-08-19 18:31:14 +00:00
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);
2012-06-18 06:19:13 +00:00
}
2011-08-19 18:31:14 +00:00
/** ALTER таблицы в виде изменения столбцов, не затрагивающий изменение Storage или его параметров.
* (ALTER, затрагивающий изменение движка, делается внешним кодом, путём копирования данных.)
*/
2013-08-09 00:12:59 +00:00
virtual void alter(const ASTAlterQuery::Parameters & params)
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);
2012-07-16 20:25:19 +00:00
}
/** Получить запрос CREATE TABLE, который описывает данную таблицу.
* Обычно этот запрос хранится и достаётся из .sql файла из директории с метаданными.
* Этот метод используется и имеет смысл только если для таблицы не создаётся .sql файл
* - то есть, только для таблиц, которые создаются не пользователем, а самой системой - например, для таблиц типа ChunkRef.
*/
virtual ASTPtr getCustomCreateQuery(const Context & context) const
{
throw Exception("Method getCustomCreateQuery is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
}
2013-09-30 01:29:19 +00:00
/** Если при уничтожении объекта надо сделать какую-то сложную работу - сделать её заранее.
* Например, если таблица содержит какие-нибудь потоки для фоновой работы - попросить их завершиться и дождаться завершения.
* По-умолчанию - ничего не делать.
*/
virtual void shutdown() {}
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;
/** Проверить, что блок с данными для записи содержит все столбцы таблицы с правильными типами,
2013-02-25 10:23:31 +00:00
* содержит только столбцы таблицы, и все столбцы различны.
* Если need_all, еще проверяет, что все столбцы таблицы есть в блоке.
2011-08-15 02:24:44 +00:00
*/
2013-02-25 10:23:31 +00:00
void check(const Block & block, bool need_all = false) const;
/** Возвращает владеющий указатель на себя.
*/
StoragePtr thisPtr()
{
if (!this_ptr.lock())
{
boost::shared_ptr<StoragePtr::Wrapper> p(new StoragePtr::Wrapper(this));
this_ptr = p;
return StoragePtr(this_ptr);
}
else
{
return StoragePtr(this_ptr);
}
}
/** Не дает удалить БД до удаления таблицы. Присваивается перед удалением таблицы или БД.
*/
DatabaseDropperPtr database_to_drop;
bool drop_on_destroy;
/** Директория с данными. Будет удалена после удаления таблицы (после вызова dropImpl).
*/
std::string path_to_remove_on_drop;
2010-03-01 16:59:51 +00:00
protected:
IStorage() : drop_on_destroy(false) {}
2013-09-23 12:01:19 +00:00
/// реализация alter, модифицирующая список столбцов.
2013-11-13 09:47:12 +00:00
void alterColumns(const ASTAlterQuery::Parameters & params, NamesAndTypesListPtr & columns, const Context & context) const;
private:
boost::weak_ptr<StoragePtr::Wrapper> this_ptr;
};
2010-03-01 16:59:51 +00:00
2013-09-23 12:01:19 +00:00
typedef std::vector<StoragePtr> StorageVector;
2011-08-15 01:12:57 +00:00
}