Skip to content

Commit

Permalink
Final touch
Browse files Browse the repository at this point in the history
  • Loading branch information
elpaso committed Jan 13, 2021
1 parent 322a925 commit 3c8bcc8
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 11 deletions.
13 changes: 6 additions & 7 deletions src/core/qgsqueryresultmodel.cpp
Expand Up @@ -23,12 +23,11 @@ QgsQueryResultModel::QgsQueryResultModel( const QgsAbstractDatabaseProviderConne
{
if ( mQueryResult.hasNextRow() )
{
mWorker = new ResultWorker( &mQueryResult );
mWorker = new QgsQueryResultFetcher( &mQueryResult );
mWorker->moveToThread( &mWorkerThread );
connect( &mWorkerThread, &QThread::finished, mWorker, &ResultWorker::stopFetching );
connect( &mWorkerThread, &QThread::finished, mWorker, &QObject::deleteLater );
connect( &mWorkerThread, &QThread::started, mWorker, &ResultWorker::fetchRows );
connect( mWorker, &ResultWorker::rowsReady, this, &QgsQueryResultModel::newRowsReady );
connect( &mWorkerThread, &QThread::started, mWorker, &QgsQueryResultFetcher::fetchRows );
connect( mWorker, &QgsQueryResultFetcher::rowsReady, this, &QgsQueryResultModel::newRowsReady );
mWorkerThread.start();
}
}
Expand Down Expand Up @@ -83,9 +82,9 @@ QVariant QgsQueryResultModel::data( const QModelIndex &index, int role ) const

///@cond private

const int ResultWorker::ROWS_TO_FETCH = 200;
const int QgsQueryResultFetcher::ROWS_TO_FETCH = 200;

void ResultWorker::fetchRows()
void QgsQueryResultFetcher::fetchRows()
{
qlonglong rowCount { 0 };
while ( mStopFetching == 0 )
Expand All @@ -107,7 +106,7 @@ void ResultWorker::fetchRows()
}
}

void ResultWorker::stopFetching()
void QgsQueryResultFetcher::stopFetching()
{
mStopFetching = 1;
}
Expand Down
12 changes: 8 additions & 4 deletions src/core/qgsqueryresultmodel.h
Expand Up @@ -29,24 +29,28 @@
#ifndef SIP_RUN

/**
* The ResultWorker class fetches query results from a separate thread
* The QgsQueryResultFetcher class fetches query results from a separate thread
*/
class ResultWorker: public QObject
class QgsQueryResultFetcher: public QObject
{
Q_OBJECT

public:

ResultWorker( const QgsAbstractDatabaseProviderConnection::QueryResult *queryResult )
//! Constructs a result fetcher from \a queryResult
QgsQueryResultFetcher( const QgsAbstractDatabaseProviderConnection::QueryResult *queryResult )
: mQueryResult( queryResult )
{}

//! Start fetching
void fetchRows();

//! Stop fetching
void stopFetching();

signals:

//! Emitted when \a newRowsCount has been fetched
void rowsReady( int newRowsCount );

private:
Expand Down Expand Up @@ -101,7 +105,7 @@ class CORE_EXPORT QgsQueryResultModel : public QAbstractListModel
QStringList mColumns;
qlonglong mRowCount = 0;
QThread mWorkerThread;
ResultWorker *mWorker = nullptr;
QgsQueryResultFetcher *mWorker = nullptr;

};

Expand Down
26 changes: 26 additions & 0 deletions tests/src/python/test_qgsqueryresultmodel.py
Expand Up @@ -22,6 +22,7 @@
)
from qgis.testing import unittest, start_app
from qgis.PyQt.QtCore import QCoreApplication, QVariant, Qt, QTimer
from qgis.PyQt.QtWidgets import QListView, QDialog, QVBoxLayout, QLabel


class TestPyQgsQgsQueryResultModel(unittest.TestCase):
Expand Down Expand Up @@ -138,6 +139,31 @@ def test_model_concurrency(self):
self.assertEqual(rows[i][0], i + 1)
self.assertEqual(model.data(model.index(i, 0), Qt.DisplayRole), i + 1)

@unittest.skipIf(os.environ.get('TRAVIS', '') == 'true', 'Local manual test: not for CI')
def test_widget(self):
"""Manual local GUI test for the model"""

d = QDialog()
l = QVBoxLayout(d)
d.setLayout(l)
lbl = QLabel('fetching...', d)
l.addWidget(lbl)
v = QListView()
l.addWidget(v)
d.show()
md = QgsProviderRegistry.instance().providerMetadata('postgres')
conn = md.createConnection(self.uri, {})
res = conn.execSql('SELECT * FROM qgis_test.random_big_data')
model = QgsQueryResultModel(res)
v.setModel(model)

def _set_row_count(idx, first, last):
lbl.setText('Rows %s fetched' % model.rowCount(model.index(-1)))

model.rowsInserted.connect(_set_row_count)

d.exec_()


if __name__ == '__main__':
unittest.main()

0 comments on commit 3c8bcc8

Please sign in to comment.