#pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace Poco { class Logger; // NOLINT(cppcoreguidelines-virtual-class-destructor) } class AtomicStopwatch; namespace DB { void logAboutProgress(Poco::Logger * log, size_t processed, size_t total, AtomicStopwatch & watch); class IDatabase; using DatabasePtr = std::shared_ptr; struct ParsedTableMetadata { String path; ASTPtr ast; }; using ParsedMetadata = std::map; struct ParsedTablesMetadata { String default_database; std::mutex mutex; ParsedMetadata parsed_tables; /// For logging size_t total_dictionaries = 0; }; /// Loads tables (and dictionaries) from specified databases /// taking into account dependencies between them. class TablesLoader { public: using Databases = std::map; TablesLoader(ContextMutablePtr global_context_, Databases databases_, LoadingStrictnessLevel strictness_mode_); TablesLoader() = delete; void loadTables(); void startupTables(); private: ContextMutablePtr global_context; Databases databases; LoadingStrictnessLevel strictness_mode; Strings databases_to_load; ParsedTablesMetadata metadata; TablesDependencyGraph referential_dependencies; TablesDependencyGraph loading_dependencies; Poco::Logger * log; std::atomic tables_processed{0}; AtomicStopwatch stopwatch; ThreadPool pool; void buildDependencyGraph(); void removeUnresolvableDependencies(); void loadTablesInTopologicalOrder(ThreadPool & pool); void startLoadingTables(ThreadPool & pool, ContextMutablePtr load_context, const std::vector & tables_to_load, size_t level); }; }