#pragma once #include #include #include #include namespace Poco { class Logger; } namespace DB { struct DictionaryStructure; struct IDictionaryBase; class ExternalDictionaries; class StorageDictionary : private ext::shared_ptr_helper, public IStorage { public: static StoragePtr create(const String & table_name_, Context & context_, const ASTCreateQuery & query, const NamesAndTypes & columns_, const NamesAndTypes & materialized_columns_, const NamesAndTypes & alias_columns_, const ColumnDefaults & column_defaults_); static StoragePtr create(const String & table_name, const NamesAndTypes & columns, const NamesAndTypes & materialized_columns, const NamesAndTypes & alias_columns, const ColumnDefaults & column_defaults, const DictionaryStructure & dictionary_structure, const String & dictionary_name); std::string getName() const override { return "Dictionary"; } std::string getTableName() const override { return table_name; } const NamesAndTypes & getColumnsListImpl() const override { return columns; } BlockInputStreams read(const Names & column_names, const SelectQueryInfo & query_info, const Context & context, QueryProcessingStage::Enum & processed_stage, size_t max_block_size = DEFAULT_BLOCK_SIZE, unsigned threads = 1) override; void drop() override {} static NamesAndTypes getNamesAndTypes(const DictionaryStructure & dictionary_structure); private: using Ptr = MultiVersion::Version; String table_name; NamesAndTypes columns; String dictionary_name; Poco::Logger * logger; void checkNamesAndTypesCompatibleWithDictionary(const DictionaryStructure & dictionary_structure) const; template std::string generateNamesAndTypesDescription(ForwardIterator begin, ForwardIterator end) const { if (begin == end) { return ""; } std::string description; for (; begin != end; ++begin) { description += ", "; description += begin->name; description += ' '; description += begin->type->getName(); } return description.substr(2, description.size()); } protected: StorageDictionary(const String & table_name_, const NamesAndTypes & columns_, const NamesAndTypes & materialized_columns_, const NamesAndTypes & alias_columns_, const ColumnDefaults & column_defaults_, const DictionaryStructure & dictionary_structure_, const String & dictionary_name_); }; }