delete has many to many progress
This commit is contained in:
@@ -3,6 +3,8 @@ CPMAddPackage("gh:catchorg/Catch2@3.14.0")
|
||||
list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras)
|
||||
|
||||
add_executable(OrmTests
|
||||
../utils/RecordingObserver.cpp
|
||||
../utils/RecordingObserver.hpp
|
||||
backend/test_backend_service.cpp
|
||||
backend/test_backend_service.hpp
|
||||
backend/test_connection.cpp
|
||||
@@ -16,6 +18,7 @@ add_executable(OrmTests
|
||||
query/ColumnExpressionTest.cpp
|
||||
query/ColumnGeneratorTest.cpp
|
||||
query/CriteriaTests.cpp
|
||||
query/DeleteQueryBuilderTest.cpp
|
||||
query/GeneratorTests.cpp
|
||||
query/InsertQueryBuilderTest.cpp
|
||||
query/QueryBuilderTest.cpp
|
||||
@@ -32,8 +35,6 @@ add_executable(OrmTests
|
||||
sql/StatementCacheTest.cpp
|
||||
utils/auto_reset_event.cpp
|
||||
utils/auto_reset_event.hpp
|
||||
../utils/RecordingObserver.hpp
|
||||
../utils/RecordingObserver.cpp
|
||||
)
|
||||
|
||||
target_link_libraries(OrmTests matador-orm matador-core Catch2::Catch2WithMain)
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
#include <catch2/catch_test_macros.hpp>
|
||||
|
||||
#include "matador/object/object_ptr.hpp"
|
||||
|
||||
#include "matador/sql/backend_provider.hpp"
|
||||
#include "matador/sql/connection.hpp"
|
||||
#include "matador/sql/interface/connection_impl.hpp"
|
||||
|
||||
#include "matador/query/schema.hpp"
|
||||
|
||||
#include "matador/query/delete_query_builder.hpp"
|
||||
|
||||
#include "QueryFixture.hpp"
|
||||
|
||||
#include "../../models/author.hpp"
|
||||
#include "../../models/book.hpp"
|
||||
#include "../../models/airplane.hpp"
|
||||
#include "../../models/flight.hpp"
|
||||
#include "../../models/recipe.hpp"
|
||||
|
||||
using namespace matador::object;
|
||||
using namespace matador::sql;
|
||||
using namespace matador::query;
|
||||
using namespace matador::utils;
|
||||
using namespace matador::test;
|
||||
|
||||
TEST_CASE_METHOD(QueryFixture, "delete query builder test", "[query][delete_query_builder]") {
|
||||
schema scm;
|
||||
auto result = scm.attach<airplane>("airplanes")
|
||||
.and_then( [&scm] { return scm.attach<flight>("flights"); } );
|
||||
REQUIRE(result);
|
||||
|
||||
const auto contexts_by_type = to_contexts_by_name(scm, db->dialect());
|
||||
delete_query_builder<airplane> dqb(scm, contexts_by_type);
|
||||
|
||||
const auto a380 = make_object<airplane>(1, "Boeing", "A380" );
|
||||
auto build_result = dqb.build(a380);
|
||||
REQUIRE(build_result.is_ok());
|
||||
|
||||
const auto& stmts = *build_result;
|
||||
REQUIRE(stmts.size() == 1);
|
||||
}
|
||||
|
||||
TEST_CASE_METHOD(QueryFixture, "Test delete builder has many", "[query][delete_query_builder][has_many]") {
|
||||
schema scm;
|
||||
const auto result = scm.attach<book>("books")
|
||||
.and_then( [&scm] { return scm.attach<author>("authors"); } );
|
||||
REQUIRE(result.is_ok());
|
||||
|
||||
auto s_king = make_object<author>(1, "Steven", "King", "21.9.1947", 1956, false);
|
||||
|
||||
s_king->books.push_back(make_object<book>(2, "Carrie", object_ptr<author>{}, 1974));
|
||||
s_king->books.push_back(make_object<book>(3, "The Shining", object_ptr<author>{}, 1977));
|
||||
s_king->books.push_back(make_object<book>(4, "It", object_ptr<author>{}, 1986));
|
||||
s_king->books.push_back(make_object<book>(5, "Misery", object_ptr<author>{}, 1987));
|
||||
s_king->books.push_back(make_object<book>(6, "The Dark Tower: The Gunslinger", object_ptr<author>{}, 1982));
|
||||
|
||||
const auto contexts_by_type = to_contexts_by_name(scm, db->dialect());
|
||||
delete_query_builder<author> dqb(scm, contexts_by_type);
|
||||
|
||||
auto build_result = dqb.build(s_king);
|
||||
REQUIRE(build_result.is_ok());
|
||||
|
||||
const auto& stmts = *build_result;
|
||||
REQUIRE_FALSE(stmts.empty());
|
||||
REQUIRE(stmts.size() == 6);
|
||||
}
|
||||
|
||||
TEST_CASE_METHOD(QueryFixture, "Test delete builder has many to many", "[query][delete_query_builder][many_to_many]") {
|
||||
schema scm;
|
||||
const auto result = scm.attach<recipe>("recipes")
|
||||
.and_then( [&scm] { return scm.attach<ingredient>("ingredients"); } );
|
||||
REQUIRE(result.is_ok());
|
||||
|
||||
const std::vector ingredients {
|
||||
make_object<ingredient>(1, "Apple"),
|
||||
make_object<ingredient>(2, "Strawberry"),
|
||||
make_object<ingredient>(3, "Pineapple"),
|
||||
make_object<ingredient>(4, "Sugar"),
|
||||
make_object<ingredient>(5, "Flour"),
|
||||
make_object<ingredient>(6, "Butter"),
|
||||
make_object<ingredient>(7, "Beans")
|
||||
};
|
||||
|
||||
std::vector recipes {
|
||||
make_object<recipe>(1, "Apple Pie", std::vector{ingredients[0], ingredients[3], ingredients[4]}),
|
||||
make_object<recipe>(2, "Strawberry Cake", std::vector{ingredients[5], ingredients[6]}),
|
||||
make_object<recipe>(3, "Pineapple Pie", std::vector{ingredients[0], ingredients[1], ingredients[2]})
|
||||
};
|
||||
|
||||
const auto contexts_by_type = to_contexts_by_name(scm, db->dialect());
|
||||
delete_query_builder<recipe> dqb(scm, contexts_by_type);
|
||||
|
||||
auto build_result = dqb.build(recipes[0]);
|
||||
REQUIRE(build_result.is_ok());
|
||||
|
||||
const auto& stmts = *build_result;
|
||||
REQUIRE_FALSE(stmts.empty());
|
||||
REQUIRE(stmts.size() == 7);
|
||||
}
|
||||
@@ -6,13 +6,11 @@
|
||||
#include "matador/sql/connection.hpp"
|
||||
#include "matador/sql/interface/connection_impl.hpp"
|
||||
|
||||
#include "matador/query/query_contexts.hpp"
|
||||
#include "matador/query/query.hpp"
|
||||
#include "matador/query/schema.hpp"
|
||||
|
||||
#include "matador/query/insert_query_builder.hpp"
|
||||
|
||||
#include "../backend/test_backend_service.hpp"
|
||||
#include "QueryFixture.hpp"
|
||||
|
||||
#include "../../models/author.hpp"
|
||||
#include "../../models/book.hpp"
|
||||
@@ -24,58 +22,15 @@ using namespace matador::object;
|
||||
using namespace matador::sql;
|
||||
using namespace matador::query;
|
||||
using namespace matador::utils;
|
||||
using namespace matador::test;
|
||||
|
||||
std::unordered_map<std::type_index, query_contexts> to_contexts_by_name(const schema& scm, const dialect& d) {
|
||||
std::unordered_map<std::type_index, query_contexts> contexts_by_type;
|
||||
for (const auto &[type, node] : scm) {
|
||||
query_contexts queries;
|
||||
|
||||
// SELECT all
|
||||
queries.select_all = select(node.table())
|
||||
.from(node.name())
|
||||
.compile(d);
|
||||
if (node.table().has_primary_key()) {
|
||||
// SELECT one
|
||||
queries.select_one = select(node.table())
|
||||
.from(node.name())
|
||||
.where(*node.table().primary_key_column() == _)
|
||||
.compile(d);
|
||||
// UPDATE one
|
||||
auto update_set = update(node.table());
|
||||
for (const auto &col: node.table().columns()) {
|
||||
update_set.set(col, _);
|
||||
}
|
||||
queries.update_one = update_set.where(*node.table().primary_key_column() == _)
|
||||
.compile(d);
|
||||
// DELETE one
|
||||
queries.delete_one = remove()
|
||||
.from(node.name())
|
||||
.where(*node.table().primary_key_column() == _)
|
||||
.compile(d);
|
||||
}
|
||||
// INSERT one
|
||||
queries.insert = insert()
|
||||
.into(node.name(), node.table())
|
||||
.values(generator::placeholders(node.table().columns().size()))
|
||||
.compile(d);
|
||||
|
||||
contexts_by_type[node.node().type_index()] = queries;
|
||||
}
|
||||
|
||||
return contexts_by_type;
|
||||
}
|
||||
|
||||
TEST_CASE("insert query builder test", "[query][insert_query_builder]") {
|
||||
using namespace matador::test;
|
||||
backend_provider::instance().register_backend("noop", std::make_unique<orm::test_backend_service>());
|
||||
connection db("noop://noop.db");
|
||||
|
||||
TEST_CASE_METHOD(QueryFixture, "insert query builder test", "[query][insert_query_builder]") {
|
||||
schema scm;
|
||||
auto result = scm.attach<airplane>("airplanes")
|
||||
.and_then( [&scm] { return scm.attach<flight>("flights"); } );
|
||||
REQUIRE(result);
|
||||
|
||||
const auto contexts_by_type = to_contexts_by_name(scm, db.dialect());
|
||||
const auto contexts_by_type = to_contexts_by_name(scm, db->dialect());
|
||||
insert_query_builder<airplane> iqb(scm, contexts_by_type);
|
||||
|
||||
const auto a380 = make_object<airplane>(1, "Boeing", "A380" );
|
||||
@@ -86,11 +41,7 @@ TEST_CASE("insert query builder test", "[query][insert_query_builder]") {
|
||||
REQUIRE(stmts.size() == 1);
|
||||
}
|
||||
|
||||
TEST_CASE("Test insert builder has many", "[query][insert_query_builder][has_many]") {
|
||||
using namespace matador::test;
|
||||
backend_provider::instance().register_backend("noop", std::make_unique<orm::test_backend_service>());
|
||||
connection db("noop://noop.db");
|
||||
|
||||
TEST_CASE_METHOD(QueryFixture, "Test insert builder has many", "[query][insert_query_builder][has_many]") {
|
||||
schema scm;
|
||||
const auto result = scm.attach<book>("books")
|
||||
.and_then( [&scm] { return scm.attach<author>("authors"); } );
|
||||
@@ -104,7 +55,7 @@ TEST_CASE("Test insert builder has many", "[query][insert_query_builder][has_man
|
||||
s_king->books.push_back(make_object<book>(5, "Misery", object_ptr<author>{}, 1987));
|
||||
s_king->books.push_back(make_object<book>(6, "The Dark Tower: The Gunslinger", object_ptr<author>{}, 1982));
|
||||
|
||||
const auto contexts_by_type = to_contexts_by_name(scm, db.dialect());
|
||||
const auto contexts_by_type = to_contexts_by_name(scm, db->dialect());
|
||||
insert_query_builder<author> iqb(scm, contexts_by_type);
|
||||
|
||||
auto build_result = iqb.build(s_king);
|
||||
@@ -115,11 +66,7 @@ TEST_CASE("Test insert builder has many", "[query][insert_query_builder][has_man
|
||||
REQUIRE(stmts.size() == 6);
|
||||
}
|
||||
|
||||
TEST_CASE("Test insert builder has many to many", "[query][insert_query_builder][many_to_many]") {
|
||||
using namespace matador::test;
|
||||
backend_provider::instance().register_backend("noop", std::make_unique<orm::test_backend_service>());
|
||||
connection db("noop://noop.db");
|
||||
|
||||
TEST_CASE_METHOD(QueryFixture, "Test insert builder has many to many", "[query][insert_query_builder][many_to_many]") {
|
||||
schema scm;
|
||||
const auto result = scm.attach<recipe>("recipes")
|
||||
.and_then( [&scm] { return scm.attach<ingredient>("ingredients"); } );
|
||||
@@ -141,7 +88,7 @@ TEST_CASE("Test insert builder has many to many", "[query][insert_query_builder]
|
||||
make_object<recipe>(3, "Pineapple Pie", std::vector{ingredients[0], ingredients[1], ingredients[2]})
|
||||
};
|
||||
|
||||
const auto contexts_by_type = to_contexts_by_name(scm, db.dialect());
|
||||
const auto contexts_by_type = to_contexts_by_name(scm, db->dialect());
|
||||
insert_query_builder<recipe> iqb(scm, contexts_by_type);
|
||||
|
||||
auto build_result = iqb.build(recipes[0]);
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
|
||||
#include "matador/sql/interface/connection_impl.hpp"
|
||||
|
||||
#include "matador/query/basic_schema.hpp"
|
||||
#include "matador/query/schema_utils.hpp"
|
||||
|
||||
namespace matador::test {
|
||||
|
||||
QueryFixture::QueryFixture() {
|
||||
@@ -12,4 +15,12 @@ QueryFixture::QueryFixture() {
|
||||
db = std::make_unique<sql::connection>("noop://noop.db");
|
||||
}
|
||||
|
||||
std::unordered_map<std::type_index, query::query_contexts> QueryFixture::to_contexts_by_name(const query::basic_schema& scm, const sql::dialect& d) {
|
||||
std::unordered_map<std::type_index, query::query_contexts> contexts_by_type;
|
||||
for (const auto &[type, node] : scm) {
|
||||
contexts_by_type[node.node().type_index()] = to_query_contexts(node, d);
|
||||
}
|
||||
|
||||
return contexts_by_type;
|
||||
}
|
||||
}
|
||||
@@ -3,8 +3,14 @@
|
||||
|
||||
#include "matador/sql/connection.hpp"
|
||||
|
||||
#include "matador/query/query_contexts.hpp"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace matador::query {
|
||||
class basic_schema;
|
||||
}
|
||||
|
||||
namespace matador::test {
|
||||
|
||||
class QueryFixture {
|
||||
@@ -12,6 +18,9 @@ public:
|
||||
QueryFixture();
|
||||
~QueryFixture() = default;
|
||||
|
||||
protected:
|
||||
static std::unordered_map<std::type_index, query::query_contexts> to_contexts_by_name(const query::basic_schema& scm, const sql::dialect& d) ;
|
||||
|
||||
protected:
|
||||
std::unique_ptr<sql::connection> db;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user