uses criteria for session::find methods
This commit is contained in:
@@ -150,6 +150,8 @@ add_library(matador-orm STATIC
|
||||
../../include/matador/query/criteria_evaluator.hpp
|
||||
query/criteria_evaluator.cpp
|
||||
../../include/matador/query/criteria/criteria_utils.hpp
|
||||
../../include/matador/query/criteria/abstract_column_criteria.hpp
|
||||
query/criteria/abstract_column_criteria.cpp
|
||||
)
|
||||
|
||||
target_include_directories(matador-orm
|
||||
|
||||
@@ -14,6 +14,8 @@ std::string orm_category_impl::message(const int ev) const {
|
||||
return "No connection available";
|
||||
case error_code::UnknownType:
|
||||
return "Unknown type";
|
||||
case error_code::NoPrimaryKey:
|
||||
return "No primary key";
|
||||
case error_code::FailedToBuildQuery:
|
||||
return "Failed to build query";
|
||||
case error_code::FailedToFindObject:
|
||||
|
||||
@@ -3,6 +3,50 @@
|
||||
#include <iostream>
|
||||
|
||||
namespace matador::orm {
|
||||
criteria_transformer::criteria_transformer(const object::repository& repo, const std::unordered_map<std::string, std::shared_ptr<sql::table>>& tables_by_name)
|
||||
: repo_(repo)
|
||||
, tables_by_name_(tables_by_name) {}
|
||||
|
||||
void criteria_transformer::visit( const query::between_criteria& node ) {
|
||||
update_criteria_column(node);
|
||||
}
|
||||
|
||||
void criteria_transformer::visit( const query::binary_criteria& node ) {
|
||||
update_criteria_column(node);
|
||||
}
|
||||
|
||||
void criteria_transformer::visit( const query::binary_column_criteria& node ) {}
|
||||
|
||||
void criteria_transformer::visit( const query::collection_criteria& node ) {
|
||||
update_criteria_column(node);
|
||||
}
|
||||
|
||||
void criteria_transformer::visit( const query::collection_query_criteria& node ) {
|
||||
update_criteria_column(node);
|
||||
}
|
||||
|
||||
void criteria_transformer::visit( const query::like_criteria& node ) {
|
||||
update_criteria_column(node);
|
||||
}
|
||||
|
||||
void criteria_transformer::visit( const query::logical_criteria& node ) {
|
||||
node.left_clause()->accept(*this);
|
||||
node.right_clause()->accept(*this);
|
||||
}
|
||||
|
||||
void criteria_transformer::visit( const query::not_criteria& node ) {
|
||||
node.clause()->accept(*this);
|
||||
}
|
||||
|
||||
void criteria_transformer::update_criteria_column(const query::abstract_column_criteria& node) const {
|
||||
const auto it = tables_by_name_.find(node.column().table()->name);
|
||||
if (it == tables_by_name_.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const_cast<sql::column&>(node.column()).table_ = it->second;
|
||||
}
|
||||
|
||||
void session_query_builder::on_revision(const char *id, uint64_t &/*rev*/) {
|
||||
push(id);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
#include "matador/query/criteria/abstract_column_criteria.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
abstract_column_criteria::abstract_column_criteria(sql::column column)
|
||||
: column_(std::move(column)) {}
|
||||
|
||||
const sql::column& abstract_column_criteria::column() const {
|
||||
return column_;
|
||||
}
|
||||
}
|
||||
@@ -4,13 +4,13 @@
|
||||
|
||||
namespace matador::query{
|
||||
between_criteria::between_criteria(sql::column column, const int64_t min, const int64_t max)
|
||||
: column_(std::move(column))
|
||||
: abstract_column_criteria(std::move(column))
|
||||
, min_(utils::value{min})
|
||||
, max_(utils::value{max})
|
||||
{}
|
||||
|
||||
between_criteria::between_criteria(sql::column column, utils::placeholder min, utils::placeholder max)
|
||||
: column_(std::move(column))
|
||||
: abstract_column_criteria(std::move(column))
|
||||
, min_(min)
|
||||
, max_(max)
|
||||
{}
|
||||
@@ -19,10 +19,6 @@ void between_criteria::accept( criteria_visitor& visitor ) const {
|
||||
visitor.visit(*this);
|
||||
}
|
||||
|
||||
const sql::column & between_criteria::column() const {
|
||||
return column_;
|
||||
}
|
||||
|
||||
const criteria_value &between_criteria::minimum() const {
|
||||
return min_;
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
namespace matador::query {
|
||||
binary_criteria::binary_criteria(sql::column column, const binary_operator operand, criteria_value value)
|
||||
: column_(std::move(column))
|
||||
: abstract_column_criteria(std::move(column))
|
||||
, operator_(operand)
|
||||
, value_(std::move(value))
|
||||
{}
|
||||
@@ -13,10 +13,6 @@ void binary_criteria::accept( criteria_visitor& visitor ) const {
|
||||
visitor.visit(*this);
|
||||
}
|
||||
|
||||
const sql::column & binary_criteria::column() const {
|
||||
return column_;
|
||||
}
|
||||
|
||||
binary_operator binary_criteria::operand() const {
|
||||
return operator_;
|
||||
}
|
||||
|
||||
@@ -4,13 +4,13 @@
|
||||
|
||||
namespace matador::query {
|
||||
collection_criteria::collection_criteria(sql::column col, const collection_operator operand_, std::vector<criteria_value> values )
|
||||
: column_(std::move(col))
|
||||
: abstract_column_criteria(std::move(col))
|
||||
, operand_(operand_)
|
||||
, values_(std::move(values))
|
||||
{}
|
||||
|
||||
collection_criteria::collection_criteria(sql::column col, const collection_operator operand_, const std::initializer_list<criteria_value> values )
|
||||
: column_(std::move(col))
|
||||
: abstract_column_criteria(std::move(col))
|
||||
, operand_(operand_)
|
||||
, values_(values)
|
||||
{}
|
||||
@@ -19,10 +19,6 @@ void collection_criteria::accept(criteria_visitor& visitor) const {
|
||||
visitor.visit(*this);
|
||||
}
|
||||
|
||||
const sql::column & collection_criteria::column() const {
|
||||
return column_;
|
||||
}
|
||||
|
||||
collection_operator collection_criteria::operand() const {
|
||||
return operand_;
|
||||
}
|
||||
@@ -32,7 +28,7 @@ const std::vector<criteria_value>& collection_criteria::values() const {
|
||||
}
|
||||
|
||||
collection_query_criteria::collection_query_criteria(sql::column col, collection_operator operand_, sql::query_context ctx)
|
||||
: column_(std::move(col))
|
||||
: abstract_column_criteria(std::move(col))
|
||||
, operand_(operand_)
|
||||
, query_context_(std::move(ctx)){
|
||||
}
|
||||
@@ -41,10 +37,6 @@ void collection_query_criteria::accept(criteria_visitor &visitor) const {
|
||||
visitor.visit(*this);
|
||||
}
|
||||
|
||||
const sql::column & collection_query_criteria::column() const {
|
||||
return column_;
|
||||
}
|
||||
|
||||
collection_operator collection_query_criteria::operand() const {
|
||||
return operand_;
|
||||
}
|
||||
|
||||
@@ -6,10 +6,6 @@
|
||||
#include "matador/query/criteria/not_criteria.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
criteria_ptr operator==( const sql::column& col_left, const sql::column& col_right ) {
|
||||
return std::make_unique<binary_column_criteria>(col_left, binary_operator::EQUALS, col_right);
|
||||
}
|
||||
|
||||
criteria_ptr operator==(const sql::column &col, utils::placeholder p) {
|
||||
return std::make_unique<binary_criteria>(col, binary_operator::EQUALS, p);
|
||||
}
|
||||
@@ -24,7 +20,6 @@ criteria_ptr operator>(const sql::column &col, utils::placeholder p) {
|
||||
|
||||
criteria_ptr operator>=(const sql::column &col, utils::placeholder p) {
|
||||
return std::make_unique<binary_criteria>(col, binary_operator::GREATER_THAN_OR_EQUAL, p);
|
||||
|
||||
}
|
||||
|
||||
criteria_ptr operator<(const sql::column &col, utils::placeholder p) {
|
||||
@@ -35,6 +30,30 @@ criteria_ptr operator<=(const sql::column &col, utils::placeholder p) {
|
||||
return std::make_unique<binary_criteria>(col, binary_operator::LESS_THAN_OR_EQUAL, p);
|
||||
}
|
||||
|
||||
criteria_ptr operator==( const sql::column& col_left, const sql::column& col_right ) {
|
||||
return std::make_unique<binary_column_criteria>(col_left, binary_operator::EQUALS, col_right);
|
||||
}
|
||||
|
||||
criteria_ptr operator!=( const sql::column& col_left, const sql::column& col_right ) {
|
||||
return std::make_unique<binary_column_criteria>(col_left, binary_operator::NOT_EQUALS, col_right);
|
||||
}
|
||||
|
||||
criteria_ptr operator>( const sql::column& col_left, const sql::column& col_right ) {
|
||||
return std::make_unique<binary_column_criteria>(col_left, binary_operator::GREATER_THAN, col_right);
|
||||
}
|
||||
|
||||
criteria_ptr operator>=( const sql::column& col_left, const sql::column& col_right ) {
|
||||
return std::make_unique<binary_column_criteria>(col_left, binary_operator::GREATER_THAN_OR_EQUAL, col_right);
|
||||
}
|
||||
|
||||
criteria_ptr operator<( const sql::column& col_left, const sql::column& col_right ) {
|
||||
return std::make_unique<binary_column_criteria>(col_left, binary_operator::LESS_THAN, col_right);
|
||||
}
|
||||
|
||||
criteria_ptr operator<=( const sql::column& col_left, const sql::column& col_right ) {
|
||||
return std::make_unique<binary_column_criteria>(col_left, binary_operator::LESS_THAN_OR_EQUAL, col_right);
|
||||
}
|
||||
|
||||
criteria_ptr operator&&(criteria_ptr left, criteria_ptr right) {
|
||||
return std::make_unique<logical_criteria>(std::move(left), logical_operator::AND, std::move(right));
|
||||
}
|
||||
|
||||
@@ -4,17 +4,13 @@
|
||||
|
||||
namespace matador::query {
|
||||
like_criteria::like_criteria(sql::column column, std::string pattern)
|
||||
: column_(std::move(column))
|
||||
: abstract_column_criteria(std::move(column))
|
||||
, pattern_(std::move(pattern)){}
|
||||
|
||||
void like_criteria::accept(criteria_visitor &visitor) const {
|
||||
visitor.visit(*this);
|
||||
}
|
||||
|
||||
const sql::column & like_criteria::column() const {
|
||||
return column_;
|
||||
}
|
||||
|
||||
const std::string & like_criteria::pattern() const {
|
||||
return pattern_;
|
||||
}
|
||||
|
||||
@@ -36,29 +36,27 @@ column::column(const sql_function_t func, std::string name)
|
||||
, name(std::move(name))
|
||||
, function_(func) {}
|
||||
|
||||
column::column(const table& tab, std::string name, std::string as)
|
||||
: table_(std::make_shared<table>(tab))
|
||||
column::column(const sql::table& tab, std::string name, std::string as)
|
||||
: table_(std::make_shared<sql::table>(tab))
|
||||
, name(std::move(name))
|
||||
, alias(std::move(as)) {
|
||||
table_->columns.push_back(*this);
|
||||
}
|
||||
|
||||
column::column(const std::shared_ptr<table>& t, std::string name, std::string as)
|
||||
column::column(const std::shared_ptr<sql::table>& t, std::string name, std::string as)
|
||||
: table_(t)
|
||||
, name(std::move(name))
|
||||
, alias(std::move(as)) {
|
||||
}
|
||||
|
||||
bool column::equals(const column &x) const
|
||||
{
|
||||
bool column::equals(const column &x) const {
|
||||
return *table_ == *x.table_ &&
|
||||
name == x.name &&
|
||||
alias == x.alias &&
|
||||
function_ == x.function_;
|
||||
}
|
||||
|
||||
column &column::as(std::string a)
|
||||
{
|
||||
column &column::as(std::string a) {
|
||||
alias = std::move(a);
|
||||
return *this;
|
||||
}
|
||||
@@ -74,8 +72,11 @@ std::string column::full_name() const {
|
||||
return name;
|
||||
}
|
||||
|
||||
bool column::is_function() const
|
||||
{
|
||||
const std::string& column::alias_name() const {
|
||||
return alias;
|
||||
}
|
||||
|
||||
bool column::is_function() const {
|
||||
return function_ != sql_function_t::NONE;
|
||||
}
|
||||
|
||||
@@ -83,4 +84,7 @@ bool column::has_alias() const {
|
||||
return !alias.empty();
|
||||
}
|
||||
|
||||
std::shared_ptr<table> column::table() const {
|
||||
return table_;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user