2012-07-25 19:53:43 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <queue>
|
|
|
|
|
|
|
|
#include <DB/Core/SortDescription.h>
|
|
|
|
|
|
|
|
#include <DB/DataStreams/IProfilingBlockInputStream.h>
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
|
|
|
/** Соединяет несколько сортированных потоков в один.
|
|
|
|
*/
|
|
|
|
class MergingSortedBlockInputStream : public IProfilingBlockInputStream
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
MergingSortedBlockInputStream(BlockInputStreams inputs_, SortDescription & description_, size_t max_block_size_)
|
|
|
|
: inputs(inputs_), description(description_), max_block_size(max_block_size_), first(true),
|
2012-07-25 20:17:35 +00:00
|
|
|
num_columns(0), source_blocks(inputs.size()), all_columns(inputs.size()), sort_columns(inputs.size())
|
2012-07-25 19:53:43 +00:00
|
|
|
{
|
|
|
|
children.insert(children.end(), inputs.begin(), inputs.end());
|
|
|
|
}
|
|
|
|
|
|
|
|
Block readImpl();
|
|
|
|
|
|
|
|
String getName() const { return "MergingSortedBlockInputStream"; }
|
|
|
|
|
|
|
|
BlockInputStreamPtr clone() { return new MergingSortedBlockInputStream(inputs, description, max_block_size); }
|
|
|
|
|
|
|
|
private:
|
|
|
|
BlockInputStreams inputs;
|
|
|
|
SortDescription description;
|
|
|
|
size_t max_block_size;
|
|
|
|
|
|
|
|
bool first;
|
|
|
|
|
|
|
|
/// Текущие сливаемые блоки.
|
|
|
|
size_t num_columns;
|
|
|
|
Blocks source_blocks;
|
|
|
|
|
|
|
|
typedef std::vector<ConstColumnPlainPtrs> ConstColumnPlainPtrsForBlocks;
|
|
|
|
ConstColumnPlainPtrsForBlocks all_columns;
|
|
|
|
ConstColumnPlainPtrsForBlocks sort_columns;
|
|
|
|
|
|
|
|
typedef std::priority_queue<SortCursor> Queue;
|
|
|
|
Queue queue;
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|