diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..3924d5b --- /dev/null +++ b/.clang-format @@ -0,0 +1,2 @@ +# Generated by CLion for Google +BasedOnStyle: Google \ No newline at end of file diff --git a/demo/work.cpp b/demo/work.cpp index d070839..aae003d 100644 --- a/demo/work.cpp +++ b/demo/work.cpp @@ -48,7 +48,7 @@ using namespace work::models; // // If all checks succeed, the requested is fetched from // the database. -// schema.attach("payloads", make_polymorph("type")); +// schema.attach_as_base("payloads", make_polymorph("type")); // schema.attach("id_list_payloads", make_polymorph_type("IdPayload")); // schema.attach("id_payloads", make_polymorph_type("IdListPayload")); // object::object_ptr payload; @@ -66,7 +66,7 @@ int main() { logger::add_log_sink(logger::create_stdout_sink()); // sql::connection_pool pool("postgres://news:news@127.0.0.1:15432/matador", 4); - sql::connection_pool pool("postgres://test:test123!@127.0.0.1:5432/matador", 4); + sql::connection_pool pool("postgres://test:test123!@127.0.0.1:15442/matador", 4); utils::message_bus bus; // query::schema ses({bus, pool}); @@ -97,26 +97,72 @@ int main() { } const auto conn = pool.acquire(); - result = admin_schema.create(*conn); - if (!result) { - std::cout << "error: " << result.err() << std::endl; - return 0; - } - result = admin_schema.drop(*conn); - if (!result) { - std::cout << "error: " << result.err() << std::endl; - return 0; - } - - // const std::string dns{"sqlite://demo.db"}; - // sql::connection c(dns); - // - // result = c.open(); - // - // // orm::session s() - // if (!result.is_ok()) { + // result = admin_schema.create(*conn); + // if (!result) { + // std::cout << "error: " << result.err() << std::endl; + // return 0; + // } + // result = admin_schema.drop(*conn); + // if (!result) { + // std::cout << "error: " << result.err() << std::endl; // return 0; // } - return 0; +/* + * const auto statement = QString( "SELECT %5.%6, %1.%2 FROM %3 %1, %4 %5 WHERE %1.%2=%5.%6 AND %7" ) + .arg( payloadTableAliasName, + payloadSqlMetaInfo.columnName( Payload::Attributes::idAttributeId() ), + Payload::staticSqlMetaInfo().tableName(), + Task::staticSqlMetaInfo().tableName(), + taskTableAliasName, + taskSqlMetaInfo.columnName( Task::Attributes::payloadAttributeId() ), + filter->idSelectStatement( taskTableAliasName ) ); +*/ + + using namespace matador::query::meta; + using namespace matador::utils; + const auto payloads = PAYLOAD.as( "payloads" ); + const auto tasks = TASK.as( "tasks" ); + const auto stmt1 = query:: query::select( { tasks.payload, payloads.id } ) + .from( tasks, payloads ) + .where ( payloads.id == tasks.payload ) + .str( conn->dialect() ); + + + /* + const auto temporaryTable = status.addChildExc( fillTemporaryTable( idsInsidePayload ) ); + const auto lookUpTableName = temporaryTable->tableName(); + + const auto& jobSqlMetaInfo = Job::staticSqlMetaInfo(); + const auto& payloadSqlMetaInfo = Payload::staticSqlMetaInfo(); + const auto& idPayloadSqlMetaInfo = IdPayload::staticSqlMetaInfo(); + + const auto statement = QString( "SELECT iPT.%1 FROM %2 iPT INNER JOIN %3 pT ON iPT.%4 = pT.%5 WHERE pT.%5 IN (SELECT %6 FROM %7 WHERE %8=?) AND iPT.%1 IN (SELECT %9 FROM %10)" ) + .arg( idPayloadSqlMetaInfo.columnName( IdPayload::Attributes::payloadIdAttributeId() ) ) // %1 + .arg( idPayloadSqlMetaInfo.tableName() ) // %2 + .arg( payloadSqlMetaInfo.tableName() ) // %3 + .arg( idPayloadSqlMetaInfo.columnName( IdPayload::Attributes::idAttributeId() ) ) // %4 + .arg( payloadSqlMetaInfo.columnName( Payload::Attributes::idAttributeId() ) ) // %5 + .arg( jobSqlMetaInfo.columnName( Job::Attributes::payloadAttributeId() ) ) // %6 + .arg( jobSqlMetaInfo.tableName() ) // %7 + .arg( jobSqlMetaInfo.columnName( Job::Attributes::stateSqlAttributeId() ) ) // %8 + .arg( lookUpColName() ) // %9 + .arg( lookUpTableName ); // %10 + */ + + query::table_column temp_id_col("ID"); + query::table temporary("TempTable", { temp_id_col } ); + + const auto iPT = ID_PAYLOAD.as("iPT"); + const auto pT = PAYLOAD.as("pT"); + + const auto stmt2 = query::query::select({ iPT.payload_id }) + .from( iPT ) + .join_left( pT ).on( iPT.id == pT.id ) + .where( + in( pT.id, query::query::select({ JOB.payload }).from( JOB ).where( JOB.state == _) ) && + in( iPT.payload_id, query::query::select({ temp_id_col }).from( temporary ) ) + ) + .str( conn->dialect() ); + return 0; } \ No newline at end of file diff --git a/demo/work/core/Model.hpp b/demo/work/core/Model.hpp index 215ad14..e1f70ce 100644 --- a/demo/work/core/Model.hpp +++ b/demo/work/core/Model.hpp @@ -7,7 +7,7 @@ namespace work::core { struct Model { - uint64_t id{}; + int64_t id{}; uint64_t version{}; template diff --git a/demo/work/jobs/IdListPayload.hpp b/demo/work/jobs/IdListPayload.hpp index acc3e7a..628cb35 100644 --- a/demo/work/jobs/IdListPayload.hpp +++ b/demo/work/jobs/IdListPayload.hpp @@ -5,6 +5,8 @@ #include "matador/object/collection.hpp" +#include "matador/query/meta_table_macro.hpp" + #include "matador/utils/foreign_attributes.hpp" namespace work::models::jobs { @@ -19,4 +21,6 @@ struct IdListPayload : Payload { }; } +META_TABLE(id_list_payloads, ID_LIST_PAYLOAD, id, version, type, job) + #endif //ID_LIST_PAYLOAD_HPP diff --git a/demo/work/jobs/IdPayload.hpp b/demo/work/jobs/IdPayload.hpp index 56a81ca..f779ab5 100644 --- a/demo/work/jobs/IdPayload.hpp +++ b/demo/work/jobs/IdPayload.hpp @@ -3,6 +3,8 @@ #include "Payload.hpp" +#include "matador/query/meta_table_macro.hpp" + namespace work::models::jobs { struct IdPayload : Payload { uint64_t payload_id{}; @@ -15,4 +17,6 @@ struct IdPayload : Payload { }; } +META_TABLE(id_payloads, ID_PAYLOAD, id, version, type, job, payload_id) + #endif //ID_PAYLOAD_HPP diff --git a/demo/work/jobs/Job.hpp b/demo/work/jobs/Job.hpp index 8b2dbd8..541e26c 100644 --- a/demo/work/jobs/Job.hpp +++ b/demo/work/jobs/Job.hpp @@ -11,6 +11,8 @@ #include "matador/object/object_ptr.hpp" +#include "matador/query/meta_table_macro.hpp" + #include "matador/utils/base_class.hpp" #include "matador/utils/foreign_attributes.hpp" @@ -43,4 +45,6 @@ struct Job : core::Model { } +META_TABLE(jobs, JOB, id, version, name, description, state, mode, created_at, payload, task, user_info) + #endif //JOB_HPP diff --git a/demo/work/jobs/Payload.hpp b/demo/work/jobs/Payload.hpp index 5207acc..c4f67e7 100644 --- a/demo/work/jobs/Payload.hpp +++ b/demo/work/jobs/Payload.hpp @@ -3,14 +3,16 @@ #include "../core/Model.hpp" +#include "matador/query/meta_table_macro.hpp" + #include "matador/utils/base_class.hpp" #include "matador/utils/foreign_attributes.hpp" namespace work::models::jobs { struct Job; struct Payload : core::Model { - std::string type; - matador::object::object_ptr job; + std::string type{}; + matador::object::object_ptr job{}; template void process( Operator& op ) { @@ -22,4 +24,6 @@ struct Payload : core::Model { }; } +META_TABLE(payloads, PAYLOAD, id, version, type, job) + #endif //PAYLOAD_HPP diff --git a/demo/work/jobs/Task.hpp b/demo/work/jobs/Task.hpp index fa9cb73..78d3f41 100644 --- a/demo/work/jobs/Task.hpp +++ b/demo/work/jobs/Task.hpp @@ -7,6 +7,8 @@ #include "matador/object/object_ptr.hpp" +#include "matador/query/meta_table_macro.hpp" + #include "matador/utils/base_class.hpp" #include "matador/utils/foreign_attributes.hpp" @@ -39,4 +41,6 @@ struct Task : core::Model { }; } +META_TABLE(tasks, TASK, id, version, name, description, job_name, state, payload, job_mode, start_delay, interval, user_session_id) + #endif //TASK_HPP diff --git a/include/matador/object/collection.hpp b/include/matador/object/collection.hpp index f42151f..564f321 100644 --- a/include/matador/object/collection.hpp +++ b/include/matador/object/collection.hpp @@ -40,12 +40,12 @@ public: return proxy_->items_.empty(); } - void reset(std::shared_ptr> proxy) { + void reset(std::shared_ptr> proxy) { proxy_ = std::move(proxy); } private: - std::shared_ptr> proxy_; + std::shared_ptr> proxy_; }; } diff --git a/include/matador/object/collection_proxy.hpp b/include/matador/object/collection_proxy.hpp index e4b334e..ae3026d 100644 --- a/include/matador/object/collection_proxy.hpp +++ b/include/matador/object/collection_proxy.hpp @@ -36,22 +36,22 @@ public: template class collection_proxy final { public: - collection_proxy(std::weak_ptr> resolver, utils::identifier owner_id) + collection_proxy(std::weak_ptr> resolver, utils::identifier owner_id) : owner_id_(std::move(owner_id)), resolver_(std::move(resolver)) {} - collection_proxy(std::weak_ptr> resolver, std::vector> items) + collection_proxy(std::weak_ptr> resolver, std::vector items) : items_(std::move(items)), resolver_(std::move(resolver)) {} - explicit collection_proxy(std::vector> items) + explicit collection_proxy(std::vector items) : items_(std::move(items)) {} [[nodiscard]] const utils::identifier& owner_id() const { return owner_id_; } - const std::vector>& items() const { + const std::vector& items() const { return items_; } - std::vector>& items() { + std::vector& items() { return items_; } private: @@ -74,8 +74,8 @@ private: private: const utils::identifier owner_id_; std::atomic_bool loaded_{false}; - std::vector> items_; - std::weak_ptr> resolver_{}; + std::vector items_; + std::weak_ptr> resolver_{}; mutable std::mutex mutex_{}; }; } diff --git a/include/matador/query/criteria/binary_criteria.hpp b/include/matador/query/criteria/binary_criteria.hpp index d8d7b35..4fe28ea 100644 --- a/include/matador/query/criteria/binary_criteria.hpp +++ b/include/matador/query/criteria/binary_criteria.hpp @@ -3,8 +3,8 @@ #include "matador/query/criteria/abstract_column_criteria.hpp" #include "matador/query/criteria/criteria_utils.hpp" - #include "matador/query/table_column.hpp" +#include "matador/query/intermediates/fetchable_query.hpp" namespace matador::query { enum class binary_operator { @@ -34,7 +34,7 @@ private: class binary_column_criteria final : public abstract_criteria { public: binary_column_criteria() = delete; - binary_column_criteria(const table_column& left_column, binary_operator operand, const table_column& right_column); + binary_column_criteria(table_column left_column, binary_operator operand, table_column right_column); void accept(criteria_visitor& visitor) const override; diff --git a/include/matador/query/criteria/collection_criteria.hpp b/include/matador/query/criteria/collection_criteria.hpp index 54e01ad..b1cff96 100644 --- a/include/matador/query/criteria/collection_criteria.hpp +++ b/include/matador/query/criteria/collection_criteria.hpp @@ -3,8 +3,9 @@ #include "matador/query/criteria/abstract_column_criteria.hpp" #include "matador/query/criteria/criteria_utils.hpp" - +#include "matador/query/intermediates/fetchable_query.hpp" #include "matador/query/table.hpp" + #include "matador/sql/query_context.hpp" namespace matador::query { @@ -54,16 +55,16 @@ private: class collection_query_criteria final : public abstract_column_criteria { public: collection_query_criteria() = delete; - collection_query_criteria(const table_column& col, collection_operator operand_, sql::query_context ctx); + collection_query_criteria(const table_column& col, collection_operator operand_, fetchable_query ctx); void accept(criteria_visitor& visitor) const override; [[nodiscard]] collection_operator operand() const; - [[nodiscard]] const sql::query_context& context() const; + [[nodiscard]] const fetchable_query& query() const; private: collection_operator operand_; - sql::query_context query_context_; + fetchable_query query_context_; }; } #endif //CRITERIA_COLLECTION_CRITERIA_NODE_HPP \ No newline at end of file diff --git a/include/matador/query/criteria/criteria_operators.hpp b/include/matador/query/criteria/criteria_operators.hpp index 78feae9..f9f6403 100644 --- a/include/matador/query/criteria/criteria_operators.hpp +++ b/include/matador/query/criteria/criteria_operators.hpp @@ -3,6 +3,7 @@ #include "matador/query/criteria/binary_criteria.hpp" #include "matador/query/criteria/collection_criteria.hpp" +#include "matador/query/intermediates/fetchable_query.hpp" #include "matador/utils/placeholder.hpp" #include "matador/utils/value.hpp" @@ -17,12 +18,14 @@ namespace matador::query { class table_column; template -criteria_ptr operator==(const table_column &col, Type val) { +std::enable_if_t>, criteria_ptr> +operator==(const table_column &col, Type val) { return std::make_unique(col, binary_operator::EQUALS, utils::value(val)); } template -criteria_ptr operator!=(const table_column &col, Type val) { +std::enable_if_t>, criteria_ptr> +operator!=(const table_column &col, Type val) { return std::make_unique(col, binary_operator::NOT_EQUALS, utils::value(val)); } @@ -81,7 +84,7 @@ criteria_ptr in(const table_column &col, std::initializer_list args) { template <> criteria_ptr in(const table_column &col, std::initializer_list args); -criteria_ptr in(const table_column &col, sql::query_context &&ctx); +criteria_ptr in(const table_column &col, fetchable_query &&q); template < class Type > criteria_ptr out(const table_column &col, std::initializer_list args) { @@ -94,8 +97,7 @@ criteria_ptr out(const table_column &col, std::initializer_list args) { template <> criteria_ptr out(const table_column &col, std::initializer_list args); - -criteria_ptr out(const table_column &col, sql::query_context &&ctx); +criteria_ptr out(const table_column &col, fetchable_query &&q); criteria_ptr between(const table_column &col, int64_t min, int64_t max); criteria_ptr between(const table_column &col, utils::placeholder min, utils::placeholder max); diff --git a/include/matador/query/intermediates/fetchable_query.hpp b/include/matador/query/intermediates/fetchable_query.hpp index 3cc6264..0055b5c 100644 --- a/include/matador/query/intermediates/fetchable_query.hpp +++ b/include/matador/query/intermediates/fetchable_query.hpp @@ -1,11 +1,9 @@ #ifndef FETCHABLE_QUERY_HPP #define FETCHABLE_QUERY_HPP -#include "query_intermediate.hpp" +#include "matador/query/intermediates/query_intermediate.hpp" -#include "matador/query/query_compiler.hpp" #include "matador/sql/executor.hpp" - #include "matador/sql/query_result.hpp" #include "matador/sql/query_record_result.hpp" #include "matador/sql/record.hpp" @@ -81,6 +79,7 @@ public: [[nodiscard]] utils::result prepare(sql::executor &exec) const; [[nodiscard]] std::string str(const sql::executor &exec) const; + [[nodiscard]] std::string str(const sql::dialect &d) const; [[nodiscard]] sql::query_context compile(const sql::dialect &d) const; private: diff --git a/include/matador/query/intermediates/query_alter_table_intermediate.hpp b/include/matador/query/intermediates/query_alter_table_intermediate.hpp index 0762ebf..3f281c6 100644 --- a/include/matador/query/intermediates/query_alter_table_intermediate.hpp +++ b/include/matador/query/intermediates/query_alter_table_intermediate.hpp @@ -3,7 +3,8 @@ #include "matador/query/intermediates/executable_query.hpp" #include "matador/query/intermediates/query_intermediate.hpp" -#include "matador/query/table_constraint.hpp" +#include "matador/query/table_column.hpp" +#include "matador/query/table.hpp" #include "matador/object/restriction.hpp" diff --git a/include/matador/query/intermediates/query_create_intermediate.hpp b/include/matador/query/intermediates/query_create_intermediate.hpp index ebb99d7..0db55e9 100644 --- a/include/matador/query/intermediates/query_create_intermediate.hpp +++ b/include/matador/query/intermediates/query_create_intermediate.hpp @@ -6,6 +6,7 @@ #include "matador/query/intermediates/executable_query.hpp" #include "matador/query/table_constraint.hpp" +#include "matador/query/table_column.hpp" #include "matador/object/attribute.hpp" #include "matador/object/restriction.hpp" @@ -13,7 +14,7 @@ #include namespace matador::query { - +class table; class query_create_table_columns_intermediate : public executable_query { public: using executable_query::executable_query; diff --git a/include/matador/query/intermediates/query_delete_intermediate.hpp b/include/matador/query/intermediates/query_delete_intermediate.hpp index c46338e..6ddeac9 100644 --- a/include/matador/query/intermediates/query_delete_intermediate.hpp +++ b/include/matador/query/intermediates/query_delete_intermediate.hpp @@ -3,6 +3,8 @@ #include "matador/query/intermediates/query_intermediate.hpp" +#include "matador/query/table.hpp" + namespace matador::query { class query_delete_from_intermediate; diff --git a/include/matador/query/intermediates/query_drop_intermediate.hpp b/include/matador/query/intermediates/query_drop_intermediate.hpp index 6beaaae..dd560ca 100644 --- a/include/matador/query/intermediates/query_drop_intermediate.hpp +++ b/include/matador/query/intermediates/query_drop_intermediate.hpp @@ -4,13 +4,14 @@ #include "matador/query/intermediates/executable_query.hpp" namespace matador::query { +class table; class query_drop_intermediate : query_intermediate { public: query_drop_intermediate(); executable_query table(const table &tab); - executable_query schema(const std::string &schema_name); + // executable_query schema(const std::string &schema_name); }; } diff --git a/include/matador/query/intermediates/query_execute_where_intermediate.hpp b/include/matador/query/intermediates/query_execute_where_intermediate.hpp index 1029401..6168f7b 100644 --- a/include/matador/query/intermediates/query_execute_where_intermediate.hpp +++ b/include/matador/query/intermediates/query_execute_where_intermediate.hpp @@ -5,6 +5,7 @@ namespace matador::query { +class table_column; class query_execute_limit_intermediate; class query_execute_order_by_intermediate; diff --git a/include/matador/query/intermediates/query_group_by_intermediate.hpp b/include/matador/query/intermediates/query_group_by_intermediate.hpp index ea5d901..2599891 100644 --- a/include/matador/query/intermediates/query_group_by_intermediate.hpp +++ b/include/matador/query/intermediates/query_group_by_intermediate.hpp @@ -2,6 +2,7 @@ #define QUERY_GROUP_BY_INTERMEDIATE_HPP #include "matador/query/intermediates/fetchable_query.hpp" +#include "matador/query/table_column.hpp" namespace matador::query { diff --git a/include/matador/query/intermediates/query_intermediate.hpp b/include/matador/query/intermediates/query_intermediate.hpp index 9cee133..29cfe08 100644 --- a/include/matador/query/intermediates/query_intermediate.hpp +++ b/include/matador/query/intermediates/query_intermediate.hpp @@ -1,16 +1,17 @@ #ifndef QUERY_INTERMEDIATE_HPP #define QUERY_INTERMEDIATE_HPP -#include "matador/query/query_data.hpp" +// #include "matador/query/query_data.hpp" #include namespace matador::query { +struct query_data; class query_intermediate { public: query_intermediate(); - query_intermediate(const std::shared_ptr &context); // NOLINT(*-explicit-constructor) + query_intermediate(const std::shared_ptr &context); // NOLINT(*-explicit-constructor) protected: std::shared_ptr context_; diff --git a/include/matador/query/intermediates/query_select_intermediate.hpp b/include/matador/query/intermediates/query_select_intermediate.hpp index d697b0f..6beba5a 100644 --- a/include/matador/query/intermediates/query_select_intermediate.hpp +++ b/include/matador/query/intermediates/query_select_intermediate.hpp @@ -2,6 +2,11 @@ #define QUERY_SELECT_INTERMEDIATE_HPP #include "matador/query/intermediates/query_intermediate.hpp" +#include "matador/query/intermediates/query_from_intermediate.hpp" + +#include "matador/query/table_column.hpp" + +#include namespace matador::query { @@ -12,7 +17,14 @@ class query_select_intermediate : public query_intermediate public: explicit query_select_intermediate(const std::vector& columns); - query_from_intermediate from(const table& t); + template + query_from_intermediate from(const Tables&... tables) { + std::vector v { tables... }; + return from(v); + } + +private: + query_from_intermediate from(const std::vector
& tables); }; } diff --git a/include/matador/query/intermediates/query_where_intermediate.hpp b/include/matador/query/intermediates/query_where_intermediate.hpp index d2720e7..966e924 100644 --- a/include/matador/query/intermediates/query_where_intermediate.hpp +++ b/include/matador/query/intermediates/query_where_intermediate.hpp @@ -2,6 +2,7 @@ #define QUERY_WHERE_INTERMEDIATE_HPP #include "matador/query/intermediates/fetchable_query.hpp" +#include "matador/query/table_column.hpp" namespace matador::query { diff --git a/include/matador/query/internal/query_parts.hpp b/include/matador/query/internal/query_parts.hpp index 11bce9f..59fb64e 100644 --- a/include/matador/query/internal/query_parts.hpp +++ b/include/matador/query/internal/query_parts.hpp @@ -132,15 +132,15 @@ private: class query_from_part final : public query_part { public: - explicit query_from_part(class table tab); + explicit query_from_part(std::vector
tables); - [[nodiscard]] const class table& table() const; + [[nodiscard]] const std::vector
& tables() const; private: void accept(query_part_visitor &visitor) override; private: - class table table_; + std::vector
tables_; }; class query_join_part final : public query_part diff --git a/include/matador/query/query_compiler.hpp b/include/matador/query/query_compiler.hpp index ce885b4..ec0e814 100644 --- a/include/matador/query/query_compiler.hpp +++ b/include/matador/query/query_compiler.hpp @@ -77,6 +77,7 @@ protected: void visit(internal::query_drop_schema_part& part) override; static std::string build_table_name(sql::dialect_token token, const sql::dialect &d, const table& t); + static std::string build_table_name(const sql::dialect &d, const table& t); static std::string determine_value(value_visitor &visitor, const std::variant &val); [[nodiscard]] std::string build_add_constraint_string(const table_constraint& c) const; diff --git a/include/matador/query/table.hpp b/include/matador/query/table.hpp index 0778932..c853066 100644 --- a/include/matador/query/table.hpp +++ b/include/matador/query/table.hpp @@ -54,7 +54,7 @@ private: table operator ""_tab(const char *name, size_t len); -template +template class typed_table : public table { public: using table::table; diff --git a/source/orm/query/criteria/binary_criteria.cpp b/source/orm/query/criteria/binary_criteria.cpp index 6bc9b7f..4014d7e 100644 --- a/source/orm/query/criteria/binary_criteria.cpp +++ b/source/orm/query/criteria/binary_criteria.cpp @@ -1,7 +1,11 @@ +#include + #include "matador/query/criteria/binary_criteria.hpp" #include "matador/query/criteria/criteria_visitor.hpp" +#include "matador/query/intermediates/fetchable_query.hpp" + namespace matador::query { binary_criteria::binary_criteria(const table_column& col, const binary_operator operand, criteria_value value) : abstract_column_criteria(col) @@ -21,10 +25,10 @@ const criteria_value& binary_criteria::value() const { return value_; } -binary_column_criteria::binary_column_criteria(const table_column& left_column, const binary_operator operand, const table_column& right_column) -: left_column_(left_column) +binary_column_criteria::binary_column_criteria(table_column left_column, const binary_operator operand, table_column right_column) +: left_column_(std::move(left_column)) , operator_(operand) -, right_column_(right_column){} +, right_column_(std::move(right_column)){} void binary_column_criteria::accept(criteria_visitor& visitor) const { visitor.visit(*this); diff --git a/source/orm/query/criteria/collection_criteria.cpp b/source/orm/query/criteria/collection_criteria.cpp index b28be1f..9aabf62 100644 --- a/source/orm/query/criteria/collection_criteria.cpp +++ b/source/orm/query/criteria/collection_criteria.cpp @@ -28,7 +28,7 @@ const std::vector& collection_criteria::values() const { return values_; } -collection_query_criteria::collection_query_criteria(const table_column& col, collection_operator operand_, sql::query_context ctx) +collection_query_criteria::collection_query_criteria(const table_column& col, const collection_operator operand_, fetchable_query ctx) : abstract_column_criteria(col) , operand_(operand_) , query_context_(std::move(ctx)){ @@ -42,7 +42,7 @@ collection_operator collection_query_criteria::operand() const { return operand_; } -const sql::query_context & collection_query_criteria::context() const { +const fetchable_query& collection_query_criteria::query() const { return query_context_; } } diff --git a/source/orm/query/criteria/criteria_operators.cpp b/source/orm/query/criteria/criteria_operators.cpp index c36d513..94c45cf 100644 --- a/source/orm/query/criteria/criteria_operators.cpp +++ b/source/orm/query/criteria/criteria_operators.cpp @@ -90,8 +90,8 @@ criteria_ptr in(const table_column &col, const std::initializer_list(col, collection_operator::In, std::move(values)); } -criteria_ptr in(const table_column &col, sql::query_context &&ctx) { - return std::make_unique(col, collection_operator::In, std::move(ctx)); +criteria_ptr in(const table_column &col, fetchable_query &&q) { + return std::make_unique(col, collection_operator::In, std::move(q)); } template <> @@ -103,8 +103,8 @@ criteria_ptr out(const table_column &col, const std::initializer_list(col, collection_operator::Out, values); } -criteria_ptr out(const table_column &col, sql::query_context &&ctx) { - return std::make_unique(col, collection_operator::In, std::move(ctx)); +criteria_ptr out(const table_column &col, fetchable_query &&q) { + return std::make_unique(col, collection_operator::In, std::move(q)); } criteria_ptr between(const table_column &col, const int64_t min, const int64_t max) { diff --git a/source/orm/query/criteria_evaluator.cpp b/source/orm/query/criteria_evaluator.cpp index 6543c13..7d8ffd2 100644 --- a/source/orm/query/criteria_evaluator.cpp +++ b/source/orm/query/criteria_evaluator.cpp @@ -88,7 +88,7 @@ void criteria_evaluator::visit(const collection_criteria &node) { void criteria_evaluator::visit(const collection_query_criteria &node) { clause_ += prepare_identifier(dialect_, node.col()) + (node.operand() == collection_operator::Out ? " " + dialect_.token_at(sql::dialect_token::Not) + " " : " ") + - dialect_.token_at(sql::dialect_token::In) + " (" +node.context().sql + ")"; + dialect_.token_at(sql::dialect_token::In) + " (" + node.query().str( dialect_ ) + ")"; } void criteria_evaluator::visit(const like_criteria &node) { diff --git a/source/orm/query/intermediates/fetchable_query.cpp b/source/orm/query/intermediates/fetchable_query.cpp index 61a0390..ccd4cc1 100644 --- a/source/orm/query/intermediates/fetchable_query.cpp +++ b/source/orm/query/intermediates/fetchable_query.cpp @@ -1,5 +1,7 @@ #include "matador/query/intermediates/fetchable_query.hpp" +#include "matador/query/query_compiler.hpp" + #include "matador/sql/executor.hpp" #include "matador/sql/field.hpp" #include "matador/sql/statement.hpp" @@ -54,7 +56,10 @@ utils::result, utils::error> fetchable_query::fetch_o } std::string fetchable_query::str(const sql::executor &exec) const { - return exec.str(compile(exec.dialect())); + return str(exec.dialect()); +} +std::string fetchable_query::str(const sql::dialect &d) const { + return compile(d).sql; } sql::query_context fetchable_query::compile(const sql::dialect &d) const { diff --git a/source/orm/query/intermediates/query_alter_intermediate.cpp b/source/orm/query/intermediates/query_alter_intermediate.cpp index cc901a8..e4b08b1 100644 --- a/source/orm/query/intermediates/query_alter_intermediate.cpp +++ b/source/orm/query/intermediates/query_alter_intermediate.cpp @@ -1,6 +1,7 @@ #include "matador/query/intermediates/query_alter_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { query_alter_intermediate::query_alter_intermediate() { diff --git a/source/orm/query/intermediates/query_alter_table_intermediate.cpp b/source/orm/query/intermediates/query_alter_table_intermediate.cpp index ebe0423..677b4f4 100644 --- a/source/orm/query/intermediates/query_alter_table_intermediate.cpp +++ b/source/orm/query/intermediates/query_alter_table_intermediate.cpp @@ -2,6 +2,7 @@ #include "matador/object/object.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { executable_query query_add_foreign_key_constraint_intermediate::references( const table& tab, const std::vector& columns) { diff --git a/source/orm/query/intermediates/query_create_intermediate.cpp b/source/orm/query/intermediates/query_create_intermediate.cpp index 9a76c1c..d7567a5 100644 --- a/source/orm/query/intermediates/query_create_intermediate.cpp +++ b/source/orm/query/intermediates/query_create_intermediate.cpp @@ -1,8 +1,8 @@ #include "matador/query/intermediates/query_create_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" - #include "matador/query/table_constraint.hpp" +#include "matador/query/query_data.hpp" #include "matador/object/object.hpp" diff --git a/source/orm/query/intermediates/query_delete_from_intermediate.cpp b/source/orm/query/intermediates/query_delete_from_intermediate.cpp index 21982bb..65ea630 100644 --- a/source/orm/query/intermediates/query_delete_from_intermediate.cpp +++ b/source/orm/query/intermediates/query_delete_from_intermediate.cpp @@ -1,6 +1,7 @@ #include "matador/query/intermediates/query_delete_from_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { diff --git a/source/orm/query/intermediates/query_delete_intermediate.cpp b/source/orm/query/intermediates/query_delete_intermediate.cpp index f7da22a..886c3a2 100644 --- a/source/orm/query/intermediates/query_delete_intermediate.cpp +++ b/source/orm/query/intermediates/query_delete_intermediate.cpp @@ -3,6 +3,7 @@ #include "matador/query/intermediates/query_delete_from_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { diff --git a/source/orm/query/intermediates/query_drop_intermediate.cpp b/source/orm/query/intermediates/query_drop_intermediate.cpp index d3f633c..696e9ca 100644 --- a/source/orm/query/intermediates/query_drop_intermediate.cpp +++ b/source/orm/query/intermediates/query_drop_intermediate.cpp @@ -2,6 +2,8 @@ #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" + namespace matador::query { query_drop_intermediate::query_drop_intermediate() { diff --git a/source/orm/query/intermediates/query_execute_limit_intermediate.cpp b/source/orm/query/intermediates/query_execute_limit_intermediate.cpp index 251f3e1..813690d 100644 --- a/source/orm/query/intermediates/query_execute_limit_intermediate.cpp +++ b/source/orm/query/intermediates/query_execute_limit_intermediate.cpp @@ -2,6 +2,7 @@ #include "matador/query/intermediates/query_execute_offset_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { diff --git a/source/orm/query/intermediates/query_execute_offset_intermediate.cpp b/source/orm/query/intermediates/query_execute_offset_intermediate.cpp index 07575e5..0896583 100644 --- a/source/orm/query/intermediates/query_execute_offset_intermediate.cpp +++ b/source/orm/query/intermediates/query_execute_offset_intermediate.cpp @@ -2,6 +2,7 @@ #include "matador/query/intermediates/query_execute_limit_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { query_execute_limit_intermediate query_execute_offset_intermediate::limit(size_t limit) { diff --git a/source/orm/query/intermediates/query_execute_order_by_intermediate.cpp b/source/orm/query/intermediates/query_execute_order_by_intermediate.cpp index 3106eef..6fa4ba7 100644 --- a/source/orm/query/intermediates/query_execute_order_by_intermediate.cpp +++ b/source/orm/query/intermediates/query_execute_order_by_intermediate.cpp @@ -2,6 +2,7 @@ #include "matador/query/intermediates/query_execute_order_direction_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { diff --git a/source/orm/query/intermediates/query_execute_order_direction_intermediate.cpp b/source/orm/query/intermediates/query_execute_order_direction_intermediate.cpp index 28227e5..6ed704a 100644 --- a/source/orm/query/intermediates/query_execute_order_direction_intermediate.cpp +++ b/source/orm/query/intermediates/query_execute_order_direction_intermediate.cpp @@ -2,6 +2,7 @@ #include "matador/query/intermediates/query_execute_limit_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { diff --git a/source/orm/query/intermediates/query_execute_where_intermediate.cpp b/source/orm/query/intermediates/query_execute_where_intermediate.cpp index 6a138a1..3827587 100644 --- a/source/orm/query/intermediates/query_execute_where_intermediate.cpp +++ b/source/orm/query/intermediates/query_execute_where_intermediate.cpp @@ -5,6 +5,8 @@ #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" + namespace matador::query { query_execute_limit_intermediate query_execute_where_intermediate::limit(size_t limit) { diff --git a/source/orm/query/intermediates/query_from_intermediate.cpp b/source/orm/query/intermediates/query_from_intermediate.cpp index 916884a..08fd85c 100644 --- a/source/orm/query/intermediates/query_from_intermediate.cpp +++ b/source/orm/query/intermediates/query_from_intermediate.cpp @@ -5,6 +5,7 @@ #include "matador/query/intermediates/query_order_by_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { diff --git a/source/orm/query/intermediates/query_group_by_intermediate.cpp b/source/orm/query/intermediates/query_group_by_intermediate.cpp index f0f2998..72a9c11 100644 --- a/source/orm/query/intermediates/query_group_by_intermediate.cpp +++ b/source/orm/query/intermediates/query_group_by_intermediate.cpp @@ -2,6 +2,7 @@ #include "matador/query/intermediates/query_order_by_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { diff --git a/source/orm/query/intermediates/query_insert_intermediate.cpp b/source/orm/query/intermediates/query_insert_intermediate.cpp index 0cd31da..7061f6d 100644 --- a/source/orm/query/intermediates/query_insert_intermediate.cpp +++ b/source/orm/query/intermediates/query_insert_intermediate.cpp @@ -3,6 +3,7 @@ #include "matador/query/intermediates/query_into_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { diff --git a/source/orm/query/intermediates/query_intermediate.cpp b/source/orm/query/intermediates/query_intermediate.cpp index 2c3d100..49c5268 100644 --- a/source/orm/query/intermediates/query_intermediate.cpp +++ b/source/orm/query/intermediates/query_intermediate.cpp @@ -1,5 +1,7 @@ #include "matador/query/intermediates/query_intermediate.hpp" +#include "matador/query/query_data.hpp" + namespace matador::query { query_intermediate::query_intermediate() diff --git a/source/orm/query/intermediates/query_into_intermediate.cpp b/source/orm/query/intermediates/query_into_intermediate.cpp index 71f28ad..0f4a675 100644 --- a/source/orm/query/intermediates/query_into_intermediate.cpp +++ b/source/orm/query/intermediates/query_into_intermediate.cpp @@ -1,6 +1,7 @@ #include "matador/query/intermediates/query_into_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { diff --git a/source/orm/query/intermediates/query_join_intermediate.cpp b/source/orm/query/intermediates/query_join_intermediate.cpp index 266bd4d..2cf835f 100644 --- a/source/orm/query/intermediates/query_join_intermediate.cpp +++ b/source/orm/query/intermediates/query_join_intermediate.cpp @@ -1,6 +1,7 @@ #include "matador/query/intermediates/query_join_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { diff --git a/source/orm/query/intermediates/query_limit_intermediate.cpp b/source/orm/query/intermediates/query_limit_intermediate.cpp index 973302d..abc2024 100644 --- a/source/orm/query/intermediates/query_limit_intermediate.cpp +++ b/source/orm/query/intermediates/query_limit_intermediate.cpp @@ -1,6 +1,7 @@ #include "matador/query/intermediates/query_limit_intermediate.hpp" #include "matador/query/intermediates/query_offset_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { diff --git a/source/orm/query/intermediates/query_offset_intermediate.cpp b/source/orm/query/intermediates/query_offset_intermediate.cpp index e66104b..9410dc6 100644 --- a/source/orm/query/intermediates/query_offset_intermediate.cpp +++ b/source/orm/query/intermediates/query_offset_intermediate.cpp @@ -1,6 +1,7 @@ #include "matador/query/intermediates/query_offset_intermediate.hpp" #include "matador/query/intermediates/query_limit_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { diff --git a/source/orm/query/intermediates/query_order_by_intermediate.cpp b/source/orm/query/intermediates/query_order_by_intermediate.cpp index 0dfd528..38d723a 100644 --- a/source/orm/query/intermediates/query_order_by_intermediate.cpp +++ b/source/orm/query/intermediates/query_order_by_intermediate.cpp @@ -2,6 +2,7 @@ #include "matador/query/intermediates/query_order_direction_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { diff --git a/source/orm/query/intermediates/query_order_direction_intermediate.cpp b/source/orm/query/intermediates/query_order_direction_intermediate.cpp index b685ce6..9af3b70 100644 --- a/source/orm/query/intermediates/query_order_direction_intermediate.cpp +++ b/source/orm/query/intermediates/query_order_direction_intermediate.cpp @@ -2,6 +2,7 @@ #include "matador/query/intermediates/query_limit_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { diff --git a/source/orm/query/intermediates/query_select_intermediate.cpp b/source/orm/query/intermediates/query_select_intermediate.cpp index 80ea5db..e251b00 100644 --- a/source/orm/query/intermediates/query_select_intermediate.cpp +++ b/source/orm/query/intermediates/query_select_intermediate.cpp @@ -3,6 +3,7 @@ #include "matador/query/intermediates/query_join_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { @@ -10,10 +11,15 @@ query_select_intermediate::query_select_intermediate(const std::vectorparts.push_back(std::make_unique(columns)); } -query_from_intermediate query_select_intermediate::from(const table& t) { - context_->parts.push_back(std::make_unique(t)); - context_->tables.insert({t.name(), t}); +// query_from_intermediate query_select_intermediate::from(const table& tab) { +// return from(std::vector{tab}); +// } +query_from_intermediate query_select_intermediate::from(const std::vector
& tables) { + context_->parts.push_back(std::make_unique(tables)); + for (const auto& tab : tables) { + context_->tables.insert({tab.name(), tab}); + } + return {context_}; } - -} +} // namespace matador::query diff --git a/source/orm/query/intermediates/query_set_intermediate.cpp b/source/orm/query/intermediates/query_set_intermediate.cpp index ff3c8f0..b8dd516 100644 --- a/source/orm/query/intermediates/query_set_intermediate.cpp +++ b/source/orm/query/intermediates/query_set_intermediate.cpp @@ -1,6 +1,7 @@ #include "matador/query/intermediates/query_set_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { diff --git a/source/orm/query/intermediates/query_update_intermediate.cpp b/source/orm/query/intermediates/query_update_intermediate.cpp index de1ce46..dcfceb4 100644 --- a/source/orm/query/intermediates/query_update_intermediate.cpp +++ b/source/orm/query/intermediates/query_update_intermediate.cpp @@ -1,6 +1,7 @@ #include "matador/query/intermediates/query_update_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { diff --git a/source/orm/query/intermediates/query_where_intermediate.cpp b/source/orm/query/intermediates/query_where_intermediate.cpp index c2686d4..a9c791a 100644 --- a/source/orm/query/intermediates/query_where_intermediate.cpp +++ b/source/orm/query/intermediates/query_where_intermediate.cpp @@ -3,6 +3,7 @@ #include "matador/query/intermediates/query_order_by_intermediate.hpp" #include "matador/query/internal/query_parts.hpp" +#include "matador/query/query_data.hpp" namespace matador::query { query_group_by_intermediate query_where_intermediate::group_by(const table_column &column) { diff --git a/source/orm/query/internal/query_parts.cpp b/source/orm/query/internal/query_parts.cpp index 09e62d0..346571f 100644 --- a/source/orm/query/internal/query_parts.cpp +++ b/source/orm/query/internal/query_parts.cpp @@ -134,13 +134,13 @@ const std::vector &query_select_part::columns() const { return columns_; } -query_from_part::query_from_part(class table tab) +query_from_part::query_from_part(std::vector
tables) : query_part(sql::dialect_token::From) -, table_(std::move(tab)) { +, tables_(std::move(tables)) { } -const table &query_from_part::table() const { - return table_; +const std::vector
&query_from_part::tables() const { + return tables_; } void query_from_part::accept(query_part_visitor &visitor) { diff --git a/source/orm/query/query_compiler.cpp b/source/orm/query/query_compiler.cpp index 8ed6cec..58d374c 100644 --- a/source/orm/query/query_compiler.cpp +++ b/source/orm/query/query_compiler.cpp @@ -158,8 +158,20 @@ void query_compiler::visit(internal::query_select_part &part) { } void query_compiler::visit(internal::query_from_part &part) { - query_.table_name = part.table().name(); - query_.sql += " " + build_table_name(part.token(), *dialect_, part.table()); + query_.table_name = part.tables().front().name(); + query_.sql += " " + dialect_->from() + " "; + if (const auto &tables = part.tables(); tables.size() < 2) { + for (const auto &tab: tables) { + query_.sql += build_table_name(*dialect_, tab); + } + } else { + auto it = tables.begin(); + query_.sql.append(build_table_name(*dialect_, *it++)); + for (; it != tables.end(); ++it) { + query_.sql.append(", "); + query_.sql.append(build_table_name(*dialect_, *it)); + } + } } void query_compiler::visit(internal::query_join_part &part) { @@ -456,8 +468,11 @@ std::string build_constraint(const table_constraint& cons, const sql::dialect& d } std::string query_compiler::build_table_name(const sql::dialect_token token, const sql::dialect &d, const table& t) { - return d.token_at(token) + " " + - (!d.default_schema_name().empty() ? d.prepare_identifier_string(d.default_schema_name()) + "." : "") + + return d.token_at(token) + " " + build_table_name(d, t); +} + +std::string query_compiler::build_table_name(const sql::dialect &d, const table& t) { + return (!d.default_schema_name().empty() ? d.prepare_identifier_string(d.default_schema_name()) + "." : "") + d.prepare_identifier_string(t.table_name()) + (!t.has_alias() ? "" : " " + d.prepare_identifier_string(t.name())); }