#ifndef MATADOR_RESOLVER_PRODUCER_HPP #define MATADOR_RESOLVER_PRODUCER_HPP #include "matador/object/abstract_type_resolver.hpp" #include "matador/sql/query_context.hpp" #include "matador/utils/error.hpp" #include "matador/utils/result.hpp" #include namespace matador::sql { class dialect; class statement; class object_resolver_producer { public: virtual ~object_resolver_producer() = default; virtual utils::result build_query(const dialect& d) = 0; virtual std::shared_ptr produce(statement&& stmt) = 0; [[nodiscard]] const std::type_index& type() const; protected: explicit object_resolver_producer(const std::type_index &type); private: std::type_index type_; }; class joined_object_resolver_producer { public: virtual ~joined_object_resolver_producer() = default; virtual utils::result build_query(const dialect& d) = 0; virtual std::shared_ptr produce(statement&& stmt) = 0; [[nodiscard]] const std::type_index& root_type() const; [[nodiscard]] const std::type_index& type() const; [[nodiscard]] const std::string& collection_name() const; protected: explicit joined_object_resolver_producer(const std::type_index &root_type, const std::type_index &type, std::string collection_name); private: std::type_index root_type_; std::type_index type_; std::string collection_name_; }; } #endif //MATADOR_RESOLVER_PRODUCER_HPP