diff --git a/src/blackmisc/db/datastoreobjectlist.cpp b/src/blackmisc/db/datastoreobjectlist.cpp index 5050686bd..fe59550e8 100644 --- a/src/blackmisc/db/datastoreobjectlist.cpp +++ b/src/blackmisc/db/datastoreobjectlist.cpp @@ -183,6 +183,17 @@ namespace BlackMisc return objs.oldestDbTimestamp(); } + template + int IDatastoreObjectList::countWithValidDbKey() const + { + int count = 0; + for (const OBJ &obj : ITimestampObjectList::container()) + { + if (obj.hasValidDbKey()) { count++; } + } + return count; + } + template QDateTime IDatastoreObjectList::latestDbTimestamp() const { diff --git a/src/blackmisc/db/datastoreobjectlist.h b/src/blackmisc/db/datastoreobjectlist.h index e5a8818dc..ccaa2fde7 100644 --- a/src/blackmisc/db/datastoreobjectlist.h +++ b/src/blackmisc/db/datastoreobjectlist.h @@ -38,7 +38,7 @@ namespace BlackMisc //! All keys as set QSet toDbKeySet() const; - //! All keys as string set (also int keys will be converted to string) + //! All keys as string set (also integer keys will be converted to string) QSet toDbKeyStringSet() const; //! The DB keys as string @@ -62,6 +62,9 @@ namespace BlackMisc //! Latest DB timestamp (means objects with DB key) QDateTime oldestDbTimestamp() const; + //! Number of entries with valid DB key + int countWithValidDbKey() const; + //! From DB JSON with default prefixes //! \remark Specialized classes might have their own fromDatabaseJson implementation static CONTAINER fromDatabaseJson(const QJsonArray &array); diff --git a/src/blackmisc/simulation/aircraftmodellist.cpp b/src/blackmisc/simulation/aircraftmodellist.cpp index 592d7ad7f..401bb4886 100644 --- a/src/blackmisc/simulation/aircraftmodellist.cpp +++ b/src/blackmisc/simulation/aircraftmodellist.cpp @@ -18,6 +18,7 @@ #include "blackmisc/statusmessage.h" #include "blackmisc/stringutils.h" +#include #include #include #include @@ -623,6 +624,46 @@ namespace BlackMisc return count; } + int CAircraftModelList::countVtolAircraft() const + { + int count = 0; + for (const CAircraftModel &model : (*this)) + { + if (model.isVtol()) { count++; } + } + return count; + } + + int CAircraftModelList::countMilitaryAircraft() const + { + int count = 0; + for (const CAircraftModel &model : (*this)) + { + if (model.isMilitary()) { count++; } + } + return count; + } + + int CAircraftModelList::countCivilianAircraft() const + { + int count = 0; + for (const CAircraftModel &model : (*this)) + { + if (model.isCivilian()) { count++; } + } + return count; + } + + int CAircraftModelList::countDifferentAirlines() const + { + return this->getAirlineVDesignators().size(); + } + + int CAircraftModelList::countCombinedTypes() const + { + return this->getCombinedTypes().size(); + } + void CAircraftModelList::updateDistributor(const CDistributor &distributor) { for (CAircraftModel &model : *this) @@ -678,6 +719,23 @@ namespace BlackMisc return designators; } + QSet CAircraftModelList::getCombinedTypes() const + { + QSet combinedCodes; + for (const CAircraftModel &model : *this) + { + const QString ct = model.getAircraftIcaoCode().getCombinedType(); + if (ct.isEmpty()) { continue; } + combinedCodes.insert(ct); + } + return combinedCodes; + } + + QString CAircraftModelList::getCombinedTypesAsString(const QString &separator) const + { + return this->getCombinedTypes().values().join(separator); + } + void CAircraftModelList::updateAircraftIcao(const CAircraftIcaoCode &icao) { for (CAircraftModel &model : *this) @@ -719,7 +777,8 @@ namespace BlackMisc // normally prefer colors if there is no airline CMatchingUtils::addLogDetailsToList(log, remoteModel.getCallsign(), QString("Prefer color liveries: '%1', airline: '%2', ignore zero scores: '%3'").arg(boolToYesNo(preferColorLiveries), remoteModel.getAirlineIcaoCodeDesignator(), boolToYesNo(ignoreZeroScores))); - CMatchingUtils::addLogDetailsToList(log, remoteModel.getCallsign(), QString("--- Start scoring in list with %1 models, airline liveries: %2, color liveries: %3").arg(this->size()).arg(this->countModelsWithAirlineLivery()).arg(this->countModelsWithColorLivery())); + CMatchingUtils::addLogDetailsToList(log, remoteModel.getCallsign(), QString("--- Start scoring in list with %1 models").arg(this->size())); + CMatchingUtils::addLogDetailsToList(log, remoteModel.getCallsign(), this->coverageSummary()); int c = 1; for (const CAircraftModel &model : *this) @@ -912,5 +971,20 @@ namespace BlackMisc } return html; } + + QString CAircraftModelList::coverageSummary(const QString &separator) const + { + return + QStringLiteral("Entries: ") % QString::number(this->size()) % + QStringLiteral(" valid DB keys: ") % QString::number(this->countWithValidDbKey()) % separator % + QStringLiteral("color liveries: ") % QString::number(this->countModelsWithColorLivery()) % + QStringLiteral(" airline liveries: ") % QString::number(this->countModelsWithAirlineLivery()) % separator % + QStringLiteral("VTOL: ") % QString::number(this->countVtolAircraft()) % separator % + QStringLiteral("Simulators: ") % this->countPerSimulator().toQString() % separator % + QStringLiteral("Military: ") % QString::number(this->countMilitaryAircraft()) % + QStringLiteral(" civilian: ") % QString::number(this->countCivilianAircraft()) % separator % + QStringLiteral("Different airlines: ") % QString::number(this->countDifferentAirlines()) % separator % + QStringLiteral("Combined types: ") % this->getCombinedTypesAsString(); + } } // namespace } // namespace diff --git a/src/blackmisc/simulation/aircraftmodellist.h b/src/blackmisc/simulation/aircraftmodellist.h index 03ba176cf..34f36faf7 100644 --- a/src/blackmisc/simulation/aircraftmodellist.h +++ b/src/blackmisc/simulation/aircraftmodellist.h @@ -243,6 +243,21 @@ namespace BlackMisc //! Models with an airline livery int countModelsWithAirlineLivery() const; + //! Count VTOL aircraft + int countVtolAircraft() const; + + //! Count military aircraft + int countMilitaryAircraft() const; + + //! Count civilian aircraft + int countCivilianAircraft() const; + + //! Number of different airlines + int countDifferentAirlines() const; + + //! Count different combined types + int countCombinedTypes() const; + //! Update distributor, all models in list are set to given distributor void updateDistributor(const CDistributor &distributor); @@ -258,6 +273,12 @@ namespace BlackMisc //! Airline virtual designators QSet getAirlineVDesignators() const; + //! All combined types + QSet getCombinedTypes() const; + + //! All combined types as string + QString getCombinedTypesAsString(const QString &separator = ", ") const; + //! Update aircraft ICAO void updateAircraftIcao(const BlackMisc::Aviation::CAircraftIcaoCode &icao); @@ -299,6 +320,9 @@ namespace BlackMisc //! As HTML summary QString asHtmlSummary() const; + + //! What kind of models are represented here + QString coverageSummary(const QString &separator = "\n") const; }; } // ns } // ns