#pragma once #include #include #include #include namespace DB { /// Merges several sorted inputs into one sorted output. class MergingSortedAlgorithm final : public IMergingAlgorithm { public: MergingSortedAlgorithm( const Block & header, size_t num_inputs, SortDescription description_, size_t max_block_size, UInt64 limit_, WriteBuffer * out_row_sources_buf_, bool use_average_block_sizes); void addInput(); void initialize(Chunks chunks) override; void consume(Chunk & chunk, size_t source_num) override; Status merge() override; const MergedData & getMergedData() const { return merged_data; } private: MergedData merged_data; /// Settings SortDescription description; UInt64 limit; bool has_collation = false; /// Used in Vertical merge algorithm to gather non-PK/non-index columns (on next step) /// If it is not nullptr then it should be populated during execution WriteBuffer * out_row_sources_buf = nullptr; /// Chunks currently being merged. std::vector source_chunks; SortCursorImpls cursors; SortingHeap queue_without_collation; SortingHeap queue_with_collation; Status insertFromChunk(size_t source_num); template Status mergeImpl(TSortingHeap & queue); }; }