ClickHouse/dbms/src/Storages/MergeTree/MergedBlockOutputStream.h

65 lines
2.0 KiB
C++
Raw Normal View History

2013-04-24 10:31:32 +00:00
#pragma once
#include <Storages/MergeTree/IMergedBlockOutputStream.h>
#include <Columns/ColumnArray.h>
2013-09-15 01:10:16 +00:00
2013-04-24 10:31:32 +00:00
namespace DB
{
2017-04-16 15:00:33 +00:00
/** To write one part.
* The data refers to one partition, and is written in one part.
*/
class MergedBlockOutputStream final : public IMergedBlockOutputStream
{
public:
MergedBlockOutputStream(
2019-10-21 15:33:59 +00:00
const MergeTreeDataPartPtr & data_part_,
const NamesAndTypesList & columns_list_,
2019-03-18 12:02:33 +00:00
CompressionCodecPtr default_codec_,
2019-03-25 13:55:24 +00:00
bool blocks_are_granules_size_ = false);
MergedBlockOutputStream(
2019-10-21 15:33:59 +00:00
const MergeTreeDataPartPtr & data_part_,
const NamesAndTypesList & columns_list_,
2018-12-21 12:17:30 +00:00
CompressionCodecPtr default_codec_,
const MergeTreeData::DataPart::ColumnToSize & merged_column_to_size_,
2018-11-30 15:36:10 +00:00
size_t aio_threshold_,
2019-03-25 13:55:24 +00:00
bool blocks_are_granules_size_ = false);
std::string getPartPath() const;
2016-01-28 16:06:57 +00:00
Block getHeader() const override { return storage.getSampleBlock(); }
2017-04-16 15:00:33 +00:00
/// If the data is pre-sorted.
void write(const Block & block) override;
/** If the data is not sorted, but we have previously calculated the permutation, that will sort it.
2017-04-16 15:00:33 +00:00
* This method is used to save RAM, since you do not need to keep two blocks at once - the original one and the sorted one.
*/
void writeWithPermutation(const Block & block, const IColumn::Permutation * permutation);
2014-03-27 17:30:04 +00:00
void writeSuffix() override;
2018-11-15 14:06:54 +00:00
/// Finilize writing part and fill inner structures
void writeSuffixAndFinalizePart(
MergeTreeData::MutableDataPartPtr & new_part,
const NamesAndTypesList * total_columns_list = nullptr,
MergeTreeData::DataPart::Checksums * additional_column_checksums = nullptr);
private:
void init();
/** If `permutation` is given, it rearranges the values in the columns when writing.
2017-04-16 15:00:33 +00:00
* This is necessary to not keep the whole block in the RAM to sort it.
*/
void writeImpl(const Block & block, const IColumn::Permutation * permutation);
private:
NamesAndTypesList columns_list;
2014-03-13 12:48:07 +00:00
size_t rows_count = 0;
2013-04-24 10:31:32 +00:00
};
2013-09-26 19:16:43 +00:00
}