From 76ad0952419146874497d16d443d68cd28c1acb1 Mon Sep 17 00:00:00 2001 From: silverqx Date: Tue, 18 Jan 2022 11:07:57 +0100 Subject: [PATCH] added Concerns::ExplainQueries It is not enabled because Qt sql driver doesn't support EXPLAIN queries. --- include/orm/concerns/explainqueries.hpp | 48 +++++++++++++++++++++++++ include/orm/tiny/tinybuilder.hpp | 11 ------ src/orm/concerns/explainqueries.cpp | 30 ++++++++++++++++ 3 files changed, 78 insertions(+), 11 deletions(-) create mode 100644 include/orm/concerns/explainqueries.hpp create mode 100644 src/orm/concerns/explainqueries.cpp diff --git a/include/orm/concerns/explainqueries.hpp b/include/orm/concerns/explainqueries.hpp new file mode 100644 index 000000000..a3745ac47 --- /dev/null +++ b/include/orm/concerns/explainqueries.hpp @@ -0,0 +1,48 @@ +#pragma once +#ifndef ORM_CONCERNS_EXPLAINQUERIES_HPP +#define ORM_CONCERNS_EXPLAINQUERIES_HPP + +#include "orm/macros/systemheader.hpp" +TINY_SYSTEM_HEADER + +#include + +#include "orm/macros/commonnamespace.hpp" +#include "orm/macros/export.hpp" + +TINYORM_BEGIN_COMMON_NAMESPACE + +namespace Orm +{ +namespace Query +{ + class Builder; +} + using QueryBuilder = Query::Builder; + +namespace Concerns +{ + + /*! Counts the number of executed queries and the elapsed time of queries. */ + class SHAREDLIB_EXPORT ExplainQueries + { + public: + /*! Default constructor. */ + inline ExplainQueries() = default; + /*! Virtual destructor. */ + inline virtual ~ExplainQueries() = default; + + /*! Explains the query. */ + QSqlQuery explain(); + + private: + /*! Dynamic cast *this to the QueryBuilder & derived type. */ + QueryBuilder &builder(); + }; + +} // namespace Concerns +} // namespace Orm + +TINYORM_END_COMMON_NAMESPACE + +#endif // ORM_CONCERNS_EXPLAINQUERIES_HPP diff --git a/include/orm/tiny/tinybuilder.hpp b/include/orm/tiny/tinybuilder.hpp index a087d602a..b7f34fd16 100644 --- a/include/orm/tiny/tinybuilder.hpp +++ b/include/orm/tiny/tinybuilder.hpp @@ -163,9 +163,6 @@ namespace Orm::Tiny // FUTURE add Query Scopes feature silverqx // { return $this->applyScopes()->getQuery(); } - /*! Explains the query. */ -// QSqlQuery explain() const; - /*! Qualify the given column name by the model's table. */ inline QString qualifyColumn(const QString &column) const; @@ -717,14 +714,6 @@ namespace Orm::Tiny return m_model.qualifyColumn(column); } - // BUG Qt sql driver does not support to call EXPLAIN as a prepared statement silverqx -// template -// QSqlQuery Builder::explain() const -// { -// return getConnection().select(QStringLiteral("EXPLAIN %1").arg(toSql()), -// getBindings()); -// } - template QVector Builder::parseWithRelations(const QVector &relations) diff --git a/src/orm/concerns/explainqueries.cpp b/src/orm/concerns/explainqueries.cpp new file mode 100644 index 000000000..b30eb986d --- /dev/null +++ b/src/orm/concerns/explainqueries.cpp @@ -0,0 +1,30 @@ +#include "orm/concerns/explainqueries.hpp" + +#include "orm/databaseconnection.hpp" +#include "orm/query/querybuilder.hpp" + +TINYORM_BEGIN_COMMON_NAMESPACE + +namespace Orm::Concerns +{ + +/* public */ + +// BUG Qt sql driver does not support to call EXPLAIN as a prepared statement, look at enum StatementType and QSqlDriver::sqlStatement in qsqldriver.h/cpp, also don't forget to add proxies when Qt will support EXPLAIN queries silverqx +QSqlQuery ExplainQueries::explain() +{ + return builder().getConnection().select( + QStringLiteral("EXPLAIN %1").arg(builder().toSql()), + builder().getBindings()); +} + +/* private */ + +QueryBuilder &ExplainQueries::builder() +{ + return dynamic_cast(*this); +} + +} // namespace Orm::Concerns + +TINYORM_END_COMMON_NAMESPACE