#pragma once #include #include #include #include #include #include #include #include namespace DB { class Context; using TableFunctionCreator = std::function; /** Lets you get a table function by its name. */ class TableFunctionFactory final: private boost::noncopyable, public IFactoryWithAliases { public: static TableFunctionFactory & instance(); /// Register a function by its name. /// No locking, you must register all functions before usage of get. void registerFunction(const std::string & name, Creator creator, CaseSensitiveness case_sensitiveness = CaseSensitive); template void registerFunction(CaseSensitiveness case_sensitiveness = CaseSensitive) { auto creator = [] () -> TableFunctionPtr { return std::make_shared(); }; registerFunction(Function::name, std::move(creator), case_sensitiveness); } /// Throws an exception if not found. TableFunctionPtr get(const std::string & name, const Context & context) const; /// Returns nullptr if not found. TableFunctionPtr tryGet(const std::string & name, const Context & context) const; bool isTableFunctionName(const std::string & name) const; private: using TableFunctions = std::unordered_map; const TableFunctions & getCreatorMap() const override { return table_functions; } const TableFunctions & getCaseInsensitiveCreatorMap() const override { return case_insensitive_table_functions; } String getFactoryName() const override { return "TableFunctionFactory"; } TableFunctions table_functions; TableFunctions case_insensitive_table_functions; }; }