From 2b552c4383e6e3c93c503e9fb5abfb73056b7c08 Mon Sep 17 00:00:00 2001 From: Sascha Kuehl Date: Thu, 7 Mar 2024 19:57:42 +0100 Subject: [PATCH] entity query builder progress --- include/matador/sql/entity_query_builder.hpp | 21 ++++++++++---- include/matador/sql/field.hpp | 7 +++++ include/matador/sql/record.hpp | 3 +- include/matador/sql/schema.hpp | 2 -- src/sql/field.cpp | 29 ++++++++++++++++++++ src/sql/record.cpp | 11 ++------ src/sql/schema.cpp | 12 +------- src/sql/session.cpp | 2 +- test/EntityQueryBuilderTest.cpp | 6 ++-- 9 files changed, 59 insertions(+), 34 deletions(-) diff --git a/include/matador/sql/entity_query_builder.hpp b/include/matador/sql/entity_query_builder.hpp index 070cdd4..9628ce7 100644 --- a/include/matador/sql/entity_query_builder.hpp +++ b/include/matador/sql/entity_query_builder.hpp @@ -14,23 +14,24 @@ template < typename PrimaryKeyType > class entity_query_builder { public: - explicit entity_query_builder(const PrimaryKeyType &pk) - : pk_(pk) {} + explicit entity_query_builder(const PrimaryKeyType &pk, const schema &scm) + : pk_(pk) + , schema_(scm) {} // determine pk // collect eager relations for joins template - std::optional build(connection &db, const schema &scm) { + std::optional build(connection &db) { EntityType obj; matador::utils::access::process(*this, obj); - const auto info = scm.info(); + const auto info = schema_.info(); if (!info) { return std::nullopt; } columns_.clear(); table_name_ = info.value().name; - query q(db, scm); + query q(db, schema_); return q.select().from({table_name_}).build(); // auto from_intermediate = q.select().from({"t"}); // return {}; @@ -66,7 +67,9 @@ public: void on_belongs_to(const char *id, Pointer &, const utils::foreign_attributes &attr) { if (attr.fetch() == utils::fetch_type::EAGER) { - // collect join information + column col{id}; + + // collect join information (determine primary key of foreign entity) } columns_.emplace_back(table_name_, id, ""); } @@ -75,6 +78,11 @@ public: void on_has_one(const char *id, Pointer &, const utils::foreign_attributes &attr) { if (attr.fetch() == utils::fetch_type::EAGER) { + auto info = schema_.info(); + if (info) { + column lcol(table_name_, id, ""); +// column rcol(info.value()) + } // collect join information } columns_.emplace_back(table_name_, id, ""); @@ -97,6 +105,7 @@ public: private: PrimaryKeyType pk_; std::vector columns_; + const schema &schema_; std::string table_name_; }; diff --git a/include/matador/sql/field.hpp b/include/matador/sql/field.hpp index e7cc31d..b6c7867 100644 --- a/include/matador/sql/field.hpp +++ b/include/matador/sql/field.hpp @@ -26,6 +26,13 @@ public: return visitor.result; } + bool is_integer() const; + bool is_floating_point() const; + bool is_bool() const; + bool is_string() const; + bool is_blob() const; + bool is_null() const; + friend std::ostream& operator<<(std::ostream &out, const field &col); private: diff --git a/include/matador/sql/record.hpp b/include/matador/sql/record.hpp index 3d01dc5..67fbc4e 100644 --- a/include/matador/sql/record.hpp +++ b/include/matador/sql/record.hpp @@ -48,12 +48,11 @@ public: void append(column_definition col); [[nodiscard]] bool has_primary_key() const; - [[nodiscard]] const column_definition& primary_key() const; + [[nodiscard]] std::optional primary_key() const; [[nodiscard]] const std::vector& columns() const; [[nodiscard]] const column_definition& at(const column &col) const; -// [[nodiscard]] const column_definition& at(const std::string &name) const; [[nodiscard]] const column_definition& at(size_t index) const; iterator find(const std::string &column_name); diff --git a/include/matador/sql/schema.hpp b/include/matador/sql/schema.hpp index 550b0a4..f15432e 100644 --- a/include/matador/sql/schema.hpp +++ b/include/matador/sql/schema.hpp @@ -17,8 +17,6 @@ struct table_info { std::string name; record prototype; - void create(connection &conn, schema &scm) const; - void drop(connection &conn, schema &scm) const; }; class schema diff --git a/src/sql/field.cpp b/src/sql/field.cpp index 3e54a92..d7b88de 100644 --- a/src/sql/field.cpp +++ b/src/sql/field.cpp @@ -12,4 +12,33 @@ std::ostream &operator<<(std::ostream &out, const field &col) return out; } +bool field::is_integer() const +{ + return false; +} + +bool field::is_floating_point() const +{ + return false; +} + +bool field::is_bool() const +{ + return false; +} + +bool field::is_string() const +{ + return false; +} + +bool field::is_blob() const +{ + return false; +} + +bool field::is_null() const +{ + return false; +} } \ No newline at end of file diff --git a/src/sql/record.cpp b/src/sql/record.cpp index 5954cca..9e0f146 100644 --- a/src/sql/record.cpp +++ b/src/sql/record.cpp @@ -52,10 +52,10 @@ bool record::has_primary_key() const return pk_index_ > -1; } -const column_definition &record::primary_key() const +std::optional record::primary_key() const { if (!has_primary_key()) { - throw std::logic_error("record has no primary key"); + return std::nullopt; } return columns_[pk_index_]; @@ -63,16 +63,9 @@ const column_definition &record::primary_key() const const column_definition &record::at(const column &col) const { - auto ref = columns_by_name_.at(col.name).first; return columns_by_name_.at(col.name).first; } -//const column_definition &record::at(const std::string &name) const -//{ -// auto ref = columns_by_name_.at(name).first; -// return columns_by_name_.at(name).first; -//} - const column_definition &record::at(size_t index) const { return columns_.at(index); diff --git a/src/sql/schema.cpp b/src/sql/schema.cpp index e08d945..d15e1c4 100644 --- a/src/sql/schema.cpp +++ b/src/sql/schema.cpp @@ -5,16 +5,6 @@ namespace matador::sql { -void table_info::create(connection &conn, schema &scm) const -{ - conn.query(scm).create().table(name, prototype.columns()).execute(); -} - -void table_info::drop(connection &conn, schema &scm) const -{ - conn.query(scm).drop().table(name).execute(); -} - schema::schema(std::string name) : name_(std::move(name)) {} @@ -44,7 +34,7 @@ std::pair schema::reference(const std::type_index &ti) if (!it->second.prototype.has_primary_key()) { throw std::logic_error("table doesn't has primary key"); } - return { it->second.name, it->second.prototype.primary_key().name() }; + return { it->second.name, it->second.prototype.primary_key().value().name() }; } return {}; diff --git a/src/sql/session.cpp b/src/sql/session.cpp index b066b45..fa601a8 100644 --- a/src/sql/session.cpp +++ b/src/sql/session.cpp @@ -15,7 +15,7 @@ void session::create_schema() { auto c = pool_.acquire(); for (const auto &t : *schema_) { - t.second.create(*c, *schema_); + c->query(*schema_).create().table(t.second.name, t.second.prototype.columns()).execute(); } } diff --git a/test/EntityQueryBuilderTest.cpp b/test/EntityQueryBuilderTest.cpp index 144e1fa..0a42f80 100644 --- a/test/EntityQueryBuilderTest.cpp +++ b/test/EntityQueryBuilderTest.cpp @@ -25,9 +25,9 @@ TEST_CASE("Create sql query for entity", "[query][entity][builder]") { scm.attach("authors"); scm.attach("books"); - entity_query_builder eqb(17); + entity_query_builder eqb(17, scm); - auto context = eqb.build(noop, scm); + auto context = eqb.build(noop); std::cout << "SQL: " << context.value().sql << "\n"; - context = eqb.build(noop, scm); + context = eqb.build(noop); } \ No newline at end of file