Also switched explain over to own async framework.

This commit is contained in:
Eelke Klein 2016-12-30 10:38:46 +01:00
parent 4dc55288b5
commit c551d982c6
6 changed files with 17 additions and 17 deletions

View file

@ -51,9 +51,9 @@ namespace {
} // END of unnamed namespace } // END of unnamed namespace
std::unique_ptr<ExplainRoot> ExplainRoot::createFromJson(Json::Value &json) ExplainRoot::SPtr ExplainRoot::createFromJson(Json::Value &json)
{ {
auto res = std::make_unique<ExplainRoot>(); auto res = std::make_shared<ExplainRoot>();
// Explain always seems to be an array with one element // Explain always seems to be an array with one element
if (json.isArray()) { if (json.isArray()) {
if (json.size() > 0) { if (json.size() > 0) {

View file

@ -128,7 +128,8 @@ private:
class ExplainRoot { class ExplainRoot {
public: public:
static std::unique_ptr<ExplainRoot> createFromJson(Json::Value &json); using SPtr = std::shared_ptr<ExplainRoot>;
static SPtr createFromJson(Json::Value &json);
ExplainTreeModelItemPtr plan; ExplainTreeModelItemPtr plan;
float planningTime = 0.f; float planningTime = 0.f;

View file

@ -213,9 +213,10 @@ void MainWindow::performExplain()
QString command = "EXPLAIN (ANALYZE, VERBOSE, BUFFERS, FORMAT JSON) "; QString command = "EXPLAIN (ANALYZE, VERBOSE, BUFFERS, FORMAT JSON) ";
command += ui->queryEdit->toPlainText(); command += ui->queryEdit->toPlainText();
explainFuture = std::async(std::launch::async, [this,command]()-> std::unique_ptr<ExplainRoot> // explainFuture = std::async(std::launch::async, [this,command]()-> std::unique_ptr<ExplainRoot>
std::thread([this,command]()
{ {
std::unique_ptr<ExplainRoot> explain; std::shared_ptr<ExplainRoot> explain;
auto res = connection->query(command); auto res = connection->query(command);
if (res.getCols() == 1 && res.getRows() == 1) { if (res.getCols() == 1 && res.getRows() == 1) {
std::string s = res.getVal(0, 0); std::string s = res.getVal(0, 0);
@ -226,16 +227,14 @@ void MainWindow::performExplain()
explain = ExplainRoot::createFromJson(root); explain = ExplainRoot::createFromJson(root);
} }
} }
QMetaObject::invokeMethod(this, "explain_ready", Qt::QueuedConnection); // queues on main thread QueueTask([this, explain]() { explain_ready(explain); });
return explain; }).detach();
});
} }
void MainWindow::explain_ready() void MainWindow::explain_ready(ExplainRoot::SPtr explain)
{ {
std::unique_ptr<ExplainRoot> explain(explainFuture.get());
if (explain) { if (explain) {
explainModel.reset(new QueryExplainModel(nullptr, std::move(explain))); explainModel.reset(new QueryExplainModel(nullptr, explain));
ui->explainTreeView->setModel(explainModel.get()); ui->explainTreeView->setModel(explainModel.get());
ui->explainTreeView->expandAll(); ui->explainTreeView->expandAll();
ui->explainTreeView->setColumnWidth(0, 200); ui->explainTreeView->setColumnWidth(0, 200);

View file

@ -60,7 +60,7 @@ private:
std::unique_ptr<QueryExplainModel> explainModel; std::unique_ptr<QueryExplainModel> explainModel;
Pgsql::Canceller queryCancel; Pgsql::Canceller queryCancel;
std::future<std::unique_ptr<ExplainRoot>> explainFuture;
struct { struct {
std::unique_ptr<QSocketNotifier> notifier; std::unique_ptr<QSocketNotifier> notifier;
@ -74,6 +74,7 @@ private:
void processNotice(const PGresult *result); void processNotice(const PGresult *result);
void query_ready(Pgsql::Result res); void query_ready(Pgsql::Result res);
void explain_ready(std::shared_ptr<ExplainRoot> explain);
private slots: private slots:
void startConnect(); void startConnect();
@ -81,7 +82,7 @@ private slots:
void performQuery(); void performQuery();
void performExplain(); void performExplain();
void socket_activate_connect(int socket); void socket_activate_connect(int socket);
void explain_ready();
void cancel_query(); void cancel_query();
void receiveNotice(Pgsql::ErrorDetails notice); void receiveNotice(Pgsql::ErrorDetails notice);

View file

@ -11,8 +11,7 @@ const int c_ColumnLoops = 5;
const int c_ColumnDetails = 6; const int c_ColumnDetails = 6;
const int c_NumberOfColumns = 7; const int c_NumberOfColumns = 7;
QueryExplainModel::QueryExplainModel(QObject *parent, QueryExplainModel::QueryExplainModel(QObject *parent, ExplainRoot::SPtr exp)
std::unique_ptr<ExplainRoot> exp)
: QAbstractItemModel(parent) : QAbstractItemModel(parent)
, explain(std::move(exp)) , explain(std::move(exp))
{} {}

View file

@ -8,7 +8,7 @@ class QueryExplainModel : public QAbstractItemModel
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit QueryExplainModel(QObject *parent, std::unique_ptr<ExplainRoot> exp); explicit QueryExplainModel(QObject *parent, ExplainRoot::SPtr exp);
QVariant data(const QModelIndex &index, int role) const override; QVariant data(const QModelIndex &index, int role) const override;
@ -27,5 +27,5 @@ public:
int columnCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override;
private: private:
std::unique_ptr<ExplainRoot> explain; ExplainRoot::SPtr explain;
}; };