From 69b3402301bb784b13b62ea38db52bed436e39e4 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Mon, 8 Jul 2019 01:18:16 +0200 Subject: [PATCH] Ref T701, reverse lookup against given model list (which could be the model set) --- src/blackcore/aircraftmatcher.cpp | 76 +++++++++++++++++++++++++++++-- src/blackcore/aircraftmatcher.h | 20 ++++++++ 2 files changed, 91 insertions(+), 5 deletions(-) diff --git a/src/blackcore/aircraftmatcher.cpp b/src/blackcore/aircraftmatcher.cpp index 395f0b255..341c5a3c9 100644 --- a/src/blackcore/aircraftmatcher.cpp +++ b/src/blackcore/aircraftmatcher.cpp @@ -95,11 +95,11 @@ namespace BlackCore CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Two invalid airline ICAO codes (primary/secondary) '%1', '%2'").arg(primaryIcao, secondaryIcao), getLogCategories()); if (airlineFromCallsign) { - const QString airlineSuffix = callsign.getAirlinePrefix(); - if (CAircraftMatcher::isValidAirlineIcaoDesignator(airlineSuffix, useWebServices)) + const QString airlinePrefix = callsign.getAirlinePrefix(); + if (CAircraftMatcher::isValidAirlineIcaoDesignator(airlinePrefix, useWebServices)) { - CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Using airline from callsign '%1', suffix: '%2'").arg(callsign.toQString(), airlineSuffix), getLogCategories()); - code = stringToAirlineIcaoObject(airlineSuffix, useWebServices); + CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Using airline from callsign '%1', suffix: '%2'").arg(callsign.toQString(), airlinePrefix), getLogCategories()); + code = stringToAirlineIcaoObject(airlinePrefix, useWebServices); break; } } @@ -109,6 +109,72 @@ namespace BlackCore return code; } + CAirlineIcaoCode CAircraftMatcher::failoverValidAirlineIcaoDesignator(const CCallsign &callsign, const QString &primaryIcao, const QString &secondaryIcao, bool airlineFromCallsign, const CAircraftModelList &models, CStatusMessageList *log) + { + CMatchingUtils::addLogDetailsToList(log, callsign, + QStringLiteral("Find airline designator from 1st: '%1' 2nd: '%2' callsign: '%3', use airline callsign: %4, models: %5"). + arg(primaryIcao, secondaryIcao, callsign.getAirlinePrefix(), boolToYesNo(airlineFromCallsign), models.sizeString()), getLogCategories()); + + if (models.isEmpty()) + { + CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("No models to find airline from")); + return CAirlineIcaoCode(); + } + + CAirlineIcaoCode code; + do + { + if (!primaryIcao.isEmpty()) + { + const CAircraftModelList modelsWithAirline = models.findByIcaoDesignators({}, primaryIcao); + if (modelsWithAirline.size() > 0) + { + code = modelsWithAirline.getAirlineWithMaxCount(); + CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Using primary airline ICAO '%1' found '%2'").arg(primaryIcao, code.getDesignatorDbKey()), getLogCategories()); + break; + } + } + + if (!secondaryIcao.isEmpty()) + { + const CAircraftModelList modelsWithAirline = models.findByIcaoDesignators({}, secondaryIcao); + if (modelsWithAirline.size() > 0) + { + code = modelsWithAirline.getAirlineWithMaxCount(); + CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Using secondary airline ICAO '%1' found '%2'").arg(primaryIcao, code.getDesignatorDbKey()), getLogCategories()); + break; + } + } + + if (airlineFromCallsign) + { + const QString airlinePrefix = callsign.getAirlinePrefix(); + const CAircraftModelList modelsWithAirline = models.findByIcaoDesignators({}, airlinePrefix); + if (modelsWithAirline.size() > 0) + { + code = modelsWithAirline.getAirlineWithMaxCount(); + CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Using secondary airline ICAO '%1' found '%2'").arg(primaryIcao, code.getDesignatorDbKey()), getLogCategories()); + break; + } + } + } + while (false); + + CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Resolved to airline designator: %1").arg(code.toQString(true))); + return code; + } + + CAirlineIcaoCode CAircraftMatcher::failoverValidAirlineIcaoDesignatorModelsFirst(const CCallsign &callsign, const QString &primaryIcao, const QString &secondaryIcao, bool airlineFromCallsign, const CAircraftModelList &models, CStatusMessageList *log) + { + if (!models.isEmpty()) + { + const CAirlineIcaoCode airline = CAircraftMatcher::failoverValidAirlineIcaoDesignator(callsign, primaryIcao, secondaryIcao, airlineFromCallsign, models, log); + if (airline.hasValidDbKey()) { return airline; } + } + + return CAircraftMatcher::failoverValidAirlineIcaoDesignator(callsign, primaryIcao, secondaryIcao, airlineFromCallsign, true, log); + } + CAircraftModel CAircraftMatcher::getClosestMatch(const CSimulatedAircraft &remoteAircraft, MatchingLog whatToLog, CStatusMessageList *log, bool useMatchingScript) const { CAircraftModelList modelSet(m_modelSet); // Models for this matching @@ -1687,7 +1753,7 @@ namespace BlackCore { if (!useSwiftDbData) { return CAirlineIcaoCode(designator); } if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return CAirlineIcaoCode(designator); } - CAirlineIcaoCode code = sApp->getWebDataServices()->getAirlineIcaoCodeForUniqueDesignatorOrDefault(designator, true); + const CAirlineIcaoCode code = sApp->getWebDataServices()->getAirlineIcaoCodeForUniqueDesignatorOrDefault(designator, true); return code.isLoadedFromDb() ? code : CAirlineIcaoCode(designator); } diff --git a/src/blackcore/aircraftmatcher.h b/src/blackcore/aircraftmatcher.h index 1cec2608f..d535f46c2 100644 --- a/src/blackcore/aircraftmatcher.h +++ b/src/blackcore/aircraftmatcher.h @@ -89,6 +89,26 @@ namespace BlackCore const QString &primaryIcao, const QString &secondaryIcao, bool airlineFromCallsign, bool useWebServices, BlackMisc::CStatusMessageList *log = nullptr); + //! Return an valid airline ICAO code from a given model list + //! \remarks model list could be the model set + //! \threadsafe + static BlackMisc::Aviation::CAirlineIcaoCode failoverValidAirlineIcaoDesignator( + const BlackMisc::Aviation::CCallsign &callsign, + const QString &primaryIcao, const QString &secondaryIcao, + bool airlineFromCallsign, + const BlackMisc::Simulation::CAircraftModelList &models, + BlackMisc::CStatusMessageList *log = nullptr); + + //! Return an valid airline ICAO code from a given model list and use webservices if NOT found + //! \remarks model list could be the model set + //! \threadsafe + static BlackMisc::Aviation::CAirlineIcaoCode failoverValidAirlineIcaoDesignatorModelsFirst( + const BlackMisc::Aviation::CCallsign &callsign, + const QString &primaryIcao, const QString &secondaryIcao, + bool airlineFromCallsign, + const BlackMisc::Simulation::CAircraftModelList &models, + BlackMisc::CStatusMessageList *log = nullptr); + //! Run the network reverse lookup script //! \threadsafe //! \ingroup reverselookup