Ref T472, allow to pass already existing values for model parsing

* list to map: toDbKeyValueMap
* categories can also be passed, hence the categories can be seen in model views
This commit is contained in:
Klaus Basan
2019-02-19 23:54:14 +01:00
committed by Mat Sutcliffe
parent 7a2ed1433d
commit 9cee34f4cc
7 changed files with 53 additions and 12 deletions

View File

@@ -21,9 +21,9 @@
#include "blackmisc/blackmiscexport.h" #include "blackmisc/blackmiscexport.h"
#include <QJsonObject> #include <QJsonObject>
#include <QMetaType> #include <QMap>
#include <QString>
#include <QStringList> #include <QStringList>
#include <QMetaType>
namespace BlackMisc namespace BlackMisc
{ {
@@ -150,6 +150,10 @@ namespace BlackMisc
BLACK_METAMEMBER(assignable) BLACK_METAMEMBER(assignable)
); );
}; };
//! Category/id map
using AircraftCategoryIdMap = QMap<int, CAircraftCategory>;
} // namespace } // namespace
} // namespace } // namespace

View File

@@ -119,6 +119,18 @@ namespace BlackMisc
return keys; return keys;
} }
template <class OBJ, class CONTAINER, typename KEYTYPE>
QMap<KEYTYPE, OBJ> IDatastoreObjectList<OBJ, CONTAINER, KEYTYPE>::toDbKeyValueMap() const
{
QMap<KEYTYPE, OBJ> map;
for (const OBJ &obj : ITimestampObjectList<OBJ, CONTAINER>::container())
{
if (!obj.hasValidDbKey()) { continue; }
map.insert(obj.getDbKey(), obj);
}
return map;
}
template<class OBJ, class CONTAINER, typename KEYTYPE> template<class OBJ, class CONTAINER, typename KEYTYPE>
QSet<QString> IDatastoreObjectList<OBJ, CONTAINER, KEYTYPE>::toDbKeyStringSet() const QSet<QString> IDatastoreObjectList<OBJ, CONTAINER, KEYTYPE>::toDbKeyStringSet() const
{ {

View File

@@ -16,6 +16,7 @@
#include "blackmisc/jsonexception.h" #include "blackmisc/jsonexception.h"
#include <QJsonArray> #include <QJsonArray>
#include <QSet> #include <QSet>
#include <QMap>
#include <QString> #include <QString>
namespace BlackMisc namespace BlackMisc
@@ -48,6 +49,9 @@ namespace BlackMisc
//! All keys as set //! All keys as set
QSet<KEYTYPE> toDbKeySet() const; QSet<KEYTYPE> toDbKeySet() const;
//! As map with DB key/object
QMap<KEYTYPE, OBJ> toDbKeyValueMap() const;
//! All keys as string set (also integer keys will be converted to string) //! All keys as string set (also integer keys will be converted to string)
QSet<QString> toDbKeyStringSet() const; QSet<QString> toDbKeyStringSet() const;

View File

@@ -961,7 +961,7 @@ namespace BlackMisc
CAircraftModel CAircraftModel::fromDatabaseJsonCaching( CAircraftModel CAircraftModel::fromDatabaseJsonCaching(
const QJsonObject &json, const QJsonObject &json,
AircraftIcaoIdMap &aircraftIcaos, LiveryIdMap &liveries, DistributorIdMap &distributors, AircraftIcaoIdMap &aircraftIcaos, const AircraftCategoryIdMap &categories, LiveryIdMap &liveries, DistributorIdMap &distributors,
const QString &prefix) const QString &prefix)
{ {
static const QString prefixAircraftIcao("ac_"); static const QString prefixAircraftIcao("ac_");
@@ -987,11 +987,20 @@ namespace BlackMisc
distributors[idDistributor] : distributors[idDistributor] :
CDistributor::fromDatabaseJson(json, prefixDistributor)); CDistributor::fromDatabaseJson(json, prefixDistributor));
if (!aircraftIcao.isLoadedFromDb() && idAircraftIcao >= 0) { aircraftIcao.setDbKey(idAircraftIcao); }
if (!aircraftIcao.isLoadedFromDb() && idAircraftIcao >= 0) { aircraftIcao.setDbKey(idAircraftIcao); } if (!aircraftIcao.isLoadedFromDb() && idAircraftIcao >= 0) { aircraftIcao.setDbKey(idAircraftIcao); }
if (!livery.isLoadedFromDb() && idLivery >= 0) { livery.setDbKey(idLivery); } if (!livery.isLoadedFromDb() && idLivery >= 0) { livery.setDbKey(idLivery); }
if (!distributor.isLoadedFromDb() && !idDistributor.isEmpty()) { distributor.setDbKey(idDistributor); } if (!distributor.isLoadedFromDb() && !idDistributor.isEmpty()) { distributor.setDbKey(idDistributor); }
// update category
if (!cachedAircraftIcao)
{
const int catId = aircraftIcao.getCategory().getDbKey();
if (catId >= 0 && categories.contains(catId))
{
aircraftIcao.setCategory(categories[catId]);
}
}
// store in temp.cache // store in temp.cache
if (!cachedAircraftIcao && aircraftIcao.isLoadedFromDb()) { aircraftIcaos[aircraftIcao.getDbKey()] = aircraftIcao; } if (!cachedAircraftIcao && aircraftIcao.isLoadedFromDb()) { aircraftIcaos[aircraftIcao.getDbKey()] = aircraftIcao; }
if (!cachedLivery && livery.isLoadedFromDb()) { liveries[livery.getDbKey()] = livery; } if (!cachedLivery && livery.isLoadedFromDb()) { liveries[livery.getDbKey()] = livery; }

View File

@@ -503,7 +503,7 @@ namespace BlackMisc
static CAircraftModel fromDatabaseJson(const QJsonObject &json, const QString &prefix = QString("mod_")); static CAircraftModel fromDatabaseJson(const QJsonObject &json, const QString &prefix = QString("mod_"));
//! From swift DB JSON, caching during this process (faster) //! From swift DB JSON, caching during this process (faster)
static CAircraftModel fromDatabaseJsonCaching(const QJsonObject &json, Aviation::AircraftIcaoIdMap &aircraftIcaos, Aviation::LiveryIdMap &liveries, DistributorIdMap &distributors, const QString &prefix = QString("mod_")); static CAircraftModel fromDatabaseJsonCaching(const QJsonObject &json, Aviation::AircraftIcaoIdMap &aircraftIcaos, const Aviation::AircraftCategoryIdMap &categories, Aviation::LiveryIdMap &liveries, DistributorIdMap &distributors, const QString &prefix = QString("mod_"));
//! Livery string prefix //! Livery string prefix
static const QString &liveryStringPrefix(); static const QString &liveryStringPrefix();

View File

@@ -10,7 +10,6 @@
#include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/simulation/aircraftmodellist.h"
#include "blackmisc/simulation/matchingutils.h" #include "blackmisc/simulation/matchingutils.h"
#include "blackmisc/aviation/callsign.h" #include "blackmisc/aviation/callsign.h"
#include "blackmisc/aviation/liverylist.h"
#include "blackmisc/math/mathutils.h" #include "blackmisc/math/mathutils.h"
#include "blackmisc/compare.h" #include "blackmisc/compare.h"
#include "blackmisc/iterator.h" #include "blackmisc/iterator.h"
@@ -1507,16 +1506,23 @@ namespace BlackMisc
return stats; return stats;
} }
CAircraftModelList CAircraftModelList::fromDatabaseJsonCaching(const QJsonArray &array) CAircraftModelList CAircraftModelList::fromDatabaseJsonCaching(
const QJsonArray &array,
const CAircraftIcaoCodeList &icaos,
const CAircraftCategoryList &categories,
const CLiveryList &liveries,
const CDistributorList &distributors
)
{ {
AircraftIcaoIdMap aircraftIcaos; AircraftIcaoIdMap aircraftIcaosMap = icaos.toDbKeyValueMap();
LiveryIdMap liveries; LiveryIdMap liveriesMap = liveries.toDbKeyValueMap();
DistributorIdMap distributors; DistributorIdMap distributorsMap = distributors.toDbKeyValueMap();
const AircraftCategoryIdMap categoriesMap = categories.toDbKeyValueMap();
CAircraftModelList models; CAircraftModelList models;
for (const QJsonValue &value : array) for (const QJsonValue &value : array)
{ {
models.push_back(CAircraftModel::fromDatabaseJsonCaching(value.toObject(), aircraftIcaos, liveries, distributors)); models.push_back(CAircraftModel::fromDatabaseJsonCaching(value.toObject(), aircraftIcaosMap, categoriesMap, liveriesMap, distributorsMap));
} }
return models; return models;
} }

View File

@@ -17,6 +17,8 @@
#include "blackmisc/simulation/simulatorinfo.h" #include "blackmisc/simulation/simulatorinfo.h"
#include "blackmisc/aviation/aircrafticaocodelist.h" #include "blackmisc/aviation/aircrafticaocodelist.h"
#include "blackmisc/aviation/airlineicaocodelist.h" #include "blackmisc/aviation/airlineicaocodelist.h"
#include "blackmisc/aviation/aircraftcategorylist.h"
#include "blackmisc/aviation/liverylist.h"
#include "blackmisc/aviation/callsignobjectlist.h" #include "blackmisc/aviation/callsignobjectlist.h"
#include "blackmisc/db/datastoreobjectlist.h" #include "blackmisc/db/datastoreobjectlist.h"
#include "blackmisc/blackmiscexport.h" #include "blackmisc/blackmiscexport.h"
@@ -462,7 +464,11 @@ namespace BlackMisc
QString htmlStatistics(bool aircraftStats, bool airlineStats) const; QString htmlStatistics(bool aircraftStats, bool airlineStats) const;
//! Newer version //! Newer version
static CAircraftModelList fromDatabaseJsonCaching(const QJsonArray &array); static CAircraftModelList fromDatabaseJsonCaching(const QJsonArray &array,
const Aviation::CAircraftIcaoCodeList &aircraftIcaos = {},
const Aviation::CAircraftCategoryList &aircraftCategories = {},
const Aviation::CLiveryList &liveries = {},
const CDistributorList &distributors = {});
}; };
//! Model per callsign //! Model per callsign