added column_expression and table_column_expression
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
#ifndef MATADOR_ABSTRACT_COLUMN_EXPRESSION_HPP
|
||||
#define MATADOR_ABSTRACT_COLUMN_EXPRESSION_HPP
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace matador::query {
|
||||
class expression_visitor;
|
||||
class table_column;
|
||||
class abstract_column_expression {
|
||||
public:
|
||||
virtual ~abstract_column_expression() = default;
|
||||
|
||||
virtual void accept(expression_visitor& visitor) const = 0;
|
||||
};
|
||||
|
||||
using column_expression_ptr = std::unique_ptr<abstract_column_expression>;
|
||||
}
|
||||
#endif //MATADOR_ABSTRACT_COLUMN_EXPRESSION_HPP
|
||||
@@ -0,0 +1,102 @@
|
||||
#ifndef MATADOR_COLUMN_EXPRESSION_HPP
|
||||
#define MATADOR_COLUMN_EXPRESSION_HPP
|
||||
|
||||
#include "matador/query/table_column.hpp"
|
||||
#include "matador/query/abstract_column_expression.hpp"
|
||||
|
||||
#include "matador/utils/placeholder.hpp"
|
||||
#include "matador/utils/types.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
class binary_column_expression;
|
||||
class table_column_expression;
|
||||
class value_expression;
|
||||
class placeholder_expression;
|
||||
|
||||
class expression_visitor {
|
||||
public:
|
||||
virtual ~expression_visitor() = default;
|
||||
|
||||
virtual void visit(const binary_column_expression& node) = 0;
|
||||
virtual void visit(const table_column_expression& node) = 0;
|
||||
virtual void visit(const value_expression& node) = 0;
|
||||
virtual void visit(const placeholder_expression& node) = 0;
|
||||
};
|
||||
|
||||
enum class binary_expression_operator {
|
||||
Plus,
|
||||
Minus,
|
||||
Multiply,
|
||||
Divide,
|
||||
Modulo
|
||||
};
|
||||
|
||||
class binary_column_expression : public abstract_column_expression {
|
||||
public:
|
||||
binary_column_expression() = delete;
|
||||
binary_column_expression(column_expression_ptr left_column, binary_expression_operator operand, column_expression_ptr right_column);
|
||||
|
||||
void accept(expression_visitor& visitor) const override;
|
||||
|
||||
private:
|
||||
column_expression_ptr left_column_;
|
||||
binary_expression_operator operand_;
|
||||
column_expression_ptr right_column_;
|
||||
};
|
||||
|
||||
class table_column_expression : public abstract_column_expression {
|
||||
public:
|
||||
table_column_expression() = delete;
|
||||
table_column_expression(table_column col);
|
||||
|
||||
void accept(expression_visitor& visitor) const override;
|
||||
|
||||
private:
|
||||
table_column column_;
|
||||
};
|
||||
|
||||
class value_expression : public abstract_column_expression {
|
||||
public:
|
||||
value_expression() = delete;
|
||||
value_expression(utils::database_type value);
|
||||
|
||||
void accept(expression_visitor& visitor) const override;
|
||||
|
||||
private:
|
||||
utils::database_type value_;
|
||||
};
|
||||
|
||||
class placeholder_expression : public abstract_column_expression {
|
||||
public:
|
||||
placeholder_expression() = default;
|
||||
|
||||
void accept(expression_visitor& visitor) const override;
|
||||
};
|
||||
|
||||
template<typename Type>
|
||||
column_expression_ptr operator+(const table_column& col, Type val) {
|
||||
return std::make_unique<binary_column_expression>(std::make_unique<table_column_expression>(col), binary_expression_operator::Plus, std::make_unique<value_expression>(val));
|
||||
}
|
||||
|
||||
template<typename Type>
|
||||
column_expression_ptr operator+(Type val, const table_column& col) {
|
||||
return std::make_unique<binary_column_expression>(std::make_unique<value_expression>(val), binary_expression_operator::Plus, std::make_unique<table_column_expression>(col));
|
||||
}
|
||||
|
||||
column_expression_ptr operator+(const table_column& col, utils::placeholder /*val*/);
|
||||
column_expression_ptr operator+(utils::placeholder /*val*/, const table_column& col);
|
||||
|
||||
template<typename Type>
|
||||
column_expression_ptr operator-(const table_column& col, Type val) {
|
||||
return std::make_unique<binary_column_expression>(std::make_unique<table_column_expression>(col), binary_expression_operator::Minus, std::make_unique<value_expression>(val));
|
||||
}
|
||||
|
||||
template<typename Type>
|
||||
column_expression_ptr operator-(Type val, const table_column& col) {
|
||||
return std::make_unique<binary_column_expression>(std::make_unique<value_expression>(val), binary_expression_operator::Minus, std::make_unique<table_column_expression>(col));
|
||||
}
|
||||
|
||||
column_expression_ptr operator-(const table_column& col, utils::placeholder /*val*/);
|
||||
column_expression_ptr operator-(utils::placeholder /*val*/, const table_column& col);
|
||||
}
|
||||
#endif //MATADOR_COLUMN_EXPRESSION_HPP
|
||||
@@ -16,8 +16,8 @@ public:
|
||||
using executable_query::executable_query;
|
||||
|
||||
template<typename... TableColumns>
|
||||
fetchable_query returning(const TableColumns&... table_columns) {
|
||||
const std::vector<table_column> tcv { table_columns... };
|
||||
fetchable_query returning(TableColumns... table_columns) {
|
||||
const std::vector<table_column> tcv { std::forward<TableColumns>(table_columns)... };
|
||||
return returning(tcv);
|
||||
}
|
||||
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
#define QUERY_UPDATE_INTERMEDIATE_HPP
|
||||
|
||||
#include "matador/query/intermediates/query_intermediate.hpp"
|
||||
|
||||
#include "matador/query/intermediates/query_set_intermediate.hpp"
|
||||
|
||||
#include "matador/query/column_expression.hpp"
|
||||
#include "matador/query/key_value_generator.hpp"
|
||||
|
||||
#include "matador/query/internal/column_value_pair.hpp"
|
||||
@@ -15,12 +15,20 @@ class query_update_intermediate : public query_intermediate {
|
||||
public:
|
||||
explicit query_update_intermediate(const table& tab);
|
||||
|
||||
query_set_intermediate set(std::initializer_list<internal::column_value_pair> columns);
|
||||
query_set_intermediate set(std::vector<internal::column_value_pair> &&columns);
|
||||
// query_set_intermediate set(std::initializer_list<internal::column_value_pair> columns);
|
||||
// query_set_intermediate set(std::vector<internal::column_value_pair> &&columns);
|
||||
query_update_intermediate& set(const table_column& col, column_expression_ptr expression);
|
||||
template<class Type>
|
||||
query_set_intermediate set(const Type &obj) {
|
||||
return set(key_value_generator::generate(obj));
|
||||
}
|
||||
query_execute_where_intermediate where(std::unique_ptr<abstract_criteria> cond);
|
||||
|
||||
private:
|
||||
query_execute_where_intermediate where_clause(std::unique_ptr<abstract_criteria> &&cond);
|
||||
|
||||
private:
|
||||
std::vector<internal::column_value_pair> key_value_pairs_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define QUERY_KEY_VALUE_PAIR_HPP
|
||||
|
||||
#include "matador/query/table_column.hpp"
|
||||
#include "matador/query/column_expression.hpp"
|
||||
|
||||
#include "matador/utils/placeholder.hpp"
|
||||
#include "matador/utils/types.hpp"
|
||||
@@ -11,9 +12,10 @@ namespace matador::query::internal {
|
||||
class column_value_pair {
|
||||
public:
|
||||
column_value_pair(table_column col, utils::database_type value);
|
||||
column_value_pair(std::string name, utils::database_type value);
|
||||
column_value_pair(const std::string& name, utils::database_type value);
|
||||
column_value_pair(const char *name, utils::database_type value);
|
||||
column_value_pair(const char *name, utils::placeholder p);
|
||||
column_value_pair(table_column col, column_expression_ptr expression);
|
||||
|
||||
friend bool operator==(const column_value_pair &lhs, const column_value_pair &rhs);
|
||||
friend bool operator!=(const column_value_pair &lhs, const column_value_pair &rhs);
|
||||
@@ -24,6 +26,8 @@ public:
|
||||
private:
|
||||
table_column column_;
|
||||
std::variant<utils::placeholder, utils::database_type> value_;
|
||||
column_expression_ptr expression_;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -374,15 +374,15 @@ private:
|
||||
class query_set_part final : public query_part
|
||||
{
|
||||
public:
|
||||
explicit query_set_part(const std::vector<internal::column_value_pair>& key_value_pairs);
|
||||
explicit query_set_part(std::vector<column_value_pair>&& key_value_pairs);
|
||||
|
||||
[[nodiscard]] const std::vector<internal::column_value_pair>& column_values() const;
|
||||
[[nodiscard]] const std::vector<column_value_pair>& column_values() const;
|
||||
|
||||
private:
|
||||
void accept(query_part_visitor &visitor) override;
|
||||
|
||||
private:
|
||||
std::vector<internal::column_value_pair> key_value_pairs_;
|
||||
std::vector<column_value_pair> key_value_pairs_;
|
||||
};
|
||||
|
||||
class query_delete_part final : public query_part
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
#ifndef MATADOR_QUERY_COLUMN_HPP
|
||||
#define MATADOR_QUERY_COLUMN_HPP
|
||||
#include <string>
|
||||
|
||||
namespace matador::query {
|
||||
class query_column {
|
||||
public:
|
||||
query_column() = default;
|
||||
|
||||
private:
|
||||
std::string name_;
|
||||
}
|
||||
}
|
||||
#endif //MATADOR_QUERY_COLUMN_HPP
|
||||
@@ -1,6 +1,8 @@
|
||||
#ifndef QUERY_COLUMN_HPP
|
||||
#define QUERY_COLUMN_HPP
|
||||
|
||||
#include "matador/query/abstract_column_expression.hpp"
|
||||
|
||||
#include "matador/sql/sql_functions.hpp"
|
||||
|
||||
#include "matador/utils/basic_types.hpp"
|
||||
@@ -29,6 +31,9 @@ public:
|
||||
utils::basic_type type,
|
||||
const utils::field_attributes& attributes,
|
||||
sql::sql_function_t func = sql::sql_function_t::None);
|
||||
|
||||
|
||||
table_column(column_expression_ptr expression) noexcept;
|
||||
table_column& operator=(const table_column& other);
|
||||
table_column(const table_column& other) = default;
|
||||
table_column(table_column&& other) noexcept = default;
|
||||
|
||||
Reference in New Issue
Block a user