2013-04-24 10:31:32 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
2013-09-15 01:10:16 +00:00
|
|
|
|
#include <DB/IO/WriteBufferFromFile.h>
|
|
|
|
|
#include <DB/IO/CompressedWriteBuffer.h>
|
|
|
|
|
|
|
|
|
|
#include <DB/Columns/ColumnsNumber.h>
|
|
|
|
|
|
|
|
|
|
#include <DB/Interpreters/sortBlock.h>
|
|
|
|
|
|
2014-03-09 17:36:01 +00:00
|
|
|
|
#include <DB/Storages/MergeTree/MergeTreeData.h>
|
2013-04-24 10:31:32 +00:00
|
|
|
|
|
2013-09-15 01:10:16 +00:00
|
|
|
|
|
2013-04-24 10:31:32 +00:00
|
|
|
|
namespace DB
|
|
|
|
|
{
|
2014-03-09 17:36:01 +00:00
|
|
|
|
|
2014-03-13 17:44:00 +00:00
|
|
|
|
struct BlockWithDateInterval
|
|
|
|
|
{
|
|
|
|
|
Block block;
|
|
|
|
|
UInt16 min_date;
|
|
|
|
|
UInt16 max_date;
|
|
|
|
|
|
|
|
|
|
BlockWithDateInterval() : min_date(std::numeric_limits<UInt16>::max()), max_date(0) {}
|
|
|
|
|
BlockWithDateInterval(const Block & block_, UInt16 min_date_, UInt16 max_date_)
|
|
|
|
|
: block(block_), min_date(min_date_), max_date(max_date_) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef std::list<BlockWithDateInterval> BlocksWithDateIntervals;
|
|
|
|
|
|
2014-03-13 12:48:07 +00:00
|
|
|
|
/** Записывает новые куски с данными в merge-дерево.
|
|
|
|
|
*/
|
|
|
|
|
class MergeTreeDataWriter
|
|
|
|
|
{
|
|
|
|
|
public:
|
2014-03-13 17:44:00 +00:00
|
|
|
|
MergeTreeDataWriter(MergeTreeData & data_) : data(data_), log(&Logger::get("MergeTreeDataWriter")), flags(O_TRUNC | O_CREAT | O_WRONLY) {}
|
2014-03-13 12:48:07 +00:00
|
|
|
|
|
|
|
|
|
/** Разбивает блок на блоки, каждый из которых нужно записать в отдельный кусок.
|
|
|
|
|
* (читай: разбивает строки по месяцам)
|
|
|
|
|
* Работает детерминированно: если отдать на вход такой же блок, на выходе получатся такие же блоки в таком же порядке.
|
|
|
|
|
*/
|
2014-03-13 17:44:00 +00:00
|
|
|
|
BlocksWithDateIntervals splitBlockIntoParts(const Block & block, const MergeTreeData::LockedTableStructurePtr & structure);
|
2014-03-13 12:48:07 +00:00
|
|
|
|
|
|
|
|
|
/** Все строки должны относиться к одному месяцу. Возвращает название временного куска.
|
|
|
|
|
* temp_index - значение left и right для нового куска. Можно будет изменить при переименовании.
|
2014-03-13 17:44:00 +00:00
|
|
|
|
* Возвращает кусок с именем, начинающимся с tmp_, еще не добавленный в MergeTreeData.
|
2014-03-13 12:48:07 +00:00
|
|
|
|
*/
|
2014-03-13 17:44:00 +00:00
|
|
|
|
MergeTreeData::DataPartPtr writeTempPart(BlockWithDateInterval & block, UInt64 temp_index, const MergeTreeData::LockedTableStructurePtr & structure);
|
2014-03-13 12:48:07 +00:00
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
MergeTreeData & data;
|
2014-03-03 18:55:39 +00:00
|
|
|
|
|
2014-03-13 17:44:00 +00:00
|
|
|
|
Logger * log;
|
2014-03-03 18:55:39 +00:00
|
|
|
|
|
2014-03-13 17:44:00 +00:00
|
|
|
|
const int flags;
|
2014-03-03 18:55:39 +00:00
|
|
|
|
|
2014-03-13 17:44:00 +00:00
|
|
|
|
typedef std::set<std::string> OffsetColumns;
|
2014-03-03 18:55:39 +00:00
|
|
|
|
|
2013-04-24 10:31:32 +00:00
|
|
|
|
/// Записать данные одного столбца.
|
2013-07-16 14:55:01 +00:00
|
|
|
|
void writeData(const String & path, const String & name, const IDataType & type, const IColumn & column,
|
2014-03-13 17:44:00 +00:00
|
|
|
|
OffsetColumns & offset_columns, size_t level = 0);
|
2013-04-24 10:31:32 +00:00
|
|
|
|
};
|
2014-03-13 17:44:00 +00:00
|
|
|
|
|
2013-04-24 10:31:32 +00:00
|
|
|
|
}
|