diff --git a/include/matador/query/query_builder.hpp b/include/matador/query/query_builder.hpp index 56e69aa..8957be5 100644 --- a/include/matador/query/query_builder.hpp +++ b/include/matador/query/query_builder.hpp @@ -29,9 +29,9 @@ struct value_visitor; class query_builder final : public query_part_visitor { public: - sql::query_context compile(const query_data &data, - const sql::dialect &d, - std::optional> conn); + sql::query_context build(const query_data &data, + const sql::dialect &d, + std::optional> conn); protected: void visit(internal::query_alter_part& part) override; diff --git a/include/matador/sql/query_context.hpp b/include/matador/sql/query_context.hpp index d788cb5..4e6fe34 100644 --- a/include/matador/sql/query_context.hpp +++ b/include/matador/sql/query_context.hpp @@ -37,6 +37,7 @@ enum class return_mode { struct query_context { std::string sql; + size_t sql_hash{}; sql_command command{}; std::string command_name{}; std::string schema_name{}; diff --git a/source/orm/query/intermediates/executable_query.cpp b/source/orm/query/intermediates/executable_query.cpp index f1430dc..98c3795 100644 --- a/source/orm/query/intermediates/executable_query.cpp +++ b/source/orm/query/intermediates/executable_query.cpp @@ -9,22 +9,22 @@ namespace matador::query { utils::result executable_query::execute(const sql::executor &exec) const { query_builder compiler; - return exec.execute(compiler.compile(*context_, exec.dialect(), std::nullopt)); + return exec.execute(compiler.build(*context_, exec.dialect(), std::nullopt)); } utils::result executable_query::prepare(sql::executor &exec) const { query_builder compiler; - return exec.prepare(compiler.compile(*context_, exec.dialect(), std::nullopt)); + return exec.prepare(compiler.build(*context_, exec.dialect(), std::nullopt)); } sql::query_context executable_query::compile( const sql::executor& exec ) const { query_builder compiler; - return compiler.compile(*context_, exec.dialect(), std::nullopt); + return compiler.build(*context_, exec.dialect(), std::nullopt); } std::string executable_query::str(const sql::executor &exec) const { query_builder compiler; - return exec.str(compiler.compile(*context_, exec.dialect(), std::nullopt)); + return exec.str(compiler.build(*context_, exec.dialect(), std::nullopt)); } } diff --git a/source/orm/query/intermediates/fetchable_query.cpp b/source/orm/query/intermediates/fetchable_query.cpp index d0e0df6..17af54f 100644 --- a/source/orm/query/intermediates/fetchable_query.cpp +++ b/source/orm/query/intermediates/fetchable_query.cpp @@ -27,7 +27,7 @@ sql::record *create_prototype(const std::vector &prototype) { } utils::result, utils::error> fetchable_query::fetch_all(const sql::executor &exec) const { query_builder compiler; - auto ctx = compiler.compile(*context_, exec.dialect(), std::nullopt); + auto ctx = compiler.build(*context_, exec.dialect(), std::nullopt); ctx.resolver = exec.resolver(); return exec.fetch(ctx) .and_then([](auto &&res) { @@ -38,7 +38,7 @@ utils::result, utils::error> fetchable_query::fet utils::result, utils::error> fetchable_query::fetch_one(const sql::executor &exec) const { query_builder compiler; - auto ctx = compiler.compile(*context_, exec.dialect(), std::nullopt); + auto ctx = compiler.build(*context_, exec.dialect(), std::nullopt); ctx.resolver = exec.resolver(); auto result = exec.fetch(ctx); if (!result.is_ok()) { @@ -64,7 +64,7 @@ std::string fetchable_query::str(const sql::dialect &d) const { sql::query_context fetchable_query::compile(const sql::dialect &d) const { query_builder compiler; - return compiler.compile(*context_, d, std::nullopt); + return compiler.build(*context_, d, std::nullopt); } utils::result, utils::error> fetchable_query::fetch(const sql::executor &exec, const std::type_index& index) const { diff --git a/source/orm/query/query_builder.cpp b/source/orm/query/query_builder.cpp index deef5b9..b768719 100644 --- a/source/orm/query/query_builder.cpp +++ b/source/orm/query/query_builder.cpp @@ -17,10 +17,9 @@ #include "matador/sql/dialect.hpp" namespace matador::query { -sql::query_context query_builder::compile(const query_data& data, - const sql::dialect& d, - const std::optional> - conn) { +sql::query_context query_builder::build(const query_data& data, + const sql::dialect& d, + const std::optional> conn) { data_ = &data; dialect_ = &d; connection_ = conn; @@ -33,6 +32,7 @@ sql::query_context query_builder::compile(const query_data& data, dialect_ = nullptr; data_ = nullptr; + query_.sql_hash = std::hash{}(query_.sql); return {query_}; } diff --git a/source/orm/sql/statement_cache.cpp b/source/orm/sql/statement_cache.cpp index 7df2a92..2584fec 100644 --- a/source/orm/sql/statement_cache.cpp +++ b/source/orm/sql/statement_cache.cpp @@ -151,10 +151,9 @@ statement_cache::statement_cache(utils::message_bus &bus, connection_pool &pool, utils::result statement_cache::acquire(const query_context& ctx) { std::unique_lock lock(mutex_); // hash statement - const auto key = std::hash{}(ctx.sql); const auto now = std::chrono::steady_clock::now(); // Found in cache. Move it to of the LRU list - if (const auto it = cache_map_.find(key); it != cache_map_.end()) { + if (const auto it = cache_map_.find(ctx.sql_hash); it != cache_map_.end()) { usage_list_.splice(usage_list_.begin(), usage_list_, it->second.position); it->second.last_access = now; bus_.publish({ctx.sql, std::chrono::steady_clock::now()}); @@ -181,9 +180,9 @@ utils::result statement_cache::acquire(const query_cont bus_.publish({ctx.sql, std::chrono::steady_clock::now()}); } - usage_list_.push_front(key); + usage_list_.push_front(ctx.sql_hash); const auto it = cache_map_.insert({ - key, + ctx.sql_hash, {statement{ std::make_shared(bus_, std::move(stmt), pool_, id)}, std::chrono::steady_clock::now(),