From ae2eb667215b869fbed12f6b47d9be3dadef46e7 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 27 Jun 2017 00:29:25 +0200 Subject: [PATCH] Ref T26, improved reverse lookup: * use most relevant manufacturer * reverse lookup of telephony designator and manufacturer --- src/blackcore/aircraftmatcher.cpp | 67 +++++++++++++++++++++++-------- src/blackcore/aircraftmatcher.h | 10 ++++- 2 files changed, 59 insertions(+), 18 deletions(-) diff --git a/src/blackcore/aircraftmatcher.cpp b/src/blackcore/aircraftmatcher.cpp index 8139424a6..cd8cd62f3 100644 --- a/src/blackcore/aircraftmatcher.cpp +++ b/src/blackcore/aircraftmatcher.cpp @@ -171,7 +171,7 @@ namespace BlackCore CAirlineIcaoCode airlineIcaoCode(model.getAirlineIcaoCode()); if (!airlineIcaoCode.isLoadedFromDb()) { - airlineIcaoCode = CAircraftMatcher::reverseLookupAirlineIcao(airlineIcaoCode.getDesignator(), callsign, log); + airlineIcaoCode = CAircraftMatcher::reverseLookupAirlineIcao(airlineIcaoCode, callsign, log); } // try to match by livery @@ -252,7 +252,6 @@ namespace BlackCore const QString designator(icaoCandidate.getDesignator()); CAircraftIcaoCodeList foundIcaos = sApp->getWebDataServices()->getAircraftIcaoCodesForDesignator(designator); - foundIcaos.sortByRank(); if (foundIcaos.isEmpty()) { @@ -301,28 +300,30 @@ namespace BlackCore else { // multiple ICAOs - bool reduced = false; - foundIcaos.groupByDesignatorAndManufacturer(); - ifPossibleReduceAircraftIcaoByManufacturer(icaoCandidate, foundIcaos, "Reverse lookup reduction", reduced, logCallsign, log); - CAircraftIcaoCode icao = foundIcaos.front(); - icao = CAircraftIcaoCode(icao.getDesignator(), icao.getIataCode(), "", "", icao.getWtc(), icao.isRealWorld(), icao.isLegacyAircraft(), icao.isMilitary(), 10); - CMatchingUtils::addLogDetailsToList(log, logCallsign, QString("Reverse lookup of ICAO '%1'', found >1 manufacturer (ambiguous), using ICAO '%2'").arg(designator, icao.toQString()), CAircraftMatcher::getLogCategories()); + const QPair maxManufacturer = foundIcaos.maxCountManufacturer(); + CMatchingUtils::addLogDetailsToList(log, logCallsign, QString("Reverse lookup of ICAO '%1'', found %2 values (ambiguous)").arg(designator).arg(foundIcaos.size()), CAircraftMatcher::getLogCategories()); + if (maxManufacturer.second < foundIcaos.size()) + { + foundIcaos = foundIcaos.findByManufacturer(maxManufacturer.first); + CMatchingUtils::addLogDetailsToList(log, logCallsign, QString("Reducing by manufacturer '%1', now %2 values").arg(maxManufacturer.first).arg(foundIcaos.size()), CAircraftMatcher::getLogCategories()); + } + foundIcaos.sortByRank(); + CAircraftIcaoCode icao = foundIcaos.front(); // best rank + CMatchingUtils::addLogDetailsToList(log, logCallsign, QString("Reverse lookup of ICAO '%1'', using ICAO '%2' with rank %3").arg(designator, icao.toQString(), icao.getRankString()), CAircraftMatcher::getLogCategories()); return icao; } - return CAircraftIcaoCode(icaoCandidate); } - CAirlineIcaoCode BlackCore::CAircraftMatcher::reverseLookupAirlineIcao(const QString &icaoDesignator, const CCallsign &callsign, CStatusMessageList *log) + CAirlineIcaoCode CAircraftMatcher::reverseLookupAirlineIcao(const CAirlineIcaoCode &icaoPattern, const CCallsign &callsign, CStatusMessageList *log) { Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing sApp"); Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "No web services"); - const QString designator(icaoDesignator.trimmed().toUpper()); - const CAirlineIcaoCode icao = sApp->getWebDataServices()->smartAirlineIcaoSelector(designator, callsign); + const CAirlineIcaoCode icao = sApp->getWebDataServices()->smartAirlineIcaoSelector(icaoPattern, callsign); if (log) { - if (icao.hasValidDbKey()) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup of airline '%1' and callsign '%2' found '%3'").arg(designator, callsign.asString(), icao.getDesignator()), CAircraftMatcher::getLogCategories()); } - else { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup of airline '%1' and callsign '%2', nothing found").arg(designator, callsign.asString()), CAircraftMatcher::getLogCategories()); } + if (icao.hasValidDbKey()) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup of airline '%1' and callsign '%2' found '%3'").arg(icaoPattern.getDesignator(), callsign.asString(), icao.getDesignator()), CAircraftMatcher::getLogCategories()); } + else { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup of airline '%1' and callsign '%2', nothing found").arg(icaoPattern.getDesignator(), callsign.asString()), CAircraftMatcher::getLogCategories()); } } return icao; } @@ -347,6 +348,38 @@ namespace BlackCore return livery; } + QString CAircraftMatcher::reverseLookupAirlineName(const QString &candidate, const CCallsign &callsign, CStatusMessageList *log) + { + Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing sApp"); + Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "No web services"); + if (candidate.isEmpty()) { return ""; } + const QStringList names = sApp->getWebDataServices()->getAirlineNames(); + if (names.contains(candidate, Qt::CaseInsensitive)) + { + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Airline name '%1' found").arg(candidate)); + return candidate; + } + + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Airline name '%1' not found").arg(candidate)); + return ""; + } + + QString CAircraftMatcher::reverseLookupTelephonyDesignator(const QString &candidate, const CCallsign &callsign, CStatusMessageList *log) + { + Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing sApp"); + Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "No web services"); + if (candidate.isEmpty()) { return ""; } + const QStringList designators = sApp->getWebDataServices()->getTelephonyDesignators(); + if (designators.contains(candidate, Qt::CaseInsensitive)) + { + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Airline name '%1' found").arg(candidate)); + return candidate; + } + + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Airline name '%1' not found").arg(candidate)); + return ""; + } + CAirlineIcaoCode CAircraftMatcher::callsignToAirline(const CCallsign &callsign, CStatusMessageList *log) { if (callsign.isEmpty() || !sApp || !sApp->getWebDataServices()) { return CAirlineIcaoCode(); } @@ -422,18 +455,18 @@ namespace BlackCore } // resolve airline, mostly needed because of vPilot not sending airline icao codes in version 1 - QString airlineIcaoChecked(airlineIcao.trimmed().toUpper()); + CAirlineIcaoCode airlineIcaoChecked(airlineIcao); if (airlineIcao.isEmpty()) { const CAirlineIcaoCode al = CAircraftMatcher::reverseLookupAirlineIcao(airlineIcao, callsign); if (al.isLoadedFromDb()) { - airlineIcaoChecked = al.getDesignator(); + airlineIcaoChecked = al; } } CMatchingStatisticsEntry::EntryType type = CMatchingStatisticsEntry::Missing; - if (airlineIcaoChecked.isEmpty()) + if (airlineIcaoChecked.hasValidDesignator()) { type = this->m_modelSet.containsModelsWithAircraftAndAirlineIcaoDesignator(aircraftIcao, airlineIcao) ? CMatchingStatisticsEntry::Found : diff --git a/src/blackcore/aircraftmatcher.h b/src/blackcore/aircraftmatcher.h index 04d0cc82d..7b89205dd 100644 --- a/src/blackcore/aircraftmatcher.h +++ b/src/blackcore/aircraftmatcher.h @@ -88,12 +88,20 @@ namespace BlackCore //! Try to find the DB corresponding ICAO code //! \threadsafe - static BlackMisc::Aviation::CAirlineIcaoCode reverseLookupAirlineIcao(const QString &icaoDesignator, const BlackMisc::Aviation::CCallsign &callsign = BlackMisc::Aviation::CCallsign(), BlackMisc::CStatusMessageList *log = nullptr); + static BlackMisc::Aviation::CAirlineIcaoCode reverseLookupAirlineIcao(const BlackMisc::Aviation::CAirlineIcaoCode &icaoPattern, const BlackMisc::Aviation::CCallsign &callsign = BlackMisc::Aviation::CCallsign(), BlackMisc::CStatusMessageList *log = nullptr); //! Lookup of standard livery //! \threadsafe static BlackMisc::Aviation::CLivery reverseLookupStandardLivery(const BlackMisc::Aviation::CAirlineIcaoCode &airline, const BlackMisc::Aviation::CCallsign &callsign, BlackMisc::CStatusMessageList *log = nullptr); + //! Lookup of airline name + //! \threadsafe + static QString reverseLookupAirlineName(const QString &candidate, const BlackMisc::Aviation::CCallsign &callsign = {}, BlackMisc::CStatusMessageList *log = nullptr); + + //! Lookup of telephony designator + //! \threadsafe + static QString reverseLookupTelephonyDesignator(const QString &candidate, const BlackMisc::Aviation::CCallsign &callsign = {}, BlackMisc::CStatusMessageList *log = nullptr); + //! Turn callsign into airline //! \threadsafe static BlackMisc::Aviation::CAirlineIcaoCode callsignToAirline(const BlackMisc::Aviation::CCallsign &callsign, BlackMisc::CStatusMessageList *log = nullptr);