From 72256cf86fb5c8b2f568462ad6e5f0d738649be9 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 8 Jan 2016 00:17:16 +0100 Subject: [PATCH] refs #568, specialized lists (timestamp, DB objects, model list) * remaned to latest/oldestObject * JSON functions with prefix * remove by keys * only add models with model string to QStringList --- src/blackcore/airspacemonitor.cpp | 2 +- src/blackmisc/datastoreobjectlist.cpp | 67 +++++++++++++++++++ src/blackmisc/datastoreobjectlist.h | 19 +++++- src/blackmisc/datastoreutility.cpp | 4 +- .../simulation/aircraftmodellist.cpp | 6 +- src/blackmisc/timestampobjectlist.cpp | 16 ++--- src/blackmisc/timestampobjectlist.h | 4 +- 7 files changed, 100 insertions(+), 18 deletions(-) diff --git a/src/blackcore/airspacemonitor.cpp b/src/blackcore/airspacemonitor.cpp index c9ee2f3cc..9d3026a8f 100644 --- a/src/blackcore/airspacemonitor.cpp +++ b/src/blackcore/airspacemonitor.cpp @@ -1017,7 +1017,7 @@ namespace BlackCore auto history = this->m_situationsByCallsign[callsign]; if (history.empty()) { return; } // we need one full situation interimSituation.setCurrentUtcTime(); - interimSituation.setGroundspeed(history.latestValue().getGroundSpeed()); + interimSituation.setGroundspeed(history.latestObject().getGroundSpeed()); } // store situation history diff --git a/src/blackmisc/datastoreobjectlist.cpp b/src/blackmisc/datastoreobjectlist.cpp index d114f5184..e7c105539 100644 --- a/src/blackmisc/datastoreobjectlist.cpp +++ b/src/blackmisc/datastoreobjectlist.cpp @@ -46,6 +46,50 @@ namespace BlackMisc this->container().sort(BlackMisc::Predicates::MemberLess(&OBJ::getDbKey)); } + template + QList IDatastoreObjectListWithIntegerKey::toDbKeyList() const + { + QList keys; + for (const OBJ &obj : ITimestampObjectList::container()) + { + if (!obj.hasValidDbKey()) { continue; } + keys.append(obj.getDbKey()); + } + return keys; + } + + template + int IDatastoreObjectListWithIntegerKey::removeObjectsWithKeys(const QList &keys) + { + if (keys.isEmpty()) { return 0; } + if (this->container().isEmpty()) { return 0; } + CONTAINER newValues; + for (const OBJ &obj : ITimestampObjectList::container()) + { + if (keys.contains(obj.getDbKey())) { continue; } + newValues.push_back(obj); + } + int delta = this->container().size() - newValues.size(); + *this = newValues; + return delta; + } + + template + int IDatastoreObjectListWithStringKey::removeObjectsWithKeys(const QStringList &keys) + { + if (keys.isEmpty()) { return 0; } + if (this->container().isEmpty()) { return 0; } + CONTAINER newValues; + for (const OBJ &obj : ITimestampObjectList::container()) + { + if (keys.contains(obj.getDbKey(), Qt::CaseInsensitive)) { continue; } + newValues.push_back(obj); + } + int delta = this->container().size() - newValues.size(); + *this = newValues; + return delta; + } + template void IDatastoreObjectListWithStringKey::sortByKey() { @@ -58,6 +102,7 @@ namespace BlackMisc QStringList keys; for (const OBJ &obj : ITimestampObjectList::container()) { + if (!obj.hasValidDbKey()) { continue; } keys.append(obj.getDbKey()); } return keys; @@ -74,6 +119,17 @@ namespace BlackMisc return container; } + template + CONTAINER IDatastoreObjectListWithIntegerKey::fromDatabaseJson(const QJsonArray &array, const QString &prefix) + { + CONTAINER container; + for (const QJsonValue &value : array) + { + container.push_back(OBJ::fromDatabaseJson(value.toObject(), prefix)); + } + return container; + } + template CONTAINER IDatastoreObjectListWithStringKey::fromDatabaseJson(const QJsonArray &array) { @@ -85,6 +141,17 @@ namespace BlackMisc return container; } + template + CONTAINER IDatastoreObjectListWithStringKey::fromDatabaseJson(const QJsonArray &array, const QString &prefix) + { + CONTAINER container; + for (const QJsonValue &value : array) + { + container.push_back(OBJ::fromDatabaseJson(value.toObject(), prefix)); + } + return container; + } + // see here for the reason of thess forward instantiations // http://www.parashift.com/c++-faq/separate-template-class-defn-from-decl.html template class IDatastoreObjectListWithIntegerKey; diff --git a/src/blackmisc/datastoreobjectlist.h b/src/blackmisc/datastoreobjectlist.h index 6d0b9ccb2..b85eb5643 100644 --- a/src/blackmisc/datastoreobjectlist.h +++ b/src/blackmisc/datastoreobjectlist.h @@ -31,9 +31,18 @@ namespace BlackMisc //! Sort by timestamp void sortByKey(); - //! From DB JSON + //! All keys as list + QList toDbKeyList() const; + + //! Remove objects with key + int removeObjectsWithKeys(const QList &keys); + + //! From DB JSON with default prefixes static CONTAINER fromDatabaseJson(const QJsonArray &array); + //! From DB JSON + static CONTAINER fromDatabaseJson(const QJsonArray &array, const QString &prefix); + protected: //! Constructor IDatastoreObjectListWithIntegerKey(); @@ -53,9 +62,15 @@ namespace BlackMisc //! All keys as string list QStringList toDbKeyList() const; - //! From DB JSON + //! Remove objects with key + int removeObjectsWithKeys(const QStringList &keys); + + //! From DB JSON with default prefixes static CONTAINER fromDatabaseJson(const QJsonArray &array); + //! From DB JSON + static CONTAINER fromDatabaseJson(const QJsonArray &array, const QString &prefix); + protected: //! Constructor IDatastoreObjectListWithStringKey(); diff --git a/src/blackmisc/datastoreutility.cpp b/src/blackmisc/datastoreutility.cpp index 01712cbf4..c758aa6dc 100644 --- a/src/blackmisc/datastoreutility.cpp +++ b/src/blackmisc/datastoreutility.cpp @@ -109,7 +109,7 @@ namespace BlackMisc if (json.contains("publishedModels")) { QJsonValue publishedJson(json.take("publishedModels")); - CAircraftModelList published = CAircraftModelList::fromDatabaseJson(publishedJson.toArray()); + CAircraftModelList published = CAircraftModelList::fromDatabaseJson(publishedJson.toArray(), ""); if (!published.isEmpty()) { publishedModels.push_back(published); @@ -120,7 +120,7 @@ namespace BlackMisc if (json.contains("skippedModels")) { QJsonValue skippedJson(json.take("skippedModels")); - CAircraftModelList skipped = CAircraftModelList::fromDatabaseJson(skippedJson.toArray()); + CAircraftModelList skipped = CAircraftModelList::fromDatabaseJson(skippedJson.toArray(), ""); if (!skipped.isEmpty()) { skippedModels.push_back(skipped); diff --git a/src/blackmisc/simulation/aircraftmodellist.cpp b/src/blackmisc/simulation/aircraftmodellist.cpp index ad30ae2c6..d47ff0866 100644 --- a/src/blackmisc/simulation/aircraftmodellist.cpp +++ b/src/blackmisc/simulation/aircraftmodellist.cpp @@ -109,7 +109,7 @@ namespace BlackMisc int CAircraftModelList::removeModelsWithString(const QStringList &modelStrings, Qt::CaseSensitivity sensitivity) { int cs = this->size(); - (*this) = (findByNotInModelStrings(modelStrings, sensitivity)); + (*this) = (this->findByNotInModelStrings(modelStrings, sensitivity)); int d = cs - this->size(); return d; } @@ -134,7 +134,8 @@ namespace BlackMisc { return this->findBy([ = ](const CAircraftModel & model) { - return !modelStrings.contains(model.getModelString(), sensitivity); + const bool c = modelStrings.contains(model.getModelString(), sensitivity); + return !c; }); } @@ -143,6 +144,7 @@ namespace BlackMisc QStringList ms; for (const CAircraftModel &model : (*this)) { + if (!model.hasModelString()) { continue; } ms.append(model.getModelString()); } if (sort) { ms.sort(Qt::CaseInsensitive); } diff --git a/src/blackmisc/timestampobjectlist.cpp b/src/blackmisc/timestampobjectlist.cpp index 523abfa74..7e9215cf0 100644 --- a/src/blackmisc/timestampobjectlist.cpp +++ b/src/blackmisc/timestampobjectlist.cpp @@ -100,27 +100,25 @@ namespace BlackMisc { // O(n) comparisons and O(n) copies std::partition_copy(c.begin(), c.end(), std::back_inserter(result[0]), std::back_inserter(result[1]), - [msSinceEpoch](const OBJ & obj) { return ! obj.isNewerThan(msSinceEpoch); }); + [msSinceEpoch](const OBJ & obj) { return ! obj.isNewerThan(msSinceEpoch); }); } return result; } template - OBJ ITimestampObjectList::latestValue() const + OBJ ITimestampObjectList::latestObject() const { if (this->container().isEmpty()) { return OBJ(); } - CONTAINER copy(container()); // copy - copy.sortLatestFirst(); - return copy.front(); + auto latest = std::max_element(container().begin(), container().end(), [](const OBJ & a, const OBJ & b) { return a.getMSecsSinceEpoch() < b.getMSecsSinceEpoch(); }); + return *latest; } template - OBJ ITimestampObjectList::oldestValue() const + OBJ ITimestampObjectList::oldestObject() const { if (this->container().isEmpty()) { return OBJ(); } - CONTAINER copy(container()); // copy - copy.sortLatestFirst(); - return copy.back(); + auto oldest = std::min_element(container().begin(), container().end(), [](const OBJ & a, const OBJ & b) { return a.getMSecsSinceEpoch() < b.getMSecsSinceEpoch(); }); + return *oldest; } template diff --git a/src/blackmisc/timestampobjectlist.h b/src/blackmisc/timestampobjectlist.h index 1d46caabf..01b124824 100644 --- a/src/blackmisc/timestampobjectlist.h +++ b/src/blackmisc/timestampobjectlist.h @@ -49,10 +49,10 @@ namespace BlackMisc QList splitByTime(qint64 msSinceEpoch, bool sortedLatestFirst = false) const; //! Latest value - OBJ latestValue() const; + OBJ latestObject() const; //! Latest value - OBJ oldestValue() const; + OBJ oldestObject() const; //! Remove objects with timestamp before dateTime void removeBefore(const QDateTime &dateTime);