uses criteria for session::find methods

This commit is contained in:
Sascha Kühl
2025-10-30 14:54:39 +01:00
parent 44c50cf2af
commit 270c2922ff
23 changed files with 267 additions and 208 deletions
+2
View File
@@ -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
+2
View File
@@ -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:
+44
View File
@@ -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));
}
+1 -5
View File
@@ -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_;
}
+13 -9
View File
@@ -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_;
}
}