From c9ec28442e22fb143bce455f156d750bc76a66d4 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 11 Jul 2019 20:59:42 +0200 Subject: [PATCH] Ref T701, matcher functions to used model set in matching, and better resolve ambiguous airline ICAOs * reduce by telephony/airline name * search in model set first for airline ICAO Rational: If a user flies with modelset this most likely represents the airlines needed most in his area --- src/blackcore/aircraftmatcher.cpp | 77 ++++++++++++++++++++++++++++--- src/blackcore/aircraftmatcher.h | 26 +++++++---- 2 files changed, 87 insertions(+), 16 deletions(-) diff --git a/src/blackcore/aircraftmatcher.cpp b/src/blackcore/aircraftmatcher.cpp index 341c5a3c9..cb2b4f74d 100644 --- a/src/blackcore/aircraftmatcher.cpp +++ b/src/blackcore/aircraftmatcher.cpp @@ -109,7 +109,7 @@ namespace BlackCore return code; } - CAirlineIcaoCode CAircraftMatcher::failoverValidAirlineIcaoDesignator(const CCallsign &callsign, const QString &primaryIcao, const QString &secondaryIcao, bool airlineFromCallsign, const CAircraftModelList &models, CStatusMessageList *log) + CAirlineIcaoCode CAircraftMatcher::failoverValidAirlineIcaoDesignator(const CCallsign &callsign, const QString &primaryIcao, const QString &secondaryIcao, bool airlineFromCallsign, const QString &airlineName, const QString &airlineTelephony, 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"). @@ -121,14 +121,29 @@ namespace BlackCore return CAirlineIcaoCode(); } + static const QString info("Multiple models (%1) with airline ICAOs for '%2'"); CAirlineIcaoCode code; + do { + bool reduced = false; if (!primaryIcao.isEmpty()) { - const CAircraftModelList modelsWithAirline = models.findByIcaoDesignators({}, primaryIcao); + CAircraftModelList modelsWithAirline = models.findByIcaoDesignators({}, primaryIcao); + const QMap countPerAirline = modelsWithAirline.countPerAirlineIcao(); + if (countPerAirline.size() == 1) + { + code = countPerAirline.firstKey(); + CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Only found 1 airline ICAO '%1' in %2 models").arg(countPerAirline.firstKey().getDesignatorDbKey()).arg(models.size()), getLogCategories()); + break; + } + if (modelsWithAirline.size() > 0) { + if (modelsWithAirline.size() > 1) + { + modelsWithAirline = CAircraftMatcher::ifPossibleReduceByAirlineNameTelephonyDesignator(callsign, airlineName, airlineTelephony, modelsWithAirline, info.arg(modelsWithAirline.size()).arg(primaryIcao), reduced, log); + } code = modelsWithAirline.getAirlineWithMaxCount(); CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Using primary airline ICAO '%1' found '%2'").arg(primaryIcao, code.getDesignatorDbKey()), getLogCategories()); break; @@ -137,9 +152,21 @@ namespace BlackCore if (!secondaryIcao.isEmpty()) { - const CAircraftModelList modelsWithAirline = models.findByIcaoDesignators({}, secondaryIcao); + CAircraftModelList modelsWithAirline = models.findByIcaoDesignators({}, secondaryIcao); + const QMap countPerAirline = modelsWithAirline.countPerAirlineIcao(); + if (countPerAirline.size() == 1) + { + code = countPerAirline.firstKey(); + CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Only found 1 airline ICAO '%1' in %2 models").arg(countPerAirline.firstKey().getDesignatorDbKey()).arg(models.size()), getLogCategories()); + break; + } + if (modelsWithAirline.size() > 0) { + if (modelsWithAirline.size() > 1) + { + modelsWithAirline = CAircraftMatcher::ifPossibleReduceByAirlineNameTelephonyDesignator(callsign, airlineName, airlineTelephony, modelsWithAirline, info.arg(modelsWithAirline.size()).arg(secondaryIcao), reduced, log); + } code = modelsWithAirline.getAirlineWithMaxCount(); CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Using secondary airline ICAO '%1' found '%2'").arg(primaryIcao, code.getDesignatorDbKey()), getLogCategories()); break; @@ -148,10 +175,28 @@ namespace BlackCore if (airlineFromCallsign) { - const QString airlinePrefix = callsign.getAirlinePrefix(); - const CAircraftModelList modelsWithAirline = models.findByIcaoDesignators({}, airlinePrefix); + QString flightNumber; + const QString airlinePrefix = callsign.getAirlinePrefix(flightNumber); + if (airlinePrefix.isEmpty() || flightNumber.isEmpty()) + { + CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Callsign '%1' cannot be split in airline '%1'/ flight number '%2'").arg(callsign.toQString(), flightNumber), getLogCategories()); + break; + } + + CAircraftModelList modelsWithAirline = models.findByIcaoDesignators({}, airlinePrefix); + const QMap countPerAirline = modelsWithAirline.countPerAirlineIcao(); + if (countPerAirline.size() == 1) + { + code = countPerAirline.firstKey(); + CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Only found 1 airline ICAO '%1' in %2 models").arg(countPerAirline.firstKey().getDesignatorDbKey()).arg(models.size()), getLogCategories()); + break; + } if (modelsWithAirline.size() > 0) { + if (modelsWithAirline.size() > 1) + { + modelsWithAirline = CAircraftMatcher::ifPossibleReduceByAirlineNameTelephonyDesignator(callsign, airlineName, airlineTelephony, modelsWithAirline, info.arg(modelsWithAirline.size()).arg(airlinePrefix), reduced, log); + } code = modelsWithAirline.getAirlineWithMaxCount(); CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Using secondary airline ICAO '%1' found '%2'").arg(primaryIcao, code.getDesignatorDbKey()), getLogCategories()); break; @@ -164,11 +209,11 @@ namespace BlackCore return code; } - CAirlineIcaoCode CAircraftMatcher::failoverValidAirlineIcaoDesignatorModelsFirst(const CCallsign &callsign, const QString &primaryIcao, const QString &secondaryIcao, bool airlineFromCallsign, const CAircraftModelList &models, CStatusMessageList *log) + CAirlineIcaoCode CAircraftMatcher::failoverValidAirlineIcaoDesignatorModelsFirst(const CCallsign &callsign, const QString &primaryIcao, const QString &secondaryIcao, bool airlineFromCallsign, const QString &airlineName, const QString &airlineTelephony, const CAircraftModelList &models, CStatusMessageList *log) { if (!models.isEmpty()) { - const CAirlineIcaoCode airline = CAircraftMatcher::failoverValidAirlineIcaoDesignator(callsign, primaryIcao, secondaryIcao, airlineFromCallsign, models, log); + const CAirlineIcaoCode airline = CAircraftMatcher::failoverValidAirlineIcaoDesignator(callsign, primaryIcao, secondaryIcao, airlineFromCallsign, airlineName, airlineTelephony, models, log); if (airline.hasValidDbKey()) { return airline; } } @@ -1667,6 +1712,24 @@ namespace BlackCore return outList; } + CAircraftModelList CAircraftMatcher::ifPossibleReduceByAirlineNameTelephonyDesignator(const CCallsign &cs, const QString &airlineName, const QString &telephony, const CAircraftModelList &inList, const QString &info, bool &reduced, CStatusMessageList *log) + { + reduced = false; + if (inList.isEmpty()) + { + if (log) { CMatchingUtils::addLogDetailsToList(log, cs, info % u" Empty input list, cannot reduce", getLogCategories()); } + return inList; + } + + if (telephony.isEmpty() && airlineName.isEmpty()) + { + if (log) { CMatchingUtils::addLogDetailsToList(log, cs, info % u" No name/telephony, cannot reduce " % QString::number(inList.size()) % u" entries", getLogCategories()); } + return inList; + } + + return inList; + } + CAircraftModelList CAircraftMatcher::ifPossibleReduceByCombinedType(const CSimulatedAircraft &remoteAircraft, const CAircraftModelList &inList, const CAircraftMatcherSetup &setup, bool &reduced, CStatusMessageList *log) { reduced = false; diff --git a/src/blackcore/aircraftmatcher.h b/src/blackcore/aircraftmatcher.h index 690aff35f..0d457d286 100644 --- a/src/blackcore/aircraftmatcher.h +++ b/src/blackcore/aircraftmatcher.h @@ -100,18 +100,19 @@ namespace BlackCore const BlackMisc::Aviation::CCallsign &callsign, const QString &primaryIcao, const QString &secondaryIcao, bool airlineFromCallsign, + const QString &airlineName, const QString &airlineTelephony, 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); + static BlackMisc::Aviation::CAirlineIcaoCode failoverValidAirlineIcaoDesignatorModelsFirst(const BlackMisc::Aviation::CCallsign &callsign, + const QString &primaryIcao, const QString &secondaryIcao, + bool airlineFromCallsign, + const QString &airlineName, const QString &airlineTelephony, + const BlackMisc::Simulation::CAircraftModelList &models, + BlackMisc::CStatusMessageList *log = nullptr); //! Run the network reverse lookup script //! \threadsafe @@ -248,11 +249,14 @@ namespace BlackCore //! \threadsafe static BlackMisc::Aviation::CAirlineIcaoCode callsignToAirline(const BlackMisc::Aviation::CCallsign &callsign, BlackMisc::CStatusMessageList *log = nullptr); - //! Get the models - const BlackMisc::Simulation::CAircraftModelList &getModelSet() const { return m_modelSet; } + //! \copydoc BlackMisc::Simulation::IAircraftModelSetProvider::getModelSet + virtual BlackMisc::Simulation::CAircraftModelList getModelSet() const override { return m_modelSet; } + + //! Model set as reference + virtual const BlackMisc::Simulation::CAircraftModelList &getModelSetRef() const { return m_modelSet; } //! Model set count - int getModelSetCount() const { return m_modelSet.sizeInt(); } + virtual int getModelSetCount() const override { return m_modelSet.sizeInt(); } //! Models bool hasModels() const { return !m_modelSet.isEmpty(); } @@ -352,6 +356,10 @@ namespace BlackCore //! \threadsafe static BlackMisc::Simulation::CAircraftModelList ifPossibleReduceByAirline(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft, const BlackMisc::Simulation::CAircraftModelList &inList, const BlackMisc::Simulation::CAircraftMatcherSetup &setup, const QString &info, bool &reduced, BlackMisc::CStatusMessageList *log); + //! Reduce by airline name/telephone designator + //! \threadsafe + static BlackMisc::Simulation::CAircraftModelList ifPossibleReduceByAirlineNameTelephonyDesignator(const BlackMisc::Aviation::CCallsign &cs, const QString &airlineName, const QString &telephony, const BlackMisc::Simulation::CAircraftModelList &inList, const QString &info, bool &reduced, BlackMisc::CStatusMessageList *log); + //! Installed models by combined code (ie L2J, L1P, ...) //! \threadsafe static BlackMisc::Simulation::CAircraftModelList ifPossibleReduceByCombinedType(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft, const BlackMisc::Simulation::CAircraftModelList &inList, const BlackMisc::Simulation::CAircraftMatcherSetup &setup, bool &reduced, BlackMisc::CStatusMessageList *log);