added new query criteria class set

This commit is contained in:
2025-10-20 13:20:56 +02:00
parent 009498fae1
commit 5d53addc60
22 changed files with 488 additions and 6 deletions
+17
View File
@@ -6,6 +6,14 @@ add_library(matador-orm STATIC
../../include/matador/orm/session_query_builder.hpp
../../include/matador/query/attribute_string_writer.hpp
../../include/matador/query/basic_condition.hpp
../../include/matador/query/criteria/abstract_criteria.hpp
../../include/matador/query/criteria/between_criteria.hpp
../../include/matador/query/criteria/collection_criteria.hpp
../../include/matador/query/criteria.hpp
../../include/matador/query/criteria/criteria_operators.hpp
../../include/matador/query/criteria/criteria_visitor.hpp
../../include/matador/query/criteria/like_criteria.hpp
../../include/matador/query/criteria/logical_criteria.hpp
../../include/matador/query/condition.hpp
../../include/matador/query/fk_value_extractor.hpp
../../include/matador/query/intermediates/executable_query.hpp
@@ -78,6 +86,13 @@ add_library(matador-orm STATIC
orm/session_query_builder.cpp
query/attribute_string_writer.cpp
query/basic_condition.cpp
query/criteria/between_criteria.cpp
query/criteria/binary_criteria.cpp
query/criteria/collection_criteria.cpp
query/criteria/criteria_operators.cpp
query/criteria/like_criteria.cpp
query/criteria/logical_criteria.cpp
query/criteria/not_criteria.cpp
query/condition.cpp
query/intermediates/executable_query.cpp
query/intermediates/fetchable_query.cpp
@@ -136,6 +151,8 @@ add_library(matador-orm STATIC
sql/statement.cpp
sql/statement_cache.cpp
sql/table.cpp
../../include/matador/query/criteria_evaluator.hpp
query/criteria_evaluator.cpp
)
target_include_directories(matador-orm
@@ -0,0 +1,15 @@
#include "matador/query/criteria/between_criteria.hpp"
#include "matador/query/criteria/criteria_visitor.hpp"
namespace matador::query{
between_criteria::between_criteria(sql::column column, utils::value min, utils::value max )
: column_(std::move(column))
, min_(std::move(min))
, max_(std::move(max))
{}
void between_criteria::accept( criteria_visitor& visitor ) const {
visitor.visit(*this);
}
}
@@ -0,0 +1,15 @@
#include "matador/query/criteria/binary_criteria.hpp"
#include "matador/query/criteria/criteria_visitor.hpp"
namespace matador::query {
binary_criteria::binary_criteria(sql::column column, const binary_operator operator_, utils::value value)
: column_(std::move(column))
, operator_(operator_)
, value_(std::move(value))
{}
void binary_criteria::accept( criteria_visitor& visitor ) const {
visitor.visit(*this);
}
}
@@ -0,0 +1,21 @@
#include "matador/query/criteria/collection_criteria.hpp"
#include "matador/query/criteria/criteria_visitor.hpp"
namespace matador::query {
collection_criteria::collection_criteria(sql::column col, collection_operator operator_, std::vector<utils::value> values )
: column_(std::move(col))
, operator_(operator_)
, values_(std::move(values))
{}
collection_criteria::collection_criteria(sql::column col, const collection_operator operator_, const std::initializer_list<utils::value> values )
: column_(std::move(col))
, operator_(operator_)
, values_(values)
{}
void collection_criteria::accept( criteria_visitor& visitor ) const {
visitor.visit(*this);
}
}
@@ -0,0 +1,28 @@
#include "matador/query/criteria/criteria_operators.hpp"
#include "matador/query/criteria/between_criteria.hpp"
#include "matador/query/criteria/like_criteria.hpp"
#include "matador/query/criteria/logical_criteria.hpp"
#include "matador/query/criteria/not_criteria.hpp"
namespace matador::query {
criteria_ptr operator&&(criteria_ptr left, criteria_ptr right) {
return std::make_unique<logical_criteria>(std::move(left), logical_operator::AND, std::move(right));
}
criteria_ptr operator||(criteria_ptr left, criteria_ptr right) {
return std::make_unique<logical_criteria>(std::move(left), logical_operator::OR, std::move(right));
}
criteria_ptr operator!(criteria_ptr clause) {
return std::make_unique<not_criteria>(std::move(clause));
}
criteria_ptr between(const sql::column &col, utils::value min, utils::value max) {
return std::make_unique<between_criteria>(col, std::move(min), std::move(max));
}
criteria_ptr like(const sql::column &col, const std::string &pattern) {
return std::make_unique<like_criteria>(col, pattern);
}
}
@@ -0,0 +1,13 @@
#include "matador/query/criteria/like_criteria.hpp"
#include "matador/query/criteria/criteria_visitor.hpp"
namespace matador::query {
like_criteria::like_criteria(sql::column column, std::string pattern)
: column_(std::move(column))
, pattern_(std::move(pattern)){}
void like_criteria::accept(criteria_visitor &visitor) const {
visitor.visit(*this);
}
}
@@ -0,0 +1,15 @@
#include "matador/query/criteria/logical_criteria.hpp"
#include "matador/query/criteria/criteria_visitor.hpp"
namespace matador::query {
logical_criteria::logical_criteria(criteria_ptr left, const logical_operator op, criteria_ptr right)
: left_criteria_(std::move(left))
, operand_(op)
, right_criteria_(std::move(right))
{}
void logical_criteria::accept(criteria_visitor& visitor) const {
visitor.visit(*this);
}
}
@@ -0,0 +1,13 @@
#include "matador/query/criteria/not_criteria.hpp"
#include "matador/query/criteria/criteria_visitor.hpp"
namespace matador::query {
not_criteria::not_criteria(criteria_ptr clause)
: criteria_(std::move(clause))
{}
void not_criteria::accept(criteria_visitor& visitor) const {
visitor.visit(*this);
}
}
+25
View File
@@ -0,0 +1,25 @@
#include "matador/query/criteria_evaluator.hpp"
namespace matador::query {
criteria_evaluator::criteria_evaluator(const sql::dialect &d, sql::query_context &query)
: dialect_(d)
, query_(query) {}
void criteria_evaluator::visit(const between_criteria &node) {
}
void criteria_evaluator::visit(const binary_criteria &node) {
}
void criteria_evaluator::visit(const collection_criteria &node) {
}
void criteria_evaluator::visit(const like_criteria &node) {
}
void criteria_evaluator::visit(const logical_criteria &node) {
}
void criteria_evaluator::visit(const not_criteria &node) {
}
}
+17 -5
View File
@@ -1,13 +1,25 @@
#include "matador/sql/column.hpp"
#include "matador/sql/table.hpp"
#include <stdexcept>
#include <utility>
#include "matador/sql/column.hpp"
#include "matador/sql/table.hpp"
namespace matador::sql {
column operator ""_col(const char *name, size_t len)
{
return column{{name, len}};
column operator ""_col(const char *name, size_t len) {
const std::string str(name, len);
const auto pos = str.find('.');
if (pos == std::string::npos) {
return column{str};
}
if (str.find('.', pos + 1) != std::string::npos) {
throw std::invalid_argument("Invalid column name: multiple dots found");
}
return column{str.substr(0, pos), str.substr(pos + 1)};
}
column::column(const char *name, const std::string& as)