#pragma once #include #include #include #include #include #include #include #include #include #include namespace DB { class DictionarySourceCoordinator { public: explicit DictionarySourceCoordinator( std::shared_ptr dictionary_, const Names & column_names, ColumnsWithTypeAndName && key_columns_with_type_, size_t max_block_size_) : dictionary(std::move(dictionary_)) , key_columns_with_type(std::move(key_columns_with_type_)) , max_block_size(max_block_size_) { initialize(column_names); } explicit DictionarySourceCoordinator( std::shared_ptr dictionary_, const Names & column_names, ColumnsWithTypeAndName && key_columns_with_type_, ColumnsWithTypeAndName && data_columns_with_type_, size_t max_block_size_) : dictionary(std::move(dictionary_)) , key_columns_with_type(std::move(key_columns_with_type_)) , data_columns_with_type(std::move(data_columns_with_type_)) , max_block_size(max_block_size_) { initialize(column_names); } bool getKeyColumnsNextRangeToRead(ColumnsWithTypeAndName & key_columns, ColumnsWithTypeAndName & data_columns); const Block & getHeader() const { return header; } const std::vector & getAttributesNamesToRead() const { return attributes_names_to_read; } const std::vector & getAttributesTypesToRead() const { return attributes_types_to_read; } const std::vector & getAttributesDefaultValuesColumns() const { return attributes_default_values_columns; } const std::shared_ptr & getDictionary() const { return dictionary; } private: void initialize(const Names & column_names); static ColumnsWithTypeAndName cutColumns(const ColumnsWithTypeAndName & columns_with_type, size_t start, size_t length); std::shared_ptr dictionary; ColumnsWithTypeAndName key_columns_with_type; ColumnsWithTypeAndName data_columns_with_type; Block header; std::vector attributes_names_to_read; std::vector attributes_types_to_read; std::vector attributes_default_values_columns; const size_t max_block_size; std::atomic parallel_read_block_index = 0; }; class DictionarySource : public SourceWithProgress { public: explicit DictionarySource(std::shared_ptr coordinator_) : SourceWithProgress(coordinator_->getHeader()), coordinator(std::move(coordinator_)) { } private: String getName() const override { return "DictionarySource"; } Chunk generate() override; std::shared_ptr coordinator; }; }