From 1b316cd6a6b0cf73b12298bf15304a59ada3c8dc Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sat, 27 Oct 2018 02:13:35 +0200 Subject: [PATCH] Ref T409, matcher lookup functions for ids --- src/blackcore/aircraftmatcher.cpp | 194 ++++++++++++++++++++++++------ src/blackcore/aircraftmatcher.h | 27 +++++ 2 files changed, 182 insertions(+), 39 deletions(-) diff --git a/src/blackcore/aircraftmatcher.cpp b/src/blackcore/aircraftmatcher.cpp index ebaf0e577..8ac8e6bd5 100644 --- a/src/blackcore/aircraftmatcher.cpp +++ b/src/blackcore/aircraftmatcher.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include using namespace BlackMisc; @@ -289,30 +290,72 @@ namespace BlackCore // Reverse lookup, use DB data wherever possible // 1) If I cannot resolve 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]); - QString liveryCode(liveryModelStrings[0]); - if (!modelString.isEmpty()) + do { - // if we find the model here we have a fully defined DB model - const CAircraftModel modelFromDb(sApp->getWebDataServices()->getModelForModelString(modelString)); - if (modelFromDb.hasValidDbKey()) + if (modelToLookup.hasModelString()) { - model = modelFromDb; - if (log) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup found DB model '%1' for '%2'").arg(modelFromDb.getModelStringAndDbKey(), callsign.toQString()), getLogCategories()); } + // if we find the model here we have a fully defined DB model + const CAircraftModel modelFromDb = CAircraftMatcher::reverseLookupModelString(modelToLookup.getModelString(), callsign, log); + if (modelFromDb.hasValidDbKey()) + { + model = modelFromDb; + break; // done here + } + } + + // lookup if model is not yet from DB + const DBTripleIds ids = CAircraftModel::parseNetworkLiveryString(networkLiveryInfo); + if (ids.model >= 0) + { + const CAircraftModel modelFromDb = CAircraftMatcher::reverseLookupModelId(ids.model, callsign, log); + if (modelFromDb.hasValidDbKey()) + { + model = modelFromDb; + break; + } + } + + // no direct resolution of model, try livery and aircraft ICAO + if (!modelToLookup.getAircraftIcaoCode().hasValidDbKey() && ids.aircraft >= 0) + { + const CAircraftIcaoCode icaoFromDb = CAircraftMatcher::reverseLookupAircraftIcaoId(ids.aircraft, callsign, log); + if (icaoFromDb.hasValidDbKey()) + { + model.setAircraftIcaoCode(icaoFromDb); + } + } + + if (!modelToLookup.getLivery().hasValidDbKey() && ids.livery >= 0) + { + const CLivery liveryFromDb = CAircraftMatcher::reverseLookupLiveryId(ids.livery, callsign, log); + if (liveryFromDb.hasValidDbKey()) + { + model.setLivery(liveryFromDb); + } + } + + // aircraft ICAO if not from DB yet + if (!model.getAircraftIcaoCode().hasValidDbKey()) + { + CAircraftIcaoCode reverseIcaoCode(model.getAircraftIcaoCode()); + if (!reverseIcaoCode.isLoadedFromDb()) + { + reverseIcaoCode = CAircraftMatcher::reverseLookupAircraftIcao(reverseIcaoCode, callsign, log); + if (reverseIcaoCode.isLoadedFromDb()) + { + if (log) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Set aircraft ICAO to '%1' from DB").arg(reverseIcaoCode.getCombinedIcaoStringWithKey())); } + model.setAircraftIcaoCode(reverseIcaoCode); + } + else + { + // no DB data + if (log) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup, ICAO '%1' not resolved from DB").arg(reverseIcaoCode.getDesignator())); } + } + } } - else - { - if (log) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup did not find model for '%1'").arg(modelString), getLogCategories()); } - } - } - // lookup if model is not yet from DB - if (!model.isLoadedFromDb()) - { // check if livery is already from DB if (!model.getLivery().isLoadedFromDb()) { @@ -323,6 +366,7 @@ namespace BlackCore } // try to match by livery + QString liveryCode = networkLiveryInfo; if (liveryCode.isEmpty() && airlineIcaoCode.hasValidDesignator()) { // we create a standard livery code, then we try to find based on this @@ -358,27 +402,8 @@ namespace BlackCore } } // pseudo livery } // livery from DB - - // aircraft ICAO if not from DB yet - if (!model.getAircraftIcaoCode().hasValidDbKey()) - { - CAircraftIcaoCode reverseIcaoCode(model.getAircraftIcaoCode()); - if (!reverseIcaoCode.isLoadedFromDb()) - { - reverseIcaoCode = CAircraftMatcher::reverseLookupAircraftIcao(reverseIcaoCode, callsign, log); - if (reverseIcaoCode.isLoadedFromDb()) - { - if (log) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Set aircraft ICAO to '%1' from DB").arg(reverseIcaoCode.getCombinedIcaoStringWithKey())); } - model.setAircraftIcaoCode(reverseIcaoCode); - } - else - { - // no DB data - if (log) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup, ICAO '%1' not resolved from DB").arg(reverseIcaoCode.getDesignator())); } - } - } - } - } // model from DB + } + while (false); model.setCallsign(callsign); model.setModelType(modelToLookup.getModelType()); @@ -393,6 +418,44 @@ namespace BlackCore return model; } + CAircraftModel CAircraftMatcher::reverseLookupModelString(const QString &modelString, const CCallsign &callsign, CStatusMessageList *log) + { + if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return CAircraftModel(); } + CAircraftModel model = sApp->getWebDataServices()->getModelForModelString(modelString); + if (log) + { + if (model.hasValidDbKey()) + { + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Found model in DB for model string '%1'").arg(model.getModelStringAndDbKey())); + } + else + { + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Did not find model in DB for model string '%1'").arg(modelString)); + } + } + model.setCallsign(callsign); + return model; + } + + CAircraftModel CAircraftMatcher::reverseLookupModelId(int id, const CCallsign &callsign, CStatusMessageList *log) + { + if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return CAircraftModel(); } + CAircraftModel model = sApp->getWebDataServices()->getModelForDbKey(id); + if (log) + { + if (model.hasValidDbKey()) + { + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Found model in DB for id '%1'").arg(id)); + } + else + { + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Did not find model in DB for id '%1'").arg(id)); + } + } + model.setCallsign(callsign); + return model; + } + CAircraftIcaoCode CAircraftMatcher::reverseLookupAircraftIcao(const CAircraftIcaoCode &icaoCandidate, const CCallsign &logCallsign, CStatusMessageList *log) { if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return CAircraftIcaoCode(); } @@ -462,6 +525,24 @@ namespace BlackCore } } + CAircraftIcaoCode CAircraftMatcher::reverseLookupAircraftIcaoId(int id, const CCallsign &logCallsign, CStatusMessageList *log) + { + if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return CAircraftIcaoCode(); } + const CAircraftIcaoCode icao = sApp->getWebDataServices()->getAircraftIcaoCodeForDbKey(id); + if (log) + { + if (icao.hasValidDbKey()) + { + CMatchingUtils::addLogDetailsToList(log, logCallsign, QString("Found aircraft ICAO in DB for id '%1'").arg(id)); + } + else + { + CMatchingUtils::addLogDetailsToList(log, logCallsign, QString("Did not find aircraft ICAO in DB for id '%1'").arg(id)); + } + } + return icao; + } + CAirlineIcaoCode CAircraftMatcher::reverseLookupAirlineIcao(const CAirlineIcaoCode &icaoPattern, const CCallsign &callsign, CStatusMessageList *log) { if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return CAirlineIcaoCode(); } @@ -492,6 +573,41 @@ namespace BlackCore return livery; } + CLivery CAircraftMatcher::reverseLookupLiveryId(int id, const CCallsign &logCallsign, CStatusMessageList *log) + { + if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return CLivery(); } + const CLivery livery = sApp->getWebDataServices()->getLiveryForDbKey(id); + if (log) + { + if (livery.hasValidDbKey()) + { + CMatchingUtils::addLogDetailsToList(log, logCallsign, QString("Found livery in DB for id '%1'").arg(id)); + } + else + { + CMatchingUtils::addLogDetailsToList(log, logCallsign, QString("Did not find livery in DB for id '%1'").arg(id)); + } + } + return livery; + } + + int CAircraftMatcher::reverseLookupByIds(const DBTripleIds &ids, CAircraftIcaoCode &aircraftIcao, CLivery &livery, const CCallsign &logCallsign, CStatusMessageList *log) + { + int found = 0; + if (ids.livery >= 0) + { + livery = CAircraftMatcher::reverseLookupLiveryId(ids.livery, logCallsign, log); + if (livery.hasValidDbKey()) { found++; } + } + + if (ids.aircraft >= 0) + { + aircraftIcao = CAircraftMatcher::reverseLookupAircraftIcaoId(ids.aircraft, logCallsign, log); + if (aircraftIcao.hasValidDbKey()) { found++; } + } + return found; + } + QString CAircraftMatcher::reverseLookupAirlineName(const QString &candidate, const CCallsign &callsign, CStatusMessageList *log) { if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return ""; } diff --git a/src/blackcore/aircraftmatcher.h b/src/blackcore/aircraftmatcher.h index 8971c2a83..64ff24c40 100644 --- a/src/blackcore/aircraftmatcher.h +++ b/src/blackcore/aircraftmatcher.h @@ -95,6 +95,18 @@ namespace BlackCore const BlackMisc::Simulation::CAircraftModel &modelToLookup, const QString &networkLiveryInfo, BlackMisc::CStatusMessageList *log = nullptr); + //! Try to find model by model string + //! \threadsafe + //! \ingroup reverselookup + static BlackMisc::Simulation::CAircraftModel reverseLookupModelString( + const QString &modelString, const BlackMisc::Aviation::CCallsign &callsign, BlackMisc::CStatusMessageList *log = nullptr); + + //! Try to find model by id + //! \threadsafe + //! \ingroup reverselookup + static BlackMisc::Simulation::CAircraftModel reverseLookupModelId( + int id, const BlackMisc::Aviation::CCallsign &callsign, BlackMisc::CStatusMessageList *log = nullptr); + //! Try to find the DB corresponding ICAO code //! \threadsafe //! \ingroup reverselookup @@ -103,6 +115,11 @@ namespace BlackCore const BlackMisc::Aviation::CCallsign &logCallsign = BlackMisc::Aviation::CCallsign(), BlackMisc::CStatusMessageList *log = nullptr); + //! Lookup of ICAO by id + //! \threadsafe + //! \ingroup reverselookup + static BlackMisc::Aviation::CAircraftIcaoCode reverseLookupAircraftIcaoId(int id, const BlackMisc::Aviation::CCallsign &logCallsign, BlackMisc::CStatusMessageList *log = nullptr); + //! Try to find the DB corresponding ICAO code //! \threadsafe //! \ingroup reverselookup @@ -117,6 +134,16 @@ namespace BlackCore const BlackMisc::Aviation::CAirlineIcaoCode &airline, const BlackMisc::Aviation::CCallsign &callsign, BlackMisc::CStatusMessageList *log = nullptr); + //! Lookup of livery by id + //! \threadsafe + //! \ingroup reverselookup + static BlackMisc::Aviation::CLivery reverseLookupLiveryId(int id, const BlackMisc::Aviation::CCallsign &logCallsign, BlackMisc::CStatusMessageList *log = nullptr); + + //! Lookup by ids + //! \threadsafe + //! \ingroup reverselookup + static int reverseLookupByIds(const BlackMisc::Simulation::DBTripleIds &ids, BlackMisc::Aviation::CAircraftIcaoCode &aircraftIcao, BlackMisc::Aviation::CLivery &livery, const BlackMisc::Aviation::CCallsign &logCallsign, BlackMisc::CStatusMessageList *log = nullptr); + //! Lookup of airline name //! \threadsafe //! \ingroup reverselookup