#ifndef QUERY_QUERY_BUILDER_HPP #define QUERY_QUERY_BUILDER_HPP #include "matador/sql/column.hpp" #include #include #include #include namespace matador::sql { class dialect; class query_builder { private: enum class state_t { QUERY_INIT, QUERY_CREATE, QUERY_TABLE, QUERY_DROP, QUERY_SELECT, QUERY_INSERT, QUERY_UPDATE, QUERY_DELETE, QUERY_SET, QUERY_FROM, QUERY_INTO, QUERY_WHERE, QUERY_VALUES, QUERY_ORDER_BY, QUERY_ORDER_DIRECTION, QUERY_GROUP_BY, QUERY_LIMIT, QUERY_FINISH }; enum class command_t { UNKNOWN, /**< Unknown query command */ CREATE, /**< Create query command */ DROP, /**< Drop query command */ SELECT, /**< Select query command */ INSERT, /**< Insert query command */ UPDATE, /**< Update query command */ REMOVE /**< Remove query command */ }; public: explicit query_builder(const dialect &d); query_builder& create(); query_builder& table(const std::string &table, std::initializer_list columns); query_builder& select(std::initializer_list column_names); query_builder& from(const std::string &table, const std::string &as = ""); std::string compile(); private: void transition_to(state_t next); void initialize(command_t cmd, state_t state); private: const dialect &dialect_; command_t command_{command_t::UNKNOWN}; state_t state_{state_t::QUERY_INIT}; std::vector query_parts_; using query_state_set = std::unordered_set; using query_state_transition_map = std::unordered_map; using query_state_to_string_map = std::unordered_map; using query_command_to_string_map = std::unordered_map; static query_state_transition_map transitions_; static query_state_to_string_map state_strings_; static query_command_to_string_map command_strings_; }; } #endif //QUERY_QUERY_BUILDER_HPP