85 lines
2.0 KiB
C++
85 lines
2.0 KiB
C++
#ifndef QUERY_QUERY_BUILDER_HPP
|
|
#define QUERY_QUERY_BUILDER_HPP
|
|
|
|
#include "matador/sql/column.hpp"
|
|
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include <unordered_set>
|
|
#include <vector>
|
|
|
|
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<column> columns);
|
|
|
|
query_builder& select(std::initializer_list<std::string> 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<std::string> query_parts_;
|
|
|
|
using query_state_set = std::unordered_set<state_t>;
|
|
using query_state_transition_map = std::unordered_map<state_t, query_state_set>;
|
|
using query_state_to_string_map = std::unordered_map<state_t, std::string>;
|
|
using query_command_to_string_map = std::unordered_map<command_t, std::string>;
|
|
|
|
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
|