dbms: renamed PrimaryKey to Storage.

This commit is contained in:
Alexey Milovidov 2009-07-27 12:41:54 +00:00
parent 5330d6f96d
commit eed5be3979
9 changed files with 57 additions and 55 deletions

View File

@ -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;
};
}

View File

@ -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
};

View File

@ -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_)
{

View File

@ -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);

View File

@ -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_);

View File

@ -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);
}
};

View File

@ -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);

View File

@ -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;

View File

@ -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();