122 lines
3.4 KiB
C++
122 lines
3.4 KiB
C++
#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.column_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%'");
|
|
} |