MergeTreeDataSelectExecutor.h 2.2 KB
Newer Older
M
Merge  
Michael Kolupaev 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#pragma once

#include <DB/Storages/MergeTree/MergeTreeData.h>
#include <DB/Storages/MergeTree/MergeTreeBlockInputStream.h>

namespace DB
{


/** Выполняет запросы SELECT на данных из merge-дерева.
  */
class MergeTreeDataSelectExecutor
{
public:
	MergeTreeDataSelectExecutor(MergeTreeData & data_);

	/** При чтении, выбирается набор кусков, покрывающий нужный диапазон индекса.
M
Merge  
Michael Kolupaev 已提交
18
	  * Если inout_part_index != nullptr, из этого счетчика берутся значения для виртуального столбца _part_index.
M
Merge  
Michael Kolupaev 已提交
19 20 21 22 23 24 25
	  */
	BlockInputStreams read(
		const Names & column_names,
		ASTPtr query,
		const Settings & settings,
		QueryProcessingStage::Enum & processed_stage,
		size_t max_block_size = DEFAULT_BLOCK_SIZE,
M
Merge  
Michael Kolupaev 已提交
26 27
		unsigned threads = 1,
		size_t * inout_part_index = nullptr);
M
Merge  
Michael Kolupaev 已提交
28 29 30 31 32 33 34 35 36

private:
	MergeTreeData & data;

	Logger * log;

	struct RangesInDataPart
	{
		MergeTreeData::DataPartPtr data_part;
M
Merge  
Michael Kolupaev 已提交
37
		size_t part_index_in_query;
M
Merge  
Michael Kolupaev 已提交
38 39 40 41
		MarkRanges ranges;

		RangesInDataPart() {}

M
Merge  
Michael Kolupaev 已提交
42 43
		RangesInDataPart(MergeTreeData::DataPartPtr data_part_, size_t part_index_in_query_)
			: data_part(data_part_), part_index_in_query(part_index_in_query_)
M
Merge  
Michael Kolupaev 已提交
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
		{
		}
	};

	typedef std::vector<RangesInDataPart> RangesInDataParts;

	size_t min_marks_for_seek;
	size_t min_marks_for_concurrent_read;
	size_t max_marks_to_use_cache;

	BlockInputStreams spreadMarkRangesAmongThreads(
		RangesInDataParts parts,
		size_t threads,
		const Names & column_names,
		size_t max_block_size,
		bool use_uncompressed_cache,
		ExpressionActionsPtr prewhere_actions,
M
Merge  
Michael Kolupaev 已提交
61
		const String & prewhere_column,
M
Merge  
Michael Kolupaev 已提交
62
		const Names & virt_columns);
M
Merge  
Michael Kolupaev 已提交
63 64 65 66 67 68 69 70

	BlockInputStreams spreadMarkRangesAmongThreadsFinal(
		RangesInDataParts parts,
		size_t threads,
		const Names & column_names,
		size_t max_block_size,
		bool use_uncompressed_cache,
		ExpressionActionsPtr prewhere_actions,
M
Merge  
Michael Kolupaev 已提交
71
		const String & prewhere_column,
M
Merge  
Michael Kolupaev 已提交
72
		const Names & virt_columns);
M
Merge  
Michael Kolupaev 已提交
73 74

	/// Создать выражение "Sign == 1".
75
	void createPositiveSignCondition(ExpressionActionsPtr & out_expression, String & out_column);
M
Merge  
Michael Kolupaev 已提交
76 77 78 79 80

	MarkRanges markRangesFromPkRange(const MergeTreeData::DataPart::Index & index, PKCondition & key_condition);
};

}