QSqlTableModel: deduplicate and optimize counting of inserts
authorMark Brand <mabrand@mabrand.nl>
Thu, 9 Feb 2012 14:33:43 +0000 (15:33 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 15 Feb 2012 01:36:17 +0000 (02:36 +0100)
Reading STL iteration code is painful enough if you only have
to do it once.
Thiago suggested remembering the end iterator for performance.

Change-Id: Ic2cdc480f591932ea420e692a4d2796d49f05313
Reviewed-by: Yunqiao Yin <charles.yin@nokia.com>
src/sql/models/qsqltablemodel.cpp
src/sql/models/qsqltablemodel_p.h

index ab87397..51c7170 100644 (file)
@@ -79,6 +79,21 @@ QString QSqlTableModelPrivate::strippedFieldName(const QString &name) const
     return fieldname;
 }
 
+int QSqlTableModelPrivate::insertCount(int maxRow) const
+{
+    int cnt = 0;
+    CacheMap::ConstIterator i = cache.constBegin();
+    const CacheMap::ConstIterator e = cache.constEnd();
+    for (;
+         i != e && (maxRow < 0 || i.key() <= maxRow);
+         ++i) {
+        if (i.value().op() == Insert)
+            ++cnt;
+    }
+
+    return cnt;
+}
+
 void QSqlTableModelPrivate::initRecordAndPrimaryIndex()
 {
     rec = db.record(tableName);
@@ -1091,13 +1106,7 @@ int QSqlTableModel::rowCount(const QModelIndex &parent) const
     if (parent.isValid())
         return 0;
 
-    int rc = QSqlQueryModel::rowCount();
-    for (QSqlTableModelPrivate::CacheMap::ConstIterator it = d->cache.constBegin();
-         it != d->cache.constEnd(); ++it) {
-         if (it.value().op() == QSqlTableModelPrivate::Insert)
-             ++rc;
-    }
-    return rc;
+    return QSqlQueryModel::rowCount() + d->insertCount();
 }
 
 /*!
@@ -1115,13 +1124,7 @@ int QSqlTableModel::rowCount(const QModelIndex &parent) const
 QModelIndex QSqlTableModel::indexInQuery(const QModelIndex &item) const
 {
     Q_D(const QSqlTableModel);
-    int rowOffset = 0;
-    QSqlTableModelPrivate::CacheMap::ConstIterator i = d->cache.constBegin();
-    while (i != d->cache.constEnd() && i.key() <= item.row()) {
-        if (i.value().op() == QSqlTableModelPrivate::Insert)
-            ++rowOffset;
-        ++i;
-    }
+    const int rowOffset = d->insertCount(item.row());
     return QSqlQueryModel::indexInQuery(createIndex(item.row() - rowOffset, item.column(), item.internalPointer()));
 }
 
index 8649a91..c2e4442 100644 (file)
@@ -79,6 +79,7 @@ public:
     virtual void revertCachedRow(int row);
     virtual int nameToIndex(const QString &name) const;
     QString strippedFieldName(const QString &name) const;
+    int insertCount(int maxRow = -1) const;
     void initRecordAndPrimaryIndex();
 
     QSqlDatabase db;