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
This commit is contained in:
Klaus Basan
2019-07-11 20:59:42 +02:00
committed by Mat Sutcliffe
parent 1d4d3d81d0
commit c9ec28442e
2 changed files with 87 additions and 16 deletions

View File

@@ -109,7 +109,7 @@ namespace BlackCore
return code; 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, CMatchingUtils::addLogDetailsToList(log, callsign,
QStringLiteral("Find airline designator from 1st: '%1' 2nd: '%2' callsign: '%3', use airline callsign: %4, models: %5"). 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(); return CAirlineIcaoCode();
} }
static const QString info("Multiple models (%1) with airline ICAOs for '%2'");
CAirlineIcaoCode code; CAirlineIcaoCode code;
do do
{ {
bool reduced = false;
if (!primaryIcao.isEmpty()) if (!primaryIcao.isEmpty())
{ {
const CAircraftModelList modelsWithAirline = models.findByIcaoDesignators({}, primaryIcao); CAircraftModelList modelsWithAirline = models.findByIcaoDesignators({}, primaryIcao);
const QMap<CAirlineIcaoCode, int> 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() > 0)
{ {
if (modelsWithAirline.size() > 1)
{
modelsWithAirline = CAircraftMatcher::ifPossibleReduceByAirlineNameTelephonyDesignator(callsign, airlineName, airlineTelephony, modelsWithAirline, info.arg(modelsWithAirline.size()).arg(primaryIcao), reduced, log);
}
code = modelsWithAirline.getAirlineWithMaxCount(); code = modelsWithAirline.getAirlineWithMaxCount();
CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Using primary airline ICAO '%1' found '%2'").arg(primaryIcao, code.getDesignatorDbKey()), getLogCategories()); CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Using primary airline ICAO '%1' found '%2'").arg(primaryIcao, code.getDesignatorDbKey()), getLogCategories());
break; break;
@@ -137,9 +152,21 @@ namespace BlackCore
if (!secondaryIcao.isEmpty()) if (!secondaryIcao.isEmpty())
{ {
const CAircraftModelList modelsWithAirline = models.findByIcaoDesignators({}, secondaryIcao); CAircraftModelList modelsWithAirline = models.findByIcaoDesignators({}, secondaryIcao);
const QMap<CAirlineIcaoCode, int> 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() > 0)
{ {
if (modelsWithAirline.size() > 1)
{
modelsWithAirline = CAircraftMatcher::ifPossibleReduceByAirlineNameTelephonyDesignator(callsign, airlineName, airlineTelephony, modelsWithAirline, info.arg(modelsWithAirline.size()).arg(secondaryIcao), reduced, log);
}
code = modelsWithAirline.getAirlineWithMaxCount(); code = modelsWithAirline.getAirlineWithMaxCount();
CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Using secondary airline ICAO '%1' found '%2'").arg(primaryIcao, code.getDesignatorDbKey()), getLogCategories()); CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Using secondary airline ICAO '%1' found '%2'").arg(primaryIcao, code.getDesignatorDbKey()), getLogCategories());
break; break;
@@ -148,10 +175,28 @@ namespace BlackCore
if (airlineFromCallsign) if (airlineFromCallsign)
{ {
const QString airlinePrefix = callsign.getAirlinePrefix(); QString flightNumber;
const CAircraftModelList modelsWithAirline = models.findByIcaoDesignators({}, airlinePrefix); 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<CAirlineIcaoCode, int> 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() > 0)
{ {
if (modelsWithAirline.size() > 1)
{
modelsWithAirline = CAircraftMatcher::ifPossibleReduceByAirlineNameTelephonyDesignator(callsign, airlineName, airlineTelephony, modelsWithAirline, info.arg(modelsWithAirline.size()).arg(airlinePrefix), reduced, log);
}
code = modelsWithAirline.getAirlineWithMaxCount(); code = modelsWithAirline.getAirlineWithMaxCount();
CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Using secondary airline ICAO '%1' found '%2'").arg(primaryIcao, code.getDesignatorDbKey()), getLogCategories()); CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("Using secondary airline ICAO '%1' found '%2'").arg(primaryIcao, code.getDesignatorDbKey()), getLogCategories());
break; break;
@@ -164,11 +209,11 @@ namespace BlackCore
return code; 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()) 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; } if (airline.hasValidDbKey()) { return airline; }
} }
@@ -1667,6 +1712,24 @@ namespace BlackCore
return outList; 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) CAircraftModelList CAircraftMatcher::ifPossibleReduceByCombinedType(const CSimulatedAircraft &remoteAircraft, const CAircraftModelList &inList, const CAircraftMatcherSetup &setup, bool &reduced, CStatusMessageList *log)
{ {
reduced = false; reduced = false;

View File

@@ -100,18 +100,19 @@ namespace BlackCore
const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CCallsign &callsign,
const QString &primaryIcao, const QString &secondaryIcao, const QString &primaryIcao, const QString &secondaryIcao,
bool airlineFromCallsign, bool airlineFromCallsign,
const QString &airlineName, const QString &airlineTelephony,
const BlackMisc::Simulation::CAircraftModelList &models, const BlackMisc::Simulation::CAircraftModelList &models,
BlackMisc::CStatusMessageList *log = nullptr); BlackMisc::CStatusMessageList *log = nullptr);
//! Return an valid airline ICAO code from a given model list and use webservices if NOT found //! 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 //! \remarks model list could be the model set
//! \threadsafe //! \threadsafe
static BlackMisc::Aviation::CAirlineIcaoCode failoverValidAirlineIcaoDesignatorModelsFirst( static BlackMisc::Aviation::CAirlineIcaoCode failoverValidAirlineIcaoDesignatorModelsFirst(const BlackMisc::Aviation::CCallsign &callsign,
const BlackMisc::Aviation::CCallsign &callsign, const QString &primaryIcao, const QString &secondaryIcao,
const QString &primaryIcao, const QString &secondaryIcao, bool airlineFromCallsign,
bool airlineFromCallsign, const QString &airlineName, const QString &airlineTelephony,
const BlackMisc::Simulation::CAircraftModelList &models, const BlackMisc::Simulation::CAircraftModelList &models,
BlackMisc::CStatusMessageList *log = nullptr); BlackMisc::CStatusMessageList *log = nullptr);
//! Run the network reverse lookup script //! Run the network reverse lookup script
//! \threadsafe //! \threadsafe
@@ -248,11 +249,14 @@ namespace BlackCore
//! \threadsafe //! \threadsafe
static BlackMisc::Aviation::CAirlineIcaoCode callsignToAirline(const BlackMisc::Aviation::CCallsign &callsign, BlackMisc::CStatusMessageList *log = nullptr); static BlackMisc::Aviation::CAirlineIcaoCode callsignToAirline(const BlackMisc::Aviation::CCallsign &callsign, BlackMisc::CStatusMessageList *log = nullptr);
//! Get the models //! \copydoc BlackMisc::Simulation::IAircraftModelSetProvider::getModelSet
const BlackMisc::Simulation::CAircraftModelList &getModelSet() const { return m_modelSet; } 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 //! Model set count
int getModelSetCount() const { return m_modelSet.sizeInt(); } virtual int getModelSetCount() const override { return m_modelSet.sizeInt(); }
//! Models //! Models
bool hasModels() const { return !m_modelSet.isEmpty(); } bool hasModels() const { return !m_modelSet.isEmpty(); }
@@ -352,6 +356,10 @@ namespace BlackCore
//! \threadsafe //! \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); 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, ...) //! Installed models by combined code (ie L2J, L1P, ...)
//! \threadsafe //! \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); 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);