session and insert query builder progress
This commit is contained in:
@@ -6,6 +6,8 @@
|
||||
#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"
|
||||
@@ -22,6 +24,46 @@ using namespace matador::sql;
|
||||
using namespace matador::query;
|
||||
using namespace matador::utils;
|
||||
|
||||
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().value() == _)
|
||||
.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().value() == _)
|
||||
.compile(d);
|
||||
// DELETE one
|
||||
queries.delete_one = remove()
|
||||
.from(node.name())
|
||||
.where(*node.table().primary_key_column().value() == _)
|
||||
.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>());
|
||||
@@ -32,7 +74,8 @@ TEST_CASE("insert query builder test", "[query][insert_query_builder]") {
|
||||
.and_then( [&scm] { return scm.attach<flight>("flights"); } );
|
||||
REQUIRE(result);
|
||||
|
||||
insert_query_builder iqb(scm);
|
||||
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" );
|
||||
auto build_result = iqb.build(a380);
|
||||
@@ -40,12 +83,6 @@ TEST_CASE("insert query builder test", "[query][insert_query_builder]") {
|
||||
|
||||
const auto& stmts = *build_result;
|
||||
REQUIRE(stmts.size() == 1);
|
||||
|
||||
const auto step = stmts.front();
|
||||
|
||||
REQUIRE(std::holds_alternative<executable_query>(step.query));
|
||||
const auto sql = std::get<executable_query>(step.query).str(db);
|
||||
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]") {
|
||||
@@ -58,19 +95,21 @@ TEST_CASE("Test insert builder has many", "[query][insert_query_builder][has_man
|
||||
.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);
|
||||
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());
|
||||
insert_query_builder<author> iqb(scm, contexts_by_type);
|
||||
|
||||
auto build_result = iqb.build(s_king);
|
||||
REQUIRE(build_result.is_ok());
|
||||
|
||||
const auto& stmts = *build_result;
|
||||
REQUIRE_FALSE(stmts.empty());
|
||||
REQUIRE(stmts.size() == 6);
|
||||
}
|
||||
Reference in New Issue
Block a user