diff --git a/include/matador/query/insert_query_builder.hpp b/include/matador/query/insert_query_builder.hpp index d070c9e..48cc194 100644 --- a/include/matador/query/insert_query_builder.hpp +++ b/include/matador/query/insert_query_builder.hpp @@ -3,6 +3,8 @@ #include "matador/query/basic_schema.hpp" #include "matador/query/intermediates/executable_query.hpp" +#include "matador/query/query.hpp" +#include "matador/query/query_builder_exception.hpp" namespace matador::query { class insert_query_builder { @@ -10,25 +12,22 @@ public: explicit insert_query_builder(const basic_schema &schema); template - utils::result build(const object::object_ptr &ptr) { + utils::result, query_build_error> build(const object::object_ptr &ptr) { + const auto it = schema_.find(typeid(EntityType)); + if (it == schema_.end()) { + return utils::failure(query_build_error::UnknownType); + } + + executable_query q = query::query::insert().into(it->second.table()).values(*ptr); + return utils::ok(std::vector{q}); } template < class V > - void on_primary_key(const char *id, V &, const utils::primary_key_attribute& /*attr*/ = utils::default_pk_attributes) { - push(id); - if (!is_root_entity()) { - return; - } - entity_query_data_.pk_column_name = id; - } - - void on_revision(const char *id, uint64_t &/*rev*/); + static void on_primary_key(const char *id, V &, const utils::primary_key_attribute& /*attr*/ = utils::default_pk_attributes) {} + static void on_revision(const char *id, uint64_t &/*rev*/); template - void on_attribute(const char *id, Type &, const utils::field_attributes &/*attr*/ = utils::null_attributes) - { - push(id); - } + static void on_attribute(const char *id, Type &, const utils::field_attributes &/*attr*/ = utils::null_attributes) {} template void on_belongs_to(const char *id, Pointer &obj, const utils::foreign_attributes &attr) { diff --git a/include/matador/query/select_query_builder.hpp b/include/matador/query/select_query_builder.hpp index 31fdc7b..5c9ba0b 100644 --- a/include/matador/query/select_query_builder.hpp +++ b/include/matador/query/select_query_builder.hpp @@ -249,7 +249,7 @@ public: ); } - const select_query_data &query_data() const; + [[nodiscard]] const select_query_data &query_data() const; private: template diff --git a/source/orm/CMakeLists.txt b/source/orm/CMakeLists.txt index 930ea20..0147181 100644 --- a/source/orm/CMakeLists.txt +++ b/source/orm/CMakeLists.txt @@ -18,6 +18,7 @@ add_library(matador-orm STATIC ../../include/matador/query/criteria_evaluator.hpp ../../include/matador/query/fk_value_extractor.hpp ../../include/matador/query/generator.hpp + ../../include/matador/query/insert_query_builder.hpp ../../include/matador/query/intermediates/executable_query.hpp ../../include/matador/query/intermediates/fetchable_query.hpp ../../include/matador/query/intermediates/query_alter_intermediate.hpp @@ -115,6 +116,7 @@ add_library(matador-orm STATIC query/criteria/not_criteria.cpp query/criteria_evaluator.cpp query/generator.cpp + query/insert_query_builder.cpp query/intermediates/executable_query.cpp query/intermediates/fetchable_query.cpp query/intermediates/query_alter_intermediate.cpp diff --git a/source/orm/query/insert_query_builder.cpp b/source/orm/query/insert_query_builder.cpp new file mode 100644 index 0000000..eab3105 --- /dev/null +++ b/source/orm/query/insert_query_builder.cpp @@ -0,0 +1,8 @@ +#include "matador/query/insert_query_builder.hpp" + +namespace matador::query { +insert_query_builder::insert_query_builder(const basic_schema& schema) +: schema_(schema) {} + +void insert_query_builder::on_revision(const char* /*id*/, uint64_t&) {} +} // namespace matador::query \ No newline at end of file diff --git a/test/orm/CMakeLists.txt b/test/orm/CMakeLists.txt index 93d6a99..96f57aa 100644 --- a/test/orm/CMakeLists.txt +++ b/test/orm/CMakeLists.txt @@ -17,6 +17,7 @@ add_executable(OrmTests query/ColumnGeneratorTest.cpp query/CriteriaTests.cpp query/GeneratorTests.cpp + query/InsertQueryBuilderTest.cpp query/QueryBuilderTest.cpp query/QueryFixture.cpp query/QueryFixture.hpp diff --git a/test/orm/query/InsertQueryBuilderTest.cpp b/test/orm/query/InsertQueryBuilderTest.cpp new file mode 100644 index 0000000..7661b65 --- /dev/null +++ b/test/orm/query/InsertQueryBuilderTest.cpp @@ -0,0 +1,44 @@ +#include + +#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/insert_query_builder.hpp" + +#include "../backend/test_backend_service.hpp" + +#include "../../models/airplane.hpp" +#include "../../models/flight.hpp" + +using namespace matador::object; +using namespace matador::sql; +using namespace matador::query; +using namespace matador::utils; + +TEST_CASE("insert query builder test", "[query][insert_query_builder]") { + using namespace matador::test; + backend_provider::instance().register_backend("noop", std::make_unique()); + connection db("noop://noop.db"); + + schema scm; + auto result = scm.attach("airplanes") + .and_then( [&scm] { return scm.attach("flights"); } ); + REQUIRE(result); + + insert_query_builder iqb(scm); + + const auto a380 = object_ptr(std::make_shared(1, "Boeing", "A380" )); + auto build_result = iqb.build(a380); + REQUIRE(build_result.is_ok()); + + const auto& stmts = *build_result; + REQUIRE(stmts.size() == 1); + + const auto sql = stmts.front().str(db); + REQUIRE(sql == R"(INSERT INTO "airplanes" ("id", "brand", "model") VALUES (1, 'Boeing', 'A380'))"); +}