mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-17 02:45:33 +08:00
Ref T308, performance optimized fromDatabaseJsonCaching
* maps for id/object * caching fromDatabaseJsonCaching * fixed CAircraftModel::fromDatabaseJson wrong prefix
This commit is contained in:
@@ -772,19 +772,24 @@ namespace BlackMisc
|
||||
|
||||
CAircraftModel CAircraftModel::fromDatabaseJson(const QJsonObject &json, const QString &prefix)
|
||||
{
|
||||
const QString modelString(json.value(prefix + "modelstring").toString());
|
||||
const QString modelDescription(json.value(prefix + "description").toString());
|
||||
const QString modelName(json.value(prefix + "name").toString());
|
||||
const QString modelMode(json.value(prefix + "mode").toString());
|
||||
static const QString prefixAircraftIcao("ac_");
|
||||
static const QString prefixLivery("liv_");
|
||||
static const QString prefixDistributor("dist_");
|
||||
|
||||
const QString modelString(json.value(prefix % QStringLiteral("modelstring")).toString());
|
||||
const QString modelDescription(json.value(prefix % QStringLiteral("description")).toString());
|
||||
const QString modelName(json.value(prefix % QStringLiteral("name")).toString());
|
||||
const QString modelMode(json.value(prefix % QStringLiteral("mode")).toString());
|
||||
|
||||
const CSimulatorInfo simInfo = CSimulatorInfo::fromDatabaseJson(json, prefix);
|
||||
CDistributor distributor(CDistributor::fromDatabaseJson(json, "dist_"));
|
||||
CAircraftIcaoCode aircraftIcao(CAircraftIcaoCode::fromDatabaseJson(json, "ac_"));
|
||||
CLivery livery(CLivery::fromDatabaseJson(json, "liv_"));
|
||||
CDistributor distributor(CDistributor::fromDatabaseJson(json, prefixDistributor));
|
||||
CAircraftIcaoCode aircraftIcao(CAircraftIcaoCode::fromDatabaseJson(json, prefixAircraftIcao));
|
||||
CLivery livery(CLivery::fromDatabaseJson(json, prefixLivery));
|
||||
|
||||
//! \todo KB 2018-08 "idaircrafticao" seem not to be used anymore (remove???) in "vAircraftModelDenormalized", but was used in "vAircraftModelComplete"
|
||||
if (!aircraftIcao.isLoadedFromDb())
|
||||
{
|
||||
const int idAircraftIcao = json.value(prefix + "idaircrafticao").toInt(-1);
|
||||
const int idAircraftIcao = json.value(prefix % QStringLiteral("idaircrafticao")).toInt(-1);
|
||||
if (idAircraftIcao >= 0)
|
||||
{
|
||||
aircraftIcao.setDbKey(idAircraftIcao);
|
||||
@@ -793,7 +798,7 @@ namespace BlackMisc
|
||||
|
||||
if (!livery.isLoadedFromDb())
|
||||
{
|
||||
const int idLivery = json.value(prefix + "idlivery").toInt(-1);
|
||||
const int idLivery = json.value(prefix % QStringLiteral("idlivery")).toInt(-1);
|
||||
if (idLivery >= 0)
|
||||
{
|
||||
livery.setDbKey(idLivery);
|
||||
@@ -802,7 +807,7 @@ namespace BlackMisc
|
||||
|
||||
if (!distributor.isLoadedFromDb())
|
||||
{
|
||||
const QString idDistributor = json.value(prefix + "iddistributor").toString();
|
||||
const QString idDistributor = json.value(prefix % QStringLiteral("iddistributor")).toString();
|
||||
if (!idDistributor.isEmpty())
|
||||
{
|
||||
distributor.setDbKey(idDistributor);
|
||||
@@ -818,6 +823,79 @@ namespace BlackMisc
|
||||
return model;
|
||||
}
|
||||
|
||||
CAircraftModel CAircraftModel::fromDatabaseJsonCaching(
|
||||
const QJsonObject &json,
|
||||
AircraftIcaoIdMap &aircraftIcaos, LiveryIdMap &liveries, DistributorIdMap &distributors,
|
||||
const QString &prefix)
|
||||
{
|
||||
static const QString prefixAircraftIcao("ac_");
|
||||
static const QString prefixLivery("liv_");
|
||||
static const QString prefixDistributor("dist_");
|
||||
|
||||
const QString modelString(json.value(prefix % QStringLiteral("modelstring")).toString());
|
||||
const QString modelDescription(json.value(prefix % QStringLiteral("description")).toString());
|
||||
const QString modelName(json.value(prefix % QStringLiteral("name")).toString());
|
||||
const QString modelMode(json.value(prefix % QStringLiteral("mode")).toString());
|
||||
|
||||
const CSimulatorInfo simInfo = CSimulatorInfo::fromDatabaseJson(json, prefix);
|
||||
const int idAircraftIcao = json.value(prefixAircraftIcao % QStringLiteral("id")).toInt(-1);
|
||||
const int idLivery = json.value(prefixLivery % QStringLiteral("id")).toInt(-1);
|
||||
const QString idDistributor = json.value(prefixDistributor % QStringLiteral("id")).toString();
|
||||
const bool cachedAircraftIcao = (idAircraftIcao >= 0) && aircraftIcaos.contains(idAircraftIcao);
|
||||
const bool cachedLivery = (idLivery >= 0) && liveries.contains(idLivery);
|
||||
const bool cachedDistributor = !idDistributor.isEmpty() && distributors.contains(idDistributor);
|
||||
|
||||
CAircraftIcaoCode aircraftIcao(cachedAircraftIcao ?
|
||||
aircraftIcaos[idAircraftIcao] :
|
||||
CAircraftIcaoCode::fromDatabaseJson(json, prefixAircraftIcao));
|
||||
|
||||
CLivery livery(cachedLivery ?
|
||||
liveries[idLivery] :
|
||||
CLivery::fromDatabaseJson(json, prefixLivery));
|
||||
|
||||
CDistributor distributor(cachedDistributor ?
|
||||
distributors[idDistributor] :
|
||||
CDistributor::fromDatabaseJson(json, prefixDistributor));
|
||||
|
||||
if (!aircraftIcao.isLoadedFromDb())
|
||||
{
|
||||
if (idAircraftIcao >= 0)
|
||||
{
|
||||
aircraftIcao.setDbKey(idAircraftIcao);
|
||||
}
|
||||
}
|
||||
|
||||
if (!livery.isLoadedFromDb())
|
||||
{
|
||||
const int idLivery = json.value(prefix % QStringLiteral("idlivery")).toInt(-1);
|
||||
if (idLivery >= 0)
|
||||
{
|
||||
livery.setDbKey(idLivery);
|
||||
}
|
||||
}
|
||||
|
||||
if (!distributor.isLoadedFromDb())
|
||||
{
|
||||
const QString idDistributor = json.value(prefix % QStringLiteral("iddistributor")).toString();
|
||||
if (!idDistributor.isEmpty())
|
||||
{
|
||||
distributor.setDbKey(idDistributor);
|
||||
}
|
||||
}
|
||||
|
||||
if (!cachedAircraftIcao && aircraftIcao.isLoadedFromDb()) { aircraftIcaos[aircraftIcao.getDbKey()] = aircraftIcao; }
|
||||
if (!cachedLivery && livery.isLoadedFromDb()) { liveries[livery.getDbKey()] = livery; }
|
||||
if (!cachedDistributor && distributor.isLoadedFromDb()) { distributors[distributor.getDbKey()] = distributor; }
|
||||
|
||||
CAircraftModel model(
|
||||
modelString, CAircraftModel::TypeDatabaseEntry, simInfo, modelName, modelDescription, aircraftIcao, livery
|
||||
);
|
||||
model.setDistributor(distributor);
|
||||
model.setModelModeAsString(modelMode);
|
||||
model.setKeyAndTimestampFromDatabaseJson(json, prefix);
|
||||
return model;
|
||||
}
|
||||
|
||||
QStringList CAircraftModel::splitNetworkLiveryString(const QString &liveryString)
|
||||
{
|
||||
QStringList liveryModelStrings({ "", "" });
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
#include <QMetaType>
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
#include <Qt>
|
||||
#include <QFileInfo>
|
||||
@@ -437,6 +436,9 @@ namespace BlackMisc
|
||||
//! From swift DB JSON
|
||||
static CAircraftModel fromDatabaseJson(const QJsonObject &json, const QString &prefix = QString("mod_"));
|
||||
|
||||
//! 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_"));
|
||||
|
||||
//! Split swift network string "DLH._STD [modelname]"
|
||||
//! \return QStringList [0] livery code , [1] model string
|
||||
//! \sa getSwiftLiveryString
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <QJsonValue>
|
||||
#include <QList>
|
||||
#include <QMultiMap>
|
||||
#include <QMap>
|
||||
#include <tuple>
|
||||
|
||||
using namespace BlackMisc::Network;
|
||||
@@ -1070,7 +1071,7 @@ namespace BlackMisc
|
||||
for (const CAircraftModel &model : *this)
|
||||
{
|
||||
CAircraftModel copy(model);
|
||||
copy.normalizeFileNameForDb();
|
||||
copy.normalizeFileNameForDb(); // strip full path
|
||||
QJsonValue v(copy.toDatabaseJson());
|
||||
array.append(v);
|
||||
}
|
||||
@@ -1163,5 +1164,19 @@ namespace BlackMisc
|
||||
}
|
||||
return stats;
|
||||
}
|
||||
|
||||
CAircraftModelList CAircraftModelList::fromDatabaseJsonCaching(const QJsonArray &array)
|
||||
{
|
||||
AircraftIcaoIdMap aircraftIcaos;
|
||||
LiveryIdMap liveries;
|
||||
DistributorIdMap distributors;
|
||||
|
||||
CAircraftModelList models;
|
||||
for (const QJsonValue &value : array)
|
||||
{
|
||||
models.push_back(CAircraftModel::fromDatabaseJsonCaching(value.toObject(), aircraftIcaos, liveries, distributors));
|
||||
}
|
||||
return models;
|
||||
}
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
@@ -363,6 +363,9 @@ namespace BlackMisc
|
||||
|
||||
//! A HTML summary of the data in the list
|
||||
QString htmlStatistics(bool aircraftStats, bool airlineStats) const;
|
||||
|
||||
//! Newer version
|
||||
static CAircraftModelList fromDatabaseJsonCaching(const QJsonArray &array);
|
||||
};
|
||||
|
||||
//! Model per callsign
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
#include <QJsonValue>
|
||||
#include <Qt>
|
||||
#include <QStringBuilder>
|
||||
#include <QtGlobal>
|
||||
|
||||
namespace BlackMisc
|
||||
@@ -174,8 +175,8 @@ namespace BlackMisc
|
||||
}
|
||||
|
||||
const CSimulatorInfo simulator = CSimulatorInfo::fromDatabaseJson(json, prefix);
|
||||
const QString alias1(json.value(prefix + "alias1").toString());
|
||||
const QString alias2(json.value(prefix + "alias2").toString());
|
||||
const QString alias1(json.value(prefix % QStringLiteral("alias1")).toString());
|
||||
const QString alias2(json.value(prefix % QStringLiteral("alias2")).toString());
|
||||
Q_ASSERT_X(!description.isEmpty(), Q_FUNC_INFO, "Missing description");
|
||||
CDistributor distributor("", description, alias1, alias2, simulator);
|
||||
distributor.setKeyAndTimestampFromDatabaseJson(json, prefix);
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
|
||||
#include <QJsonObject>
|
||||
#include <QMetaType>
|
||||
#include <QMap>
|
||||
#include <QString>
|
||||
|
||||
namespace BlackMisc
|
||||
@@ -142,6 +143,10 @@ namespace BlackMisc
|
||||
BLACK_METAMEMBER(simulator)
|
||||
);
|
||||
};
|
||||
|
||||
//! Distributor/id map
|
||||
using DistributorIdMap = QMap<QString, CDistributor>;
|
||||
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
|
||||
Reference in New Issue
Block a user