added criteria_evaluator and extended all criteria classes with missing methods
This commit is contained in:
@@ -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%'");
|
||||
}
|
||||
|
||||
@@ -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%'");
|
||||
}
|
||||
Reference in New Issue
Block a user