From 08223326697d19be2db71ecb6399b99ee891adb5 Mon Sep 17 00:00:00 2001 From: Sascha Kuehl Date: Thu, 22 Feb 2024 22:25:29 +0100 Subject: [PATCH] query parts progress --- demo/main.cpp | 17 ++++---- demo/query_helper.hpp | 42 ++++--------------- include/matador/sql/query.hpp | 4 +- include/matador/sql/query_intermediates.hpp | 4 +- include/matador/sql/query_parts.hpp | 9 +++- include/matador/sql/table.hpp | 1 - {demo => include/matador/utils}/macro_map.hpp | 0 src/sql/dialect.cpp | 11 +++-- src/sql/query_compiler.cpp | 3 +- src/sql/query_intermediates.cpp | 6 ++- src/sql/query_parts.cpp | 12 +++++- 11 files changed, 51 insertions(+), 58 deletions(-) rename {demo => include/matador/utils}/macro_map.hpp (100%) diff --git a/demo/main.cpp b/demo/main.cpp index 4ee6a42..1869ae6 100644 --- a/demo/main.cpp +++ b/demo/main.cpp @@ -44,17 +44,18 @@ struct book namespace field = matador::utils::access; field::primary_key(op, "id", id); field::attribute(op, "title", title, 511); - field::has_one(op, "authors", book_author, matador::utils::default_foreign_attributes); + field::has_one(op, "author_id", book_author, matador::utils::default_foreign_attributes); field::attribute(op, "published_in", published_in); } }; QUERY_HELPER(authors, id, first_name, last_name, date_of_birth, year_of_birth, distinguished) -QUERY_HELPER(books, id, book_author, title, published_in) +QUERY_HELPER(books, id, author_id, title, published_in) int main() { using namespace matador::sql; + using namespace matador; const std::string env_var{"MATADOR_BACKENDS_PATH"}; @@ -67,12 +68,12 @@ int main() connection c(dns, s); auto books = c.query() - .select({matador::qh::books.id.name}) - .from({"book"}) - .join_left({"authors"}) - .on("book.author_id"_col == "author.id"_col) - .where("book.published_in"_col < 2008 && "author.name"_col == "Michael Crichton") - .order_by("book.title").asc() + .select({qh::authors.first_name}) + .from(qh::books) + .join_left(qh::authors) + .on(qh::books.author_id == qh::authors.id) + .where(qh::books.published_in < 2008 && qh::authors.first_name == "Michael Crichton") + .order_by(qh::books.title).asc() .offset(2) .limit(5) .str(); diff --git a/demo/query_helper.hpp b/demo/query_helper.hpp index ca9e201..6739564 100644 --- a/demo/query_helper.hpp +++ b/demo/query_helper.hpp @@ -1,49 +1,21 @@ #ifndef QUERY_QUERY_HELPER_HPP #define QUERY_QUERY_HELPER_HPP -#include "macro_map.hpp" +#include "matador/utils/macro_map.hpp" + +#include "matador/sql/table.hpp" +#include "matador/sql/column.hpp" #include #include -template -struct basic_query; - -struct table { - template - table(const basic_query &qc); - const std::string name; -}; - -struct field { - const std::string name; - - friend std::ostream& operator<<(std::ostream &out, const field &f) { - out << f.name; - return out; - } -}; - -template -struct basic_query { - const table& operator()() const { - return table_; - } - - const table table_; -}; - -template -table::table(const basic_query&) -: name(QueryClass::internal_table_name_) { -} - -#define FIELD(x) const field x{#x}; +#define FIELD(x) const sql::column x{this->name, #x, ""}; #define QUERY_HELPER(C, ...) \ namespace matador::qh { \ namespace internal { \ -struct C##_query { \ +struct C##_query : sql::table { \ +C##_query() : table(#C) {} \ MAP(FIELD, __VA_ARGS__) \ }; } \ static const internal:: C##_query C; \ diff --git a/include/matador/sql/query.hpp b/include/matador/sql/query.hpp index 04979b7..c062ad4 100644 --- a/include/matador/sql/query.hpp +++ b/include/matador/sql/query.hpp @@ -41,7 +41,9 @@ query_select_intermediate query::select() template query_select_intermediate query::select(std::initializer_list columns) { - return query_select_intermediate{connection_, column_name_generator::generate(this->schema())}; + auto cols = column_name_generator::generate(this->schema()); + cols.insert(cols.end(), columns); + return query_select_intermediate{connection_, cols}; } } diff --git a/include/matador/sql/query_intermediates.hpp b/include/matador/sql/query_intermediates.hpp index 728e52f..f4509ce 100644 --- a/include/matador/sql/query_intermediates.hpp +++ b/include/matador/sql/query_intermediates.hpp @@ -127,7 +127,7 @@ public: using query_select_finish::query_select_finish; query_group_by_intermediate group_by(const std::string &name); - query_order_by_intermediate order_by(const std::string &name); + query_order_by_intermediate order_by(const column &col); }; class query_join_intermediate; @@ -145,7 +145,7 @@ public: return {connection_, data_}; } query_group_by_intermediate group_by(const std::string &name); - query_order_by_intermediate order_by(const std::string &name); + query_order_by_intermediate order_by(const column &col); }; class query_join_intermediate : public query_intermediate diff --git a/include/matador/sql/query_parts.hpp b/include/matador/sql/query_parts.hpp index 23e8ed8..e42aca0 100644 --- a/include/matador/sql/query_parts.hpp +++ b/include/matador/sql/query_parts.hpp @@ -125,13 +125,18 @@ private: void accept(query_part_visitor &visitor) override; }; -class query_order_by_part : public query_table_name_part +class query_order_by_part : public query_part { public: - explicit query_order_by_part(const std::string &table_name); + explicit query_order_by_part(sql::column col); + + const sql::column& column() const; private: void accept(query_part_visitor &visitor) override; + +private: + sql::column column_; }; class query_order_by_asc_part : public query_part diff --git a/include/matador/sql/table.hpp b/include/matador/sql/table.hpp index f0c8742..1f7e0d7 100644 --- a/include/matador/sql/table.hpp +++ b/include/matador/sql/table.hpp @@ -8,7 +8,6 @@ namespace matador::sql { struct table { -// std::type_index index; std::string name; std::string alias; diff --git a/demo/macro_map.hpp b/include/matador/utils/macro_map.hpp similarity index 100% rename from demo/macro_map.hpp rename to include/matador/utils/macro_map.hpp diff --git a/src/sql/dialect.cpp b/src/sql/dialect.cpp index 7c24402..b724250 100644 --- a/src/sql/dialect.cpp +++ b/src/sql/dialect.cpp @@ -18,13 +18,16 @@ std::string dialect::prepare_identifier(const column &col) const { std::string result; if (!col.is_function()) { - result = prepare_identifier_string(col.name); + if (!col.table.empty()) { + result = prepare_identifier_string(col.table) + "."; + } + result += prepare_identifier_string(col.name); } else { result = sql_func_map_.at(col.function_) + "(" + col.name + ")"; } - if (!col.alias.empty()) { - result += " AS " + col.alias; - } +// if (!col.alias.empty()) { +// result += " AS " + col.alias; +// } return result; } diff --git a/src/sql/query_compiler.cpp b/src/sql/query_compiler.cpp index f358b26..c7a7f80 100644 --- a/src/sql/query_compiler.cpp +++ b/src/sql/query_compiler.cpp @@ -90,7 +90,8 @@ void query_compiler::visit(query_group_by_part &group_by_part) void query_compiler::visit(query_order_by_part &order_by_part) { - + query_.sql += " " + dialect_.token_at(dialect::token_t::ORDER_BY) + + " " + dialect_.prepare_identifier(order_by_part.column()); } void query_compiler::visit(query_order_by_asc_part &order_by_asc_part) diff --git a/src/sql/query_intermediates.cpp b/src/sql/query_intermediates.cpp index 175572b..751acc7 100644 --- a/src/sql/query_intermediates.cpp +++ b/src/sql/query_intermediates.cpp @@ -96,8 +96,9 @@ query_group_by_intermediate query_where_intermediate::group_by(const std::string // return {connection_, builder_.group_by(name)}; } -query_order_by_intermediate query_where_intermediate::order_by(const std::string &name) +query_order_by_intermediate query_where_intermediate::order_by(const column &col) { + data_.parts.push_back(std::make_unique(col)); return {connection_, data_}; // return {connection_, builder_.order_by(name)}; } @@ -114,8 +115,9 @@ query_group_by_intermediate query_on_intermediate::group_by(const std::string &n // return {connection_, builder_.group_by(name)}; } -query_order_by_intermediate query_on_intermediate::order_by(const std::string &name) +query_order_by_intermediate query_on_intermediate::order_by(const column &col) { + data_.parts.push_back(std::make_unique(col)); return {connection_, data_}; // return {connection_, builder_.order_by(name)}; } diff --git a/src/sql/query_parts.cpp b/src/sql/query_parts.cpp index 6104d28..6549260 100644 --- a/src/sql/query_parts.cpp +++ b/src/sql/query_parts.cpp @@ -1,3 +1,5 @@ +#include + #include "matador/sql/query_parts.hpp" #include "matador/sql/basic_condition.hpp" @@ -81,10 +83,16 @@ void query_group_by_part::accept(query_part_visitor &visitor) visitor.visit(*this); } -query_order_by_part::query_order_by_part(const std::string &table_name) -: query_table_name_part(dialect::token_t::ORDER_BY, table_name) +query_order_by_part::query_order_by_part(sql::column col) +: query_part(dialect::token_t::ORDER_BY) +, column_(std::move(col)) {} +const sql::column &query_order_by_part::column() const +{ + return column_; +} + void query_order_by_part::accept(query_part_visitor &visitor) { visitor.visit(*this);