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>
|
2017-03-07 17:13:54 +00:00
|
|
|
|
#include <DB/Interpreters/Context.h>
|
2013-09-15 01:10:16 +00:00
|
|
|
|
|
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
|
|
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
|
Block block;
|
|
|
|
|
UInt16 min_date = std::numeric_limits<UInt16>::max(); /// For further updating, see updateDates method.
|
|
|
|
|
UInt16 max_date = std::numeric_limits<UInt16>::min();
|
|
|
|
|
|
|
|
|
|
BlockWithDateInterval() = default;
|
|
|
|
|
BlockWithDateInterval(const Block & block_, UInt16 min_date_, UInt16 max_date_)
|
|
|
|
|
: block(block_), min_date(min_date_), max_date(max_date_) {}
|
|
|
|
|
|
|
|
|
|
void updateDates(UInt16 date)
|
|
|
|
|
{
|
|
|
|
|
if (date < min_date)
|
|
|
|
|
min_date = date;
|
|
|
|
|
|
|
|
|
|
if (date > max_date)
|
|
|
|
|
max_date = date;
|
|
|
|
|
}
|
2014-03-13 17:44:00 +00:00
|
|
|
|
};
|
|
|
|
|
|
2016-05-28 10:35:44 +00:00
|
|
|
|
using BlocksWithDateIntervals = std::list<BlockWithDateInterval>;
|
2014-03-13 17:44:00 +00:00
|
|
|
|
|
2014-03-13 12:48:07 +00:00
|
|
|
|
/** Записывает новые куски с данными в merge-дерево.
|
|
|
|
|
*/
|
|
|
|
|
class MergeTreeDataWriter
|
|
|
|
|
{
|
|
|
|
|
public:
|
2017-04-01 07:20:54 +00:00
|
|
|
|
MergeTreeDataWriter(MergeTreeData & data_, Context & context_) : data(data_), context(context_), log(&Logger::get(data.getLogName() + " (Writer)")) {}
|
2014-03-13 12:48:07 +00:00
|
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
|
/** Split the block to blocks, each of them must be written as separate part.
|
|
|
|
|
* (split rows by months)
|
|
|
|
|
* Works deterministically: if same block was passed, function will return same result in same order.
|
|
|
|
|
*/
|
|
|
|
|
BlocksWithDateIntervals splitBlockIntoParts(const Block & block);
|
2014-03-13 12:48:07 +00:00
|
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
|
/** All rows must correspond to same month.
|
|
|
|
|
* 'temp_index' - value for 'left' and 'right' for new part. Could be changed later at rename.
|
|
|
|
|
* Returns part with name starting with 'tmp_', yet not added to MergeTreeData.
|
|
|
|
|
*/
|
|
|
|
|
MergeTreeData::MutableDataPartPtr writeTempPart(BlockWithDateInterval & block, Int64 temp_index);
|
2014-03-13 12:48:07 +00:00
|
|
|
|
|
|
|
|
|
private:
|
2017-04-01 07:20:54 +00:00
|
|
|
|
MergeTreeData & data;
|
|
|
|
|
Context & context;
|
2014-03-03 18:55:39 +00:00
|
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
|
Logger * log;
|
2013-04-24 10:31:32 +00:00
|
|
|
|
};
|
2014-03-13 17:44:00 +00:00
|
|
|
|
|
2013-04-24 10:31:32 +00:00
|
|
|
|
}
|