mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 07:01:59 +00:00
dbms: renamed PrimaryKey to Storage.
This commit is contained in:
parent
5330d6f96d
commit
eed5be3979
@ -7,7 +7,7 @@
|
||||
#include <Poco/SharedPtr.h>
|
||||
|
||||
#include <DB/Column.h>
|
||||
#include <DB/PrimaryKey.h>
|
||||
#include <DB/Storage.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
@ -23,8 +23,8 @@ struct ColumnGroup
|
||||
typedef std::vector<size_t> ColumnNumbers;
|
||||
ColumnNumbers column_numbers;
|
||||
|
||||
/// Первичный ключ
|
||||
Poco::SharedPtr<IPrimaryKey> primary_key;
|
||||
/// Хранилище
|
||||
Poco::SharedPtr<IStorage> storage;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ namespace ErrorCodes
|
||||
METHOD_NOT_IMPLEMENTED,
|
||||
CANT_READ_INDEX_FILE,
|
||||
TOO_FEW_COLUMNS_FOR_KEY,
|
||||
PRIMARY_KEY_WAS_NOT_ATTACHED,
|
||||
STORAGE_WAS_NOT_ATTACHED,
|
||||
CANT_READ_DATA_FILE,
|
||||
TOO_MANY_COLUMNS_FOR_KEY
|
||||
};
|
||||
|
@ -1,5 +1,5 @@
|
||||
#ifndef DBMS_PRIMARY_KEY_H
|
||||
#define DBMS_PRIMARY_KEY_H
|
||||
#ifndef DBMS_STORAGE_H
|
||||
#define DBMS_STORAGE_H
|
||||
|
||||
#include <Poco/SharedPtr.h>
|
||||
|
||||
@ -14,12 +14,14 @@ class ColumnGroup;
|
||||
class Table;
|
||||
|
||||
|
||||
/** Первичный ключ - самая важная часть БД.
|
||||
/** Хранилище - самая важная часть БД.
|
||||
* Отвечает за:
|
||||
* - хранение данных одной кол-группы таблицы
|
||||
* - определение, в каком файле (или не файле) хранятся данные;
|
||||
* - поиск данных и обновление данных;
|
||||
* - структура хранения данных (сжатие, etc.)
|
||||
* - конкуррентный доступ к данным (блокировки, etc.)
|
||||
* - реализует первичный ключ
|
||||
*
|
||||
* Присутствуют следующие особенности первичного ключа:
|
||||
* - может состоять из нескольких частей. Например, значения первых нескольких столбцов индексируются
|
||||
@ -28,14 +30,14 @@ class Table;
|
||||
* - может не полностью индексировать столбцы, однозначно идентифицирующие строку в таблице -
|
||||
* для работы с пачками строк.
|
||||
*/
|
||||
class IPrimaryKey
|
||||
class IStorage
|
||||
{
|
||||
friend class Table;
|
||||
|
||||
private:
|
||||
/** Установить указатель на таблицу и кол-группу.
|
||||
* - часть инициализации, которая выполняется при инициализации таблицы.
|
||||
* (инициализация первичного ключа выполняется в два шага:
|
||||
* (инициализация хранилища выполняется в два шага:
|
||||
* 1 - конструктор,
|
||||
* 2 - добавление к таблице (выполняется в конструкторе Table))
|
||||
*/
|
||||
@ -50,25 +52,25 @@ public:
|
||||
/** Записать пачку данных в таблицу, обновляя существующие данные, если они есть.
|
||||
* @param data - набор данных вида ключ (набор столбцов) -> значение (набор столбцов)
|
||||
* @param mask - битовая маска - какие столбцы входят в кол-группу,
|
||||
* которую индексирует этот первичный ключ
|
||||
* которую хранит это хранилище
|
||||
*/
|
||||
virtual void merge(const AggregatedRowSet & data, const ColumnMask & mask) = 0;
|
||||
|
||||
virtual ~IPrimaryKey() {}
|
||||
virtual ~IStorage() {}
|
||||
};
|
||||
|
||||
|
||||
/** Реализует метод addToTable(),
|
||||
* а также содержит члены table, column_group.
|
||||
*/
|
||||
class PrimaryKeyBase : public IPrimaryKey
|
||||
class StorageBase : public IStorage
|
||||
{
|
||||
protected:
|
||||
/// Слабые указатели на таблицу и column_group, которые владеют этим первичным ключём.
|
||||
/// Слабые указатели на таблицу и column_group, которые владеют этим хранилищем.
|
||||
Table * table;
|
||||
ColumnGroup * column_group;
|
||||
|
||||
PrimaryKeyBase() : table(0), column_group(0) {}
|
||||
StorageBase() : table(0), column_group(0) {}
|
||||
|
||||
void addToTable(Table * table_, ColumnGroup * column_group_)
|
||||
{
|
@ -1,24 +1,24 @@
|
||||
#ifndef DBMS_PRIMARY_KEY_NONE_H
|
||||
#define DBMS_PRIMARY_KEY_NONE_H
|
||||
#ifndef DBMS_STORAGE_NO_KEY_H
|
||||
#define DBMS_STORAGE_NO_KEY_H
|
||||
|
||||
#include <Poco/SharedPtr.h>
|
||||
#include <Poco/File.h>
|
||||
#include <Poco/FileStream.h>
|
||||
|
||||
#include <DB/PrimaryKey.h>
|
||||
#include <DB/Storage.h>
|
||||
#include <DB/TablePartReader.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
/** Самый простой первичный ключ - ничего не индексирует;
|
||||
/** Самое простое хранилище - в нём первичный ключ ничего не индексирует;
|
||||
* для чтения или обновления приходится читать файл целиком.
|
||||
* - удобно для логов.
|
||||
*/
|
||||
class PrimaryKeyNone : public PrimaryKeyBase
|
||||
class StorageNoKey : public StorageBase
|
||||
{
|
||||
friend class PrimaryKeyNoneTablePartReader;
|
||||
friend class StorageNoKeyTablePartReader;
|
||||
private:
|
||||
std::string path;
|
||||
std::string name;
|
||||
@ -28,7 +28,7 @@ private:
|
||||
|
||||
public:
|
||||
/** Путь со слешем на конце. */
|
||||
PrimaryKeyNone(const std::string & path_, const std::string & name_);
|
||||
StorageNoKey(const std::string & path_, const std::string & name_);
|
||||
|
||||
/** Просто дописывает данные в конец. */
|
||||
void merge(const AggregatedRowSet & data, const ColumnMask & mask);
|
||||
@ -38,16 +38,16 @@ public:
|
||||
};
|
||||
|
||||
|
||||
class PrimaryKeyNoneTablePartReader : public ITablePartReader
|
||||
class StorageNoKeyTablePartReader : public ITablePartReader
|
||||
{
|
||||
friend class PrimaryKeyNone;
|
||||
friend class StorageNoKey;
|
||||
private:
|
||||
const Row key;
|
||||
/// слабый указатель на первичный ключ
|
||||
PrimaryKeyNone * pk;
|
||||
/// слабый указатель на хранилище
|
||||
StorageNoKey * pk;
|
||||
Poco::FileInputStream istr;
|
||||
|
||||
PrimaryKeyNoneTablePartReader(const Row & key_, PrimaryKeyNone * pk_);
|
||||
StorageNoKeyTablePartReader(const Row & key_, StorageNoKey * pk_);
|
||||
|
||||
public:
|
||||
bool fetch(Row & row);
|
@ -1,5 +1,5 @@
|
||||
#ifndef DBMS_PRIMARY_KEY_PLAIN_H
|
||||
#define DBMS_PRIMARY_KEY_PLAIN_H
|
||||
#ifndef DBMS_STORAGE_PLAIN_H
|
||||
#define DBMS_STORAGE_PLAIN_H
|
||||
|
||||
#include <set>
|
||||
#include <map>
|
||||
@ -9,20 +9,20 @@
|
||||
|
||||
#include <DB/Table.h>
|
||||
|
||||
#include <DB/PrimaryKey.h>
|
||||
#include <DB/Storage.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
/** Простой, "плоский" первичный ключ.
|
||||
/** Простое хранилище с "плоским" первичным ключом.
|
||||
* Хранит список смещений в бинарном файле, список свободных блоков - в другом бинарном файле.
|
||||
* Поиск в этом файле линейный.
|
||||
* При обновлении данных, индексный файл полностью перезаписывается.
|
||||
* Файл с данными не сжатый.
|
||||
* Индекс полностью загружается в память во время работы.
|
||||
*/
|
||||
class PrimaryKeyPlain : public PrimaryKeyBase
|
||||
class StoragePlain : public StorageBase
|
||||
{
|
||||
private:
|
||||
std::string path;
|
||||
@ -52,7 +52,7 @@ private:
|
||||
|
||||
public:
|
||||
/** Путь со слешем на конце. */
|
||||
PrimaryKeyPlain(const std::string & path_, const std::string & name_);
|
||||
StoragePlain(const std::string & path_, const std::string & name_);
|
||||
|
||||
void addToTable(Table * table_, ColumnGroup * column_group_);
|
||||
|
@ -14,9 +14,9 @@ namespace DB
|
||||
|
||||
class Table
|
||||
{
|
||||
friend class PrimaryKeyNone;
|
||||
friend class PrimaryKeyNoneTablePartReader;
|
||||
friend class PrimaryKeyPlain;
|
||||
friend class StorageNoKey;
|
||||
friend class StorageNoKeyTablePartReader;
|
||||
friend class StoragePlain;
|
||||
|
||||
public:
|
||||
typedef std::vector<Column> Columns;
|
||||
@ -48,7 +48,7 @@ public:
|
||||
{
|
||||
/// Пропишем в первичных ключах в кол-группах указатель на таблицу и кол-группу
|
||||
for (ColumnGroups::iterator it = column_groups->begin(); it != column_groups->end(); ++it)
|
||||
it->primary_key->addToTable(this, &*it);
|
||||
it->storage->addToTable(this, &*it);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -3,13 +3,13 @@
|
||||
#include <DB/Table.h>
|
||||
#include <DB/ColumnGroup.h>
|
||||
|
||||
#include <DB/PrimaryKeyNone.h>
|
||||
#include <DB/StorageNoKey.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
PrimaryKeyNone::PrimaryKeyNone(const std::string & path_, const std::string & name_)
|
||||
StorageNoKey::StorageNoKey(const std::string & path_, const std::string & name_)
|
||||
: path(path_),
|
||||
name(name_),
|
||||
data_file_name(path + name + ".dat"),
|
||||
@ -20,11 +20,11 @@ PrimaryKeyNone::PrimaryKeyNone(const std::string & path_, const std::string & na
|
||||
}
|
||||
|
||||
|
||||
void PrimaryKeyNone::merge(const AggregatedRowSet & data, const ColumnMask & mask)
|
||||
void StorageNoKey::merge(const AggregatedRowSet & data, const ColumnMask & mask)
|
||||
{
|
||||
if (!table || !column_group)
|
||||
throw Exception("Primary key was not attached to table and column group",
|
||||
ErrorCodes::PRIMARY_KEY_WAS_NOT_ATTACHED);
|
||||
throw Exception("Storage was not attached to table and column group",
|
||||
ErrorCodes::STORAGE_WAS_NOT_ATTACHED);
|
||||
|
||||
/// просто дописываем данные в конец файла
|
||||
Poco::FileOutputStream ostr(data_file_name, std::ios::out | std::ios::binary | std::ios::app);
|
||||
@ -44,20 +44,20 @@ void PrimaryKeyNone::merge(const AggregatedRowSet & data, const ColumnMask & mas
|
||||
}
|
||||
|
||||
|
||||
Poco::SharedPtr<ITablePartReader> PrimaryKeyNone::read(const Row & key)
|
||||
Poco::SharedPtr<ITablePartReader> StorageNoKey::read(const Row & key)
|
||||
{
|
||||
return new PrimaryKeyNoneTablePartReader(key, this);
|
||||
return new StorageNoKeyTablePartReader(key, this);
|
||||
}
|
||||
|
||||
|
||||
PrimaryKeyNoneTablePartReader::PrimaryKeyNoneTablePartReader(
|
||||
const Row & key_, PrimaryKeyNone * pk_)
|
||||
StorageNoKeyTablePartReader::StorageNoKeyTablePartReader(
|
||||
const Row & key_, StorageNoKey * pk_)
|
||||
: key(key_), pk(pk_), istr(pk->data_file_name)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool PrimaryKeyNoneTablePartReader::fetch(Row & row)
|
||||
bool StorageNoKeyTablePartReader::fetch(Row & row)
|
||||
{
|
||||
if (key.size() > pk->column_group->column_numbers.size())
|
||||
throw Exception("Too many columns specified for key", ErrorCodes::TOO_MANY_COLUMNS_FOR_KEY);
|
@ -2,13 +2,13 @@
|
||||
#include <Poco/FileStream.h>
|
||||
#include <Poco/BinaryWriter.h>
|
||||
|
||||
#include <DB/PrimaryKeyPlain.h>
|
||||
#include <DB/StoragePlain.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
PrimaryKeyPlain::PrimaryKeyPlain(const std::string & path_, const std::string & name_)
|
||||
StoragePlain::StoragePlain(const std::string & path_, const std::string & name_)
|
||||
: path(path_),
|
||||
name(name_),
|
||||
data_file_name(path + name + ".dat"),
|
||||
@ -44,9 +44,9 @@ PrimaryKeyPlain::PrimaryKeyPlain(const std::string & path_, const std::string &
|
||||
}
|
||||
|
||||
|
||||
void PrimaryKeyPlain::addToTable(Table * table_, ColumnGroup * column_group_)
|
||||
void StoragePlain::addToTable(Table * table_, ColumnGroup * column_group_)
|
||||
{
|
||||
PrimaryKeyBase::addToTable(table_, column_group_);
|
||||
StorageBase::addToTable(table_, column_group_);
|
||||
|
||||
/// прочитаем список смещений
|
||||
Poco::FileInputStream offsets_istr(offsets_file_name);
|
||||
@ -77,7 +77,7 @@ void PrimaryKeyPlain::addToTable(Table * table_, ColumnGroup * column_group_)
|
||||
}
|
||||
|
||||
|
||||
void PrimaryKeyPlain::merge(const AggregatedRowSet & data, const ColumnMask & mask)
|
||||
void StoragePlain::merge(const AggregatedRowSet & data, const ColumnMask & mask)
|
||||
{
|
||||
/* std::set<Row> keys;
|
||||
|
@ -4,7 +4,7 @@
|
||||
#include <DB/Table.h>
|
||||
#include <DB/Column.h>
|
||||
#include <DB/ColumnType.h>
|
||||
#include <DB/PrimaryKeyNone.h>
|
||||
#include <DB/StorageNoKey.h>
|
||||
#include <DB/RowSet.h>
|
||||
|
||||
|
||||
@ -64,7 +64,7 @@ int main(int argc, char ** argv)
|
||||
for (size_t i = 0; i < columns->size(); ++i)
|
||||
column_group0.column_numbers.push_back(i);
|
||||
|
||||
column_group0.primary_key = new DB::PrimaryKeyNone("./", "TestPrimaryKeyNone");
|
||||
column_group0.storage = new DB::StorageNoKey("./", "TestStorageNoKey");
|
||||
|
||||
Poco::SharedPtr<DB::Table::ColumnGroups> column_groups = new DB::Table::ColumnGroups;
|
||||
column_groups->push_back(column_group0);
|
||||
@ -136,7 +136,7 @@ int main(int argc, char ** argv)
|
||||
|
||||
stopwatch.restart();
|
||||
|
||||
column_group0.primary_key->merge(data, mask);
|
||||
column_group0.storage->merge(data, mask);
|
||||
|
||||
stopwatch.stop();
|
||||
std::cout << "Saving data: " << static_cast<double>(stopwatch.elapsed()) / 1000000 << std::endl;
|
||||
@ -145,7 +145,7 @@ int main(int argc, char ** argv)
|
||||
/// читаем таблицу
|
||||
{
|
||||
DB::Row key;
|
||||
Poco::SharedPtr<DB::ITablePartReader> reader(column_group0.primary_key->read(key));
|
||||
Poco::SharedPtr<DB::ITablePartReader> reader(column_group0.storage->read(key));
|
||||
|
||||
stopwatch.restart();
|
||||
|
Loading…
Reference in New Issue
Block a user