refs #707, concentrated reverse lookup in matcher

* removed from monitor
* signatures to be directly with network data
This commit is contained in:
Klaus Basan
2016-07-12 03:27:46 +02:00
parent c7d89c7b2c
commit b75d785071
2 changed files with 90 additions and 23 deletions

View File

@@ -167,15 +167,34 @@ namespace BlackCore
return matchedModel;
}
CAircraftModel CAircraftMatcher::reverselLookupModel(const CCallsign &callsign, const QString &networkAircraftIcao, const QString &networkAirlineIcao, const QString &networkLiveryInfo, const QString &networkModelString, CAircraftModel::ModelType type, CStatusMessageList *log)
{
CLivery livery;
livery.setAirlineIcaoCode(networkAirlineIcao);
CAircraftModel model(networkModelString, type, "", CAircraftIcaoCode(networkAircraftIcao), livery);
model.setCallsign(callsign);
model = CAircraftMatcher::reverselLookupModel(model, networkLiveryInfo, log);
return model;
}
CAircraftModel CAircraftMatcher::reverselLookupModel(const CAircraftModel &modelToLookup, const QString &networkLiveryInfo, CStatusMessageList *log)
{
Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing sApp");
Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "No web services");
// already DB model?
CAircraftModel model(modelToLookup);
if (modelToLookup.hasValidDbKey() && modelToLookup.getModelType() == CAircraftModel::TypeDatabaseEntry) { return modelToLookup; }
CAircraftModel model(modelToLookup);
// --- now I try to fill in as many DB data as possible ---
// 1) This will unify data where possible
// 2) I have full information of what the other pilot flies where possible
// 3) This is not model matching here (!), it is a process of getting the most accurate data from that fuzzy information I get via FSD
//
// reverse lookup, use DB data wherever possible
// 1) If I cannot resolce the ICAO codes here, they are either wrong (most likely in most cases) or
// 2) not in the DB yet
const CCallsign callsign(model.getCallsign());
const QStringList liveryModelStrings = CAircraftModel::splitNetworkLiveryString(networkLiveryInfo);
const QString modelString(modelToLookup.hasModelString() ? modelToLookup.getModelString() : liveryModelStrings[1]);
@@ -196,13 +215,23 @@ namespace BlackCore
}
}
// only if not yet matched with DB
const QString aircraftIcaoDesignator(model.getAircraftIcaoCodeDesignator());
const QString airlineIcaoDesignator(model.getAirlineIcaoCodeDesignator());
if (!model.hasValidDbKey())
{
// only if not yet matched with DB
CAircraftIcaoCode aircraftIcaoUsedForLookup(model.getAircraftIcaoCode());
CAirlineIcaoCode airlineIcaoUsedForLookup(model.getAirlineIcaoCode());
if (!aircraftIcaoUsedForLookup.hasValidDbKey())
{
aircraftIcaoUsedForLookup = CAircraftMatcher::reverseLookupAircraftIcao(aircraftIcaoUsedForLookup.getDesignator(), callsign, log);
}
if (!airlineIcaoUsedForLookup.hasValidDbKey())
{
airlineIcaoUsedForLookup = CAircraftMatcher::reverseLookupAirlineIcao(airlineIcaoUsedForLookup.getDesignator(), callsign, log);
}
// try to match by livery
if (liveryCode.isEmpty() && !airlineIcaoDesignator.isEmpty())
if (liveryCode.isEmpty() && airlineIcaoUsedForLookup.hasValidDesignator())
{
// we create a standard livery code, then we try to find based on this
liveryCode = CLivery::getStandardCode(model.getAirlineIcaoCode());
@@ -211,7 +240,7 @@ namespace BlackCore
if (CLivery::isValidCombinedCode(liveryCode))
{
// search DB model by livery
const CAircraftModelList models(sApp->getWebDataServices()->getModelsForAircraftDesignatorAndLiveryCombinedCode(aircraftIcaoDesignator, liveryCode));
const CAircraftModelList models(sApp->getWebDataServices()->getModelsForAircraftDesignatorAndLiveryCombinedCode(aircraftIcaoUsedForLookup.getDesignator(), liveryCode));
if (models.isEmpty())
{
// no models for that livery, search for livery only
@@ -220,14 +249,14 @@ namespace BlackCore
{
// we have found a livery in the DB
model.setLivery(databaseLivery);
if (log) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup, set livery to '%1'").arg(databaseLivery.getCombinedCodePlusInfo()), getLogCategories()); }
if (log) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup of livery '%1'").arg(databaseLivery.getCombinedCodePlusInfo()), getLogCategories()); }
}
}
else
{
// model by livery data found
model = models.front();
if (log) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup, DB model '%1' for '%2'/'%3'', found '%4'").arg(model.getDbKey()).arg(aircraftIcaoDesignator).arg(liveryCode).arg(models.size()), getLogCategories()); }
if (log) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup of DB model '%1' for '%2'/'%3'', found '%4'").arg(model.getDbKey()).arg(aircraftIcaoUsedForLookup.getDesignator()).arg(liveryCode).arg(models.size()), getLogCategories()); }
}
}
@@ -235,16 +264,16 @@ namespace BlackCore
if (!model.hasValidDbKey() && !model.getLivery().hasValidDbKey())
{
// create a pseudo livery, try to find airline first
CAirlineIcaoCode airlineIcao(sApp->getWebDataServices()->smartAirlineIcaoSelector(CAirlineIcaoCode(airlineIcaoDesignator)));
if (!airlineIcao.hasValidDbKey())
CAirlineIcaoCode reverseAirlineIcao(sApp->getWebDataServices()->smartAirlineIcaoSelector(CAirlineIcaoCode(airlineIcaoUsedForLookup.getDesignator())));
if (!reverseAirlineIcao.hasValidDbKey())
{
// no DB data, we update as much as possible
airlineIcao = model.getAirlineIcaoCode();
airlineIcao.updateMissingParts(CAirlineIcaoCode(airlineIcaoDesignator));
reverseAirlineIcao = model.getAirlineIcaoCode();
reverseAirlineIcao.updateMissingParts(CAirlineIcaoCode(airlineIcaoUsedForLookup));
}
if (!airlineIcaoDesignator.isEmpty())
if (airlineIcaoUsedForLookup.hasValidDesignator())
{
const CLivery liveryDummy(CLivery::getStandardCode(airlineIcao), airlineIcao, "Generated");
const CLivery liveryDummy(CLivery::getStandardCode(reverseAirlineIcao), reverseAirlineIcao, "Generated");
model.setLivery(liveryDummy);
if (log) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup, set dummy livery `%1`").arg(liveryDummy.getCombinedCodePlusInfo())); }
}
@@ -252,21 +281,32 @@ namespace BlackCore
if (!model.getAircraftIcaoCode().hasValidDbKey())
{
CAircraftIcaoCode aircraftIcao(sApp->getWebDataServices()->getAircraftIcaoCodeForDesignator(aircraftIcaoDesignator));
if (!aircraftIcao.hasValidDbKey())
CAircraftIcaoCode reverseAircraftIcao(sApp->getWebDataServices()->getAircraftIcaoCodeForDesignator(aircraftIcaoUsedForLookup.getDesignator()));
if (!reverseAircraftIcao.hasValidDbKey())
{
// no DB data, we update as much as possible
aircraftIcao = model.getAircraftIcaoCode();
aircraftIcao.updateMissingParts(CAircraftIcaoCode(aircraftIcaoDesignator));
if (log) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup, aircraft '%1' not found in DB").arg(aircraftIcaoDesignator)); }
reverseAircraftIcao = model.getAircraftIcaoCode();
reverseAircraftIcao.updateMissingParts(CAircraftIcaoCode(aircraftIcaoUsedForLookup));
if (log) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup, aircraft '%1' not found in DB").arg(reverseAircraftIcao.getDesignator())); }
}
if (reverseAircraftIcao.hasDesignator())
{
model.setAircraftIcaoCode(reverseAircraftIcao);
if (log) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup, set aircraft ICAO to '%1'").arg(reverseAircraftIcao.getCombinedIcaoStringWithKey())); }
}
model.setAircraftIcaoCode(aircraftIcao);
if (log) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup, set aircraft to '%1'").arg(aircraftIcao.getCombinedIcaoStringWithKey())); }
}
} // model from DB
if (model.getModelType() != CAircraftModel::TypeUnknown) { model.setModelType(modelToLookup.getModelType()); }
model.setCallsign(modelToLookup.getCallsign());
model.setCallsign(callsign);
if (log)
{
CMatchingUtils::addLogDetailsToList(log, callsign, QString("Uisng model: ICAO '%1', livery '%2', model '%3', type '%4'").
arg(model.getAircraftIcaoCode().getCombinedIcaoStringWithKey()).
arg(model.getLivery().getCombinedCodePlusInfo()).
arg(model.getModelString()).
arg(model.getModelTypeAsString())
);
}
return model;
}
@@ -320,6 +360,22 @@ namespace BlackCore
return livery;
}
CAirlineIcaoCode CAircraftMatcher::callsignToAirline(const CCallsign &callsign, CStatusMessageList *log)
{
if (callsign.isEmpty() || !sApp || !sApp->getWebDataServices()) { return CAirlineIcaoCode(); }
const CAirlineIcaoCode icao = sApp->getWebDataServices()->findBestMatchByCallsign(callsign);
if (icao.hasValidDesignator())
{
CMatchingUtils::addLogDetailsToList(log, callsign, QString("Turned callsign %1 into airline %2").arg(callsign.asString()).arg(icao.getDesignator()), getLogCategories());
}
else
{
CMatchingUtils::addLogDetailsToList(log, callsign, QString("Cannot turn callsign %1 into airline").arg(callsign.asString()), getLogCategories());
}
return icao;
}
int CAircraftMatcher::setModelSet(const CAircraftModelList &models)
{
CAircraftModelList modelsCleaned(models);