added criteria_evaluator and extended all criteria classes with missing methods

This commit is contained in:
2025-10-26 19:57:22 +01:00
parent 5d53addc60
commit 69ce2c34cf
29 changed files with 541 additions and 69 deletions
+1
View File
@@ -28,6 +28,7 @@ add_executable(OrmTests
utils/auto_reset_event.hpp
sql/StatementCacheTest.cpp
sql/ConnectionPoolFixture.hpp
query/CriteriaTests.cpp
)
target_link_libraries(OrmTests matador-orm matador-core Catch2::Catch2WithMain)
+1 -1
View File
@@ -8,7 +8,7 @@
namespace matador::test::orm {
test_statement::test_statement(const sql::query_context &query)
: statement_impl(query) {}
: statement_impl(query, 0) {}
utils::result<size_t, utils::error> test_statement::execute(const sql::parameter_binder &/*bindings*/) {
using namespace std::chrono_literals;
+2 -2
View File
@@ -90,7 +90,7 @@ TEST_CASE_METHOD(ConditionFixture, "Test in query condition", "[condition][in qu
query_context sub_ctx;
sub_ctx.sql = R"(SELECT "name" FROM "test")";
auto cond = age_col != 7 && in(name_col, std::move(sub_ctx));
auto cond = age_col != 7 && in_old(name_col, std::move(sub_ctx));
auto clause = cond.evaluate(dlc, ctx);
REQUIRE(clause == "(\"age\" <> 7 AND \"name\" IN (SELECT \"name\" FROM \"test\"))");
}
@@ -106,7 +106,7 @@ TEST_CASE_METHOD(ConditionFixture, "Test between condition", "[condition][betwee
TEST_CASE_METHOD(ConditionFixture, "Test like condition", "[condition][like]") {
const auto name_col = "name"_col;
auto cond = like(name_col, "%er%");
auto cond = like_old(name_col, "%er%");
auto clause = cond.evaluate(dlc, ctx);
REQUIRE(clause == "\"name\" LIKE '%er%'");
}
+122
View File
@@ -0,0 +1,122 @@
#include <catch2/catch_test_macros.hpp>
#include "matador/query/criteria.hpp"
#include "matador/query/criteria_evaluator.hpp"
#include "matador/sql/dialect_builder.hpp"
#include "matador/sql/query_context.hpp"
#include "matador/utils/placeholder.hpp"
using namespace matador::sql;
using namespace matador::query;
using namespace matador::utils;
class CriteriaFixture {
protected:
dialect dlc = dialect_builder::builder()
.create()
.build();
query_context ctx;
};
TEST_CASE_METHOD(CriteriaFixture, "Test binary criteria", "[criteria][binary]") {
const auto name_col = "name"_col;
REQUIRE(name_col.name == "name");
auto clause = name_col != "george";
criteria_evaluator evaluator(dlc, ctx);
auto str = evaluator.evaluate(*clause);
REQUIRE(str == "\"name\" <> 'george'");
clause = "age"_col != 9;
str = evaluator.evaluate(*clause);
REQUIRE(str == "\"age\" <> 9");
clause = "age"_col != _;
str = evaluator.evaluate(*clause);
REQUIRE(str == "\"age\" <> ?");
}
TEST_CASE_METHOD(CriteriaFixture, "Test not criteria", "[criteria][not]") {
const auto name_col = "name"_col;
auto clause = !(name_col == "Hans");
criteria_evaluator evaluator(dlc, ctx);
auto str = evaluator.evaluate(*clause);
REQUIRE(str == "NOT (\"name\" = 'Hans')");
clause = !(name_col == _);
str = evaluator.evaluate(*clause);
REQUIRE(str == "NOT (\"name\" = ?)");
}
TEST_CASE_METHOD(CriteriaFixture, "Test in criteria", "[criteria][in]") {
const auto age_col = "age"_col;
auto clause = age_col != 7 && in(age_col, {7,5,5,8});
criteria_evaluator evaluator(dlc, ctx);
auto str = evaluator.evaluate(*clause);
REQUIRE(str == "(\"age\" <> 7 AND \"age\" IN (7, 5, 5, 8))");
clause = age_col != 7 && in(age_col, {_, _, _});
str = evaluator.evaluate(*clause);
REQUIRE(str == "(\"age\" <> 7 AND \"age\" IN (?, ?, ?))");
}
TEST_CASE_METHOD(CriteriaFixture, "Test in query criteria", "[criteria][in query]") {
const auto age_col = "age"_col;
const auto name_col = "name"_col;
query_context sub_ctx;
sub_ctx.sql = R"(SELECT "name" FROM "test")";
auto clause = age_col != 7 && in(name_col, std::move(sub_ctx));
}
TEST_CASE_METHOD(CriteriaFixture, "Test out criteria", "[criteria][out]") {
const auto age_col = "age"_col;
auto clause = age_col != 7 && out(age_col, {7,5,5,8});
criteria_evaluator evaluator(dlc, ctx);
auto str = evaluator.evaluate(*clause);
REQUIRE(str == "(\"age\" <> 7 AND \"age\" NOT IN (7, 5, 5, 8))");
clause = age_col != 7 && out(age_col, {_, _, _});
str = evaluator.evaluate(*clause);
REQUIRE(str == "(\"age\" <> 7 AND \"age\" NOT IN (?, ?, ?))");
}
TEST_CASE_METHOD(CriteriaFixture, "Test between criteria", "[criteria][between]") {
const auto age_col = "age"_col;
auto clause = age_col != 7 || between(age_col, 21, 30);
criteria_evaluator evaluator(dlc, ctx);
auto str = evaluator.evaluate(*clause);
REQUIRE(str == "(\"age\" <> 7 OR \"age\" BETWEEN 21 AND 30)");
clause = age_col != 7 || between(age_col, _, _);
str = evaluator.evaluate(*clause);
REQUIRE(str == "(\"age\" <> 7 OR \"age\" BETWEEN ? AND ?)");
}
TEST_CASE_METHOD(CriteriaFixture, "Test like criteria", "[criteria][like]") {
const auto name_col = "name"_col;
const auto clause = like(name_col, "%er%");
criteria_evaluator evaluator(dlc, ctx);
auto str = evaluator.evaluate(*clause);
REQUIRE(str == "\"name\" LIKE '%er%'");
}