insert_query_builder has_many progress
This commit is contained in:
parent
855c9295fb
commit
f4e984a288
|
|
@ -138,8 +138,19 @@ public:
|
||||||
void on_has_one(const char * /*id*/, Pointer &obj, const utils::foreign_attributes &attr) {
|
void on_has_one(const char * /*id*/, Pointer &obj, const utils::foreign_attributes &attr) {
|
||||||
on_foreign_object(obj, attr);
|
on_foreign_object(obj, attr);
|
||||||
}
|
}
|
||||||
template<class Collection>
|
template<class CollectionType>
|
||||||
static void on_has_many(const char * /*id*/, Collection &/*con*/, const char * /*join_column*/, const utils::foreign_attributes & ) {}
|
void on_has_many(const char * /*id*/, CollectionType &con, const char *, const utils::foreign_attributes &attr, std::enable_if_t<object::is_object_ptr<typename CollectionType::value_type>::value> * = nullptr) {
|
||||||
|
if (!utils::is_cascade_type_set(attr.cascade(), utils::cascade_type::Insert)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (auto &obj : con) {
|
||||||
|
obj.is_persistent() ? build_for(obj) : on_foreign_object(obj, attr);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
template<class CollectionType>
|
||||||
|
void on_has_many(const char * /*id*/, CollectionType &/*con*/, const char *, const utils::foreign_attributes &/*attr*/, std::enable_if_t<!object::is_object_ptr<typename CollectionType::value_type>::value> * = nullptr) {}
|
||||||
template<class Collection>
|
template<class Collection>
|
||||||
void on_has_many_to_many(const char *id, Collection &container, const char *join_column, const char *inverse_join_column, const utils::foreign_attributes & ) {
|
void on_has_many_to_many(const char *id, Collection &container, const char *join_column, const char *inverse_join_column, const utils::foreign_attributes & ) {
|
||||||
if (id == nullptr || join_column == nullptr || inverse_join_column == nullptr) {
|
if (id == nullptr || join_column == nullptr || inverse_join_column == nullptr) {
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,8 @@
|
||||||
|
|
||||||
#include "../backend/test_backend_service.hpp"
|
#include "../backend/test_backend_service.hpp"
|
||||||
|
|
||||||
|
#include "../../models/author.hpp"
|
||||||
|
#include "../../models/book.hpp"
|
||||||
#include "../../models/airplane.hpp"
|
#include "../../models/airplane.hpp"
|
||||||
#include "../../models/flight.hpp"
|
#include "../../models/flight.hpp"
|
||||||
|
|
||||||
|
|
@ -32,8 +34,8 @@ TEST_CASE("insert query builder test", "[query][insert_query_builder]") {
|
||||||
|
|
||||||
insert_query_builder iqb(scm);
|
insert_query_builder iqb(scm);
|
||||||
|
|
||||||
const auto a380 = object_ptr(std::make_shared<airplane>(1, "Boeing", "A380" ));
|
const auto a380 = make_object<airplane>(1, "Boeing", "A380" );
|
||||||
auto build_result = iqb.build<airplane>(a380);
|
auto build_result = iqb.build(a380);
|
||||||
REQUIRE(build_result.is_ok());
|
REQUIRE(build_result.is_ok());
|
||||||
|
|
||||||
const auto& stmts = *build_result;
|
const auto& stmts = *build_result;
|
||||||
|
|
@ -45,3 +47,30 @@ TEST_CASE("insert query builder test", "[query][insert_query_builder]") {
|
||||||
const auto sql = std::get<executable_query>(step.query).str(db);
|
const auto sql = std::get<executable_query>(step.query).str(db);
|
||||||
REQUIRE(sql == R"(INSERT INTO "airplanes" ("id", "brand", "model") VALUES (1, 'Boeing', 'A380'))");
|
REQUIRE(sql == R"(INSERT INTO "airplanes" ("id", "brand", "model") VALUES (1, 'Boeing', 'A380'))");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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");
|
||||||
|
|
||||||
|
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));
|
||||||
|
|
||||||
|
insert_query_builder iqb(scm);
|
||||||
|
|
||||||
|
auto build_result = iqb.build(s_king);
|
||||||
|
REQUIRE(build_result.is_ok());
|
||||||
|
|
||||||
|
const auto& stmts = *build_result;
|
||||||
|
REQUIRE(stmts.size() == 1);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue