initial matador ng commit

This commit is contained in:
2025-02-02 20:37:12 +01:00
parent 19de5714f4
commit ded3daceb3
378 changed files with 14913 additions and 13431 deletions
@@ -0,0 +1,49 @@
#ifndef QUERY_ANY_TYPE_TO_STRING_VISITOR_HPP
#define QUERY_ANY_TYPE_TO_STRING_VISITOR_HPP
#include "matador/utils/types.hpp"
#include "matador/query/attribute_string_writer.hpp"
#include <string>
namespace matador {
class date;
class time;
}
namespace matador::sql {
class dialect;
struct query_context;
}
namespace matador::query::internal {
struct basic_type_to_string_visitor
{
explicit basic_type_to_string_visitor(attribute_string_writer &writer, sql::query_context &query);
void operator()(const int8_t &x) { result = writer->to_string(x); }
void operator()(const int16_t &x) { result = writer->to_string(x); }
void operator()(const int32_t &x) { result = writer->to_string(x); }
void operator()(const int64_t &x) { result = writer->to_string(x); }
void operator()(const uint8_t &x) { result = writer->to_string(x); }
void operator()(const uint16_t &x) { result = writer->to_string(x); }
void operator()(const uint32_t &x) { result = writer->to_string(x); }
void operator()(const uint64_t &x) { result = writer->to_string(x); }
void operator()(const bool &x) { result = writer->to_string(x); }
void operator()(const float &x) { result = writer->to_string(x); }
void operator()(const double &x) { result = writer->to_string(x); }
void operator()(const char *x) { result = writer->to_string(x); }
void operator()(const std::string &x) { result = writer->to_string(x); }
void operator()(const matador::date &x) { result = writer->to_string(x); }
void operator()(const matador::time &x) { result = writer->to_string(x); }
void operator()(const utils::blob &x) { result = writer->to_string(x); }
attribute_string_writer *writer{};
sql::query_context &query;
std::string result;
};
}
#endif //QUERY_ANY_TYPE_TO_STRING_VISITOR_HPP
@@ -0,0 +1,25 @@
#ifndef QUERY_KEY_VALUE_PAIR_HPP
#define QUERY_KEY_VALUE_PAIR_HPP
#include "matador/sql/column.hpp"
#include "matador/utils/types.hpp"
namespace matador::query::internal {
class key_value_pair {
public:
key_value_pair(const sql::column &col, utils::database_type value);
key_value_pair(std::string name, utils::database_type value);
key_value_pair(const char *name, utils::database_type value);
[[nodiscard]] const std::string& name() const;
[[nodiscard]] const utils::database_type& value() const;
private:
std::string name_;
utils::database_type value_;
};
}
#endif //QUERY_KEY_VALUE_PAIR_HPP
@@ -0,0 +1,326 @@
#ifndef QUERY_QUERY_PARTS_HPP
#define QUERY_QUERY_PARTS_HPP
#include "matador/query/query_part_visitor.hpp"
#include "matador/query/basic_condition.hpp"
#include "matador/query/internal/key_value_pair.hpp"
#include "matador/query/query_part.hpp"
#include "matador/sql/column.hpp"
#include "matador/sql/column_definition.hpp"
#include "matador/sql/table.hpp"
#include "matador/utils/placeholder.hpp"
#include <memory>
namespace matador::query::internal {
/**
* Represents the SQL SELECT part
*/
class query_select_part final : public query_part
{
public:
explicit query_select_part(std::vector<sql::column> columns);
void accept(query_part_visitor &visitor) override;
[[nodiscard]] const std::vector<sql::column>& columns() const;
private:
std::vector<sql::column> columns_;
};
/**
* Represents the SQL FROM part
*/
class query_from_part final : public query_part
{
public:
explicit query_from_part(sql::table t);
[[nodiscard]] const sql::table& table() const;
private:
void accept(query_part_visitor &visitor) override;
private:
sql::table table_;
};
class query_join_part final : public query_part
{
public:
explicit query_join_part(sql::table t);
[[nodiscard]] const sql::table& table() const;
private:
void accept(query_part_visitor &visitor) override;
private:
sql::table table_;
};
class query_on_part final : public query_part
{
public:
template < class Condition >
explicit query_on_part(const Condition &cond)
: query_part(sql::dialect_token::ON)
, condition_(new Condition(cond)) {}
explicit query_on_part(std::unique_ptr<basic_condition> &&cond);
[[nodiscard]] const basic_condition& condition() const;
private:
void accept(query_part_visitor &visitor) override;
private:
std::unique_ptr<basic_condition> condition_;
};
class query_where_part final : public query_part
{
public:
template < class Condition >
explicit query_where_part(const Condition &cond)
: query_part(sql::dialect_token::WHERE)
, condition_(new Condition(cond)) {}
explicit query_where_part(std::unique_ptr<basic_condition> &&cond);
[[nodiscard]] const basic_condition& condition() const;
private:
void accept(query_part_visitor &visitor) override;
private:
std::unique_ptr<basic_condition> condition_;
};
class query_table_name_part : public query_part
{
protected:
explicit query_table_name_part(sql::dialect_token token, std::string table_name);
protected:
std::string table_name_;
};
class query_group_by_part final : public query_part
{
public:
explicit query_group_by_part(sql::column col);
[[nodiscard]] const sql::column& column() const;
private:
void accept(query_part_visitor &visitor) override;
private:
sql::column column_;
};
class query_order_by_part final : public query_part
{
public:
explicit query_order_by_part(sql::column col);
[[nodiscard]] const sql::column& column() const;
private:
void accept(query_part_visitor &visitor) override;
private:
sql::column column_;
};
class query_order_by_asc_part final : public query_part
{
public:
query_order_by_asc_part();
private:
void accept(query_part_visitor &visitor) override;
};
class query_order_by_desc_part final : public query_part
{
public:
query_order_by_desc_part();
private:
void accept(query_part_visitor &visitor) override;
};
class query_offset_part final : public query_part
{
public:
explicit query_offset_part(size_t offset);
[[nodiscard]] size_t offset() const;
private:
void accept(query_part_visitor &visitor) override;
private:
size_t offset_;
};
class query_limit_part final : public query_part
{
public:
explicit query_limit_part(size_t limit);
[[nodiscard]] size_t limit() const;
private:
void accept(query_part_visitor &visitor) override;
private:
size_t limit_;
};
class query_insert_part final : public query_part
{
public:
query_insert_part();
private:
void accept(query_part_visitor &visitor) override;
};
class query_into_part final : public query_part
{
public:
query_into_part(sql::table t, std::vector<sql::column> columns);
[[nodiscard]] const sql::table& table() const;
[[nodiscard]] const std::vector<sql::column>& columns() const;
private:
void accept(query_part_visitor &visitor) override;
private:
sql::table table_;
std::vector<sql::column> columns_;
};
/**
* Represents the SQL VALUES part
*/
class query_values_part final : public query_part
{
public:
explicit query_values_part(std::vector<std::variant<utils::placeholder, utils::database_type>> &&values);
[[nodiscard]] const std::vector<std::variant<utils::placeholder, utils::database_type>>& values() const;
private:
void accept(query_part_visitor &visitor) override;
private:
std::vector<std::variant<utils::placeholder, utils::database_type>> values_;
};
class query_update_part final : public query_part
{
public:
explicit query_update_part(sql::table table);
[[nodiscard]] const sql::table& table() const;
private:
void accept(query_part_visitor &visitor) override;
private:
sql::table table_;
};
class query_set_part final : public query_part
{
public:
explicit query_set_part(const std::vector<internal::key_value_pair>& key_value_pairs);
[[nodiscard]] const std::vector<internal::key_value_pair>& key_values() const;
private:
void accept(query_part_visitor &visitor) override;
private:
std::vector<internal::key_value_pair> key_value_pairs_;
};
class query_delete_part final : public query_part
{
public:
query_delete_part();
private:
void accept(query_part_visitor &visitor) override;
};
class query_delete_from_part final : public query_part
{
public:
explicit query_delete_from_part(sql::table table);
[[nodiscard]] const sql::table& table() const;
private:
void accept(query_part_visitor &visitor) override;
private:
sql::table table_;
};
class query_create_part final : public query_part
{
public:
query_create_part();
private:
void accept(query_part_visitor &visitor) override;
};
class query_create_table_part final : public query_part
{
public:
query_create_table_part(sql::table table, std::vector<sql::column_definition> columns);
[[nodiscard]] const sql::table& table() const;
[[nodiscard]] const std::vector<sql::column_definition>& columns() const;
private:
void accept(query_part_visitor &visitor) override;
private:
sql::table table_;
std::vector<sql::column_definition> columns_;
};
class query_drop_part final : public query_part
{
public:
query_drop_part();
private:
void accept(query_part_visitor &visitor) override;
};
class query_drop_table_part final : public query_part
{
public:
explicit query_drop_table_part(sql::table table);
[[nodiscard]] const sql::table& table() const;
private:
void accept(query_part_visitor &visitor) override;
private:
sql::table table_;
};
}
#endif //QUERY_QUERY_PARTS_HPP