Resolve airline group during reduction

This commit is contained in:
Klaus Basan
2019-05-21 15:21:48 +02:00
parent 213ca4274d
commit 9f7c685d76
4 changed files with 93 additions and 26 deletions

View File

@@ -125,6 +125,7 @@ namespace BlackCore
"- Aircraft: %3 -> %4\n" "- Aircraft: %3 -> %4\n"
"- Airline: %5 -> %6\n" "- Airline: %5 -> %6\n"
"- Livery: %7 -> %8\n" "- Livery: %7 -> %8\n"
"- Model: %9 -> %10\n"
"-----------------------------------------\n"); "-----------------------------------------\n");
const QDateTime startTime = QDateTime::currentDateTimeUtc(); const QDateTime startTime = QDateTime::currentDateTimeUtc();
@@ -247,13 +248,16 @@ namespace BlackCore
if (log) if (log)
{ {
static const QString nms = "no model string";
CMatchingUtils::addLogDetailsToList(log, remoteAircraft, QStringLiteral("Picking among %1 by strategy '%2'").arg(candidates.size()).arg(CAircraftMatcherSetup::strategyToString(usedStrategy))); CMatchingUtils::addLogDetailsToList(log, remoteAircraft, QStringLiteral("Picking among %1 by strategy '%2'").arg(candidates.size()).arg(CAircraftMatcherSetup::strategyToString(usedStrategy)));
CMatchingUtils::addLogDetailsToList(log, remoteAircraft, CMatchingUtils::addLogDetailsToList(log, remoteAircraft,
summary.arg( summary.arg(
remoteAircraft.getAircraftIcaoCode().getCombinedType(), matchedModel.getAircraftIcaoCode().getCombinedType(), remoteAircraft.getAircraftIcaoCode().getCombinedType(), matchedModel.getAircraftIcaoCode().getCombinedType(),
remoteAircraft.getAircraftIcaoCode().getDesignatorDbKey(), matchedModel.getAircraftIcaoCode().getDesignatorDbKey(), remoteAircraft.getAircraftIcaoCode().getDesignatorDbKey(), matchedModel.getAircraftIcaoCode().getDesignatorDbKey(),
remoteAircraft.getAirlineIcaoCode().getVDesignatorDbKey(), matchedModel.getAirlineIcaoCode().getVDesignatorDbKey(), remoteAircraft.getAirlineIcaoCode().getVDesignatorDbKey(), matchedModel.getAirlineIcaoCode().getVDesignatorDbKey()
remoteAircraft.getLivery().getCombinedCodePlusInfoAndId(), matchedModel.getLivery().getCombinedCodePlusInfoAndId() ).arg(
remoteAircraft.getLivery().getCombinedCodePlusInfoAndId(), matchedModel.getLivery().getCombinedCodePlusInfoAndId(),
defaultIfEmpty(remoteAircraft.getModel().getModelStringAndDbKey(), nms), matchedModel.getModelStringAndDbKey()
)); ));
} }
} }
@@ -590,13 +594,13 @@ namespace BlackCore
if (foundIcaos.size() < 1) if (foundIcaos.size() < 1)
{ {
CMatchingUtils::addLogDetailsToList(log, logCallsign, QStringLiteral("Reverse lookup of aircraft ICAO '%1'', nothing found").arg(designator), CAircraftMatcher::getLogCategories()); CMatchingUtils::addLogDetailsToList(log, logCallsign, QStringLiteral("Reverse lookup of aircraft ICAO '%1', nothing found").arg(designator), CAircraftMatcher::getLogCategories());
return CAircraftIcaoCode(icaoCandidate); return CAircraftIcaoCode(icaoCandidate);
} }
else if (foundIcaos.size() == 1) else if (foundIcaos.size() == 1)
{ {
const CAircraftIcaoCode icao(foundIcaos.front()); const CAircraftIcaoCode icao(foundIcaos.front());
CMatchingUtils::addLogDetailsToList(log, logCallsign, QStringLiteral("Reverse lookup of aircraft ICAO '%1'', found one manufacturer '%2' in DB").arg(designator, icao.getDesignatorManufacturer()), CAircraftMatcher::getLogCategories()); CMatchingUtils::addLogDetailsToList(log, logCallsign, QStringLiteral("Reverse lookup of aircraft ICAO '%1', found one manufacturer '%2' in DB").arg(designator, icao.getDesignatorManufacturer()), CAircraftMatcher::getLogCategories());
return icao; return icao;
} }
else else
@@ -604,7 +608,7 @@ namespace BlackCore
// multiple ICAOs // multiple ICAOs
Q_ASSERT_X(foundIcaos.size() > 1, Q_FUNC_INFO, "Wrong size"); Q_ASSERT_X(foundIcaos.size() > 1, Q_FUNC_INFO, "Wrong size");
const QPair<QString, int> maxManufacturer = foundIcaos.maxCountManufacturer(); const QPair<QString, int> maxManufacturer = foundIcaos.maxCountManufacturer();
CMatchingUtils::addLogDetailsToList(log, logCallsign, QStringLiteral("Reverse lookup of aircraft ICAO '%1'', found %2 values (ambiguous): %3").arg(designator).arg(foundIcaos.size()).arg(foundIcaos.dbKeysAsString(", ")), CAircraftMatcher::getLogCategories()); CMatchingUtils::addLogDetailsToList(log, logCallsign, QStringLiteral("Reverse lookup of aircraft ICAO '%1', found %2 values (ambiguous): %3").arg(designator).arg(foundIcaos.size()).arg(foundIcaos.dbKeysAsString(", ")), CAircraftMatcher::getLogCategories());
if (maxManufacturer.second < foundIcaos.size()) if (maxManufacturer.second < foundIcaos.size())
{ {
foundIcaos = foundIcaos.findByManufacturer(maxManufacturer.first); foundIcaos = foundIcaos.findByManufacturer(maxManufacturer.first);
@@ -612,7 +616,7 @@ namespace BlackCore
} }
foundIcaos.sortByRank(); foundIcaos.sortByRank();
const CAircraftIcaoCode icao = foundIcaos.front(); // best rank const CAircraftIcaoCode icao = foundIcaos.front(); // best rank
CMatchingUtils::addLogDetailsToList(log, logCallsign, QStringLiteral("Reverse lookup of aircraft ICAO '%1'', using ICAO '%2' with rank %3").arg(designator, icao.toQString(), icao.getRankString()), CAircraftMatcher::getLogCategories()); CMatchingUtils::addLogDetailsToList(log, logCallsign, QStringLiteral("Reverse lookup of aircraft ICAO '%1', using ICAO '%2' with rank %3").arg(designator, icao.toQString(), icao.getRankString()), CAircraftMatcher::getLogCategories());
return icao; return icao;
} }
} }
@@ -1016,7 +1020,7 @@ namespace BlackCore
// combined code // combined code
if (mode.testFlag(CAircraftMatcherSetup::ByCombinedType)) if (mode.testFlag(CAircraftMatcherSetup::ByCombinedType))
{ {
matchedModels = ifPossibleReduceByCombinedType(remoteAircraft, matchedModels, reduced, reduceLog); matchedModels = ifPossibleReduceByCombinedType(remoteAircraft, matchedModels, setup, reduced, reduceLog);
if (reduced) { break; } if (reduced) { break; }
} }
else if (log) else if (log)
@@ -1157,7 +1161,7 @@ namespace BlackCore
{ {
bool r1 = false; bool r1 = false;
bool r2 = false; bool r2 = false;
CAircraftModelList models = ifPossibleReduceByAirline(remoteAircraft, inList, QStringLiteral("Reduce by airline first."), r1, log); CAircraftModelList models = ifPossibleReduceByAirline(remoteAircraft, inList, setup, QStringLiteral("Reduce by airline first."), r1, log);
models = ifPossibleReduceByAircraftOrFamily(remoteAircraft, UsePseudoFamily, models, setup, QStringLiteral("Reduce by aircraft ICAO second."), r2, log); models = ifPossibleReduceByAircraftOrFamily(remoteAircraft, UsePseudoFamily, models, setup, QStringLiteral("Reduce by aircraft ICAO second."), r2, log);
reduced = r1 || r2; reduced = r1 || r2;
if (reduced) { return models; } if (reduced) { return models; }
@@ -1167,7 +1171,7 @@ namespace BlackCore
bool r1 = false; bool r1 = false;
bool r2 = false; bool r2 = false;
CAircraftModelList models = ifPossibleReduceByAircraftOrFamily(remoteAircraft, UsePseudoFamily, inList, setup, QStringLiteral("Reduce by aircraft ICAO first."), r1, log); CAircraftModelList models = ifPossibleReduceByAircraftOrFamily(remoteAircraft, UsePseudoFamily, inList, setup, QStringLiteral("Reduce by aircraft ICAO first."), r1, log);
models = ifPossibleReduceByAirline(remoteAircraft, models, QStringLiteral("Reduce aircraft ICAO by airline second."), r2, log); models = ifPossibleReduceByAirline(remoteAircraft, models, setup, QStringLiteral("Reduce aircraft ICAO by airline second."), r2, log);
// not finding anything so far means we have no valid aircraft/airline ICAO combination // not finding anything so far means we have no valid aircraft/airline ICAO combination
// but it can happen we found B738, and for DLH there is no B738 but B737, so we search again // but it can happen we found B738, and for DLH there is no B738 but B737, so we search again
@@ -1182,12 +1186,12 @@ namespace BlackCore
bool r3 = false; bool r3 = false;
QString usedFamily; QString usedFamily;
CAircraftModelList models2nd = ifPossibleReduceByFamily(remoteAircraft, UsePseudoFamily, inList, r3, usedFamily, log); CAircraftModelList models2nd = ifPossibleReduceByFamily(remoteAircraft, UsePseudoFamily, inList, r3, usedFamily, log);
models2nd = ifPossibleReduceByAirline(remoteAircraft, models2nd, "Reduce family by airline second.", r3, log); models2nd = ifPossibleReduceByAirline(remoteAircraft, models2nd, setup, "Reduce family by airline second.", r3, log);
if (r3) if (r3)
{ {
// we found family / airline combination // we found family / airline combination
if (log) { CMatchingUtils::addLogDetailsToList(log, remoteAircraft, u"Found aircraft family/airline '" % usedFamily % u"' combination", getLogCategories()); } if (log) { CMatchingUtils::addLogDetailsToList(log, remoteAircraft, u"Found " % QString::number(models2nd.sizeInt()) % " aircraft family/airline '" % usedFamily % u"' combination", getLogCategories()); }
return models; return models2nd;
} }
} }
@@ -1254,7 +1258,7 @@ namespace BlackCore
} }
reduced = true; reduced = true;
CMatchingUtils::addLogDetailsToList(log, remoteAircraft, u"Found by family '" % family % u"' (" % hint % u") size " % QString::number(found.size()), getLogCategories()); CMatchingUtils::addLogDetailsToList(log, remoteAircraft, u"Found by family '" % family % u"' (" % hint % u") size " % QString::number(found.sizeInt()), getLogCategories());
return found; return found;
} }
@@ -1350,7 +1354,7 @@ namespace BlackCore
return ifPossibleReduceByFamily(remoteAircraft, allowPseudoFamily, inList, reduced, family, log); return ifPossibleReduceByFamily(remoteAircraft, allowPseudoFamily, inList, reduced, family, log);
} }
CAircraftModelList CAircraftMatcher::ifPossibleReduceByAirline(const CSimulatedAircraft &remoteAircraft, const CAircraftModelList &inList, const QString &info, bool &reduced, CStatusMessageList *log) CAircraftModelList CAircraftMatcher::ifPossibleReduceByAirline(const CSimulatedAircraft &remoteAircraft, const CAircraftModelList &inList, const CAircraftMatcherSetup &setup, const QString &info, bool &reduced, CStatusMessageList *log)
{ {
reduced = false; reduced = false;
if (inList.isEmpty()) if (inList.isEmpty())
@@ -1365,7 +1369,24 @@ namespace BlackCore
return inList; return inList;
} }
const CAircraftModelList outList(inList.findByIcaoDesignators(CAircraftIcaoCode::null(), remoteAircraft.getAirlineIcaoCode())); CAircraftMatcherSetup::MatchingMode mode = setup.getMatchingMode();
CAircraftModelList outList(inList.findByIcaoDesignators(CAircraftIcaoCode::null(), remoteAircraft.getAirlineIcaoCode()));
if (
mode.testFlag(CAircraftMatcherSetup::ByAirlineGroupSameAsAirline) ||
(outList.isEmpty() || mode.testFlag(CAircraftMatcherSetup::ByAirlineGroupIfNoAirline)))
{
const CAircraftModelList groupModels = inList.findByAirlineGroup(remoteAircraft.getAirlineIcaoCode());
outList.replaceOrAddModelsWithString(groupModels, Qt::CaseInsensitive);
if (log)
{
CMatchingUtils::addLogDetailsToList(log, remoteAircraft,
groupModels.isEmpty() ?
QStringLiteral("No group models found by using airline group '%2'").arg(groupModels.sizeInt()).arg(remoteAircraft.getAirlineIcaoCode().getGroupDesignator()) :
QStringLiteral("Added %1 model(s) by using airline group '%2', all members: '%3'").arg(groupModels.sizeInt()).arg(remoteAircraft.getAirlineIcaoCode().getGroupDesignator(), joinStringSet(groupModels.getAirlineVDesignators(), ", ")),
getLogCategories());
}
}
if (outList.isEmpty()) if (outList.isEmpty())
{ {
if (log) { CMatchingUtils::addLogDetailsToList(log, remoteAircraft, info % u" Cannot reduce by '" % remoteAircraft.getAirlineIcaoCodeDesignator() % u"' results: " % QString::number(outList.size()), getLogCategories()); } if (log) { CMatchingUtils::addLogDetailsToList(log, remoteAircraft, info % u" Cannot reduce by '" % remoteAircraft.getAirlineIcaoCodeDesignator() % u"' results: " % QString::number(outList.size()), getLogCategories()); }
@@ -1377,7 +1398,7 @@ namespace BlackCore
return outList; return outList;
} }
CAircraftModelList CAircraftMatcher::ifPossibleReduceByCombinedType(const CSimulatedAircraft &remoteAircraft, const CAircraftModelList &inList, bool &reduced, CStatusMessageList *log) CAircraftModelList CAircraftMatcher::ifPossibleReduceByCombinedType(const CSimulatedAircraft &remoteAircraft, const CAircraftModelList &inList, const CAircraftMatcherSetup &setup, bool &reduced, CStatusMessageList *log)
{ {
reduced = false; reduced = false;
if (!remoteAircraft.getAircraftIcaoCode().hasValidCombinedType()) if (!remoteAircraft.getAircraftIcaoCode().hasValidCombinedType())
@@ -1387,21 +1408,21 @@ namespace BlackCore
} }
const QString cc = remoteAircraft.getAircraftIcaoCode().getCombinedType(); const QString cc = remoteAircraft.getAircraftIcaoCode().getCombinedType();
CAircraftModelList byCombinedCode(inList.findByCombinedType(cc)); CAircraftModelList modelsByCombinedCode(inList.findByCombinedType(cc));
if (byCombinedCode.isEmpty()) if (modelsByCombinedCode.isEmpty())
{ {
if (log) { CMatchingUtils::addLogDetailsToList(log, remoteAircraft, u"Not found by combined code " % cc, getLogCategories()); } if (log) { CMatchingUtils::addLogDetailsToList(log, remoteAircraft, u"Not found by combined code " % cc, getLogCategories()); }
return inList; return inList;
} }
if (log) { CMatchingUtils::addLogDetailsToList(log, remoteAircraft, u"Found by combined code " % cc % u", possible " % QString::number(byCombinedCode.size()), getLogCategories()); } if (log) { CMatchingUtils::addLogDetailsToList(log, remoteAircraft, u"Found by combined code " % cc % u", possible " % QString::number(modelsByCombinedCode.size()), getLogCategories()); }
if (byCombinedCode.size() > 1) if (modelsByCombinedCode.size() > 1)
{ {
byCombinedCode = ifPossibleReduceByAirline(remoteAircraft, byCombinedCode, QStringLiteral("Combined code airline reduction. "), reduced, log); modelsByCombinedCode = ifPossibleReduceByAirline(remoteAircraft, modelsByCombinedCode, setup, QStringLiteral("Combined code airline reduction. "), reduced, log);
byCombinedCode = ifPossibleReduceByManufacturer(remoteAircraft, byCombinedCode, QStringLiteral("Combined code manufacturer reduction. "), reduced, log); modelsByCombinedCode = ifPossibleReduceByManufacturer(remoteAircraft, modelsByCombinedCode, QStringLiteral("Combined code manufacturer reduction. "), reduced, log);
reduced = true; reduced = true;
} }
return byCombinedCode; return modelsByCombinedCode;
} }
CAircraftModelList CAircraftMatcher::ifPossibleReduceByMilitaryFlag(const CSimulatedAircraft &remoteAircraft, const CAircraftModelList &inList, bool &reduced, CStatusMessageList *log) CAircraftModelList CAircraftMatcher::ifPossibleReduceByMilitaryFlag(const CSimulatedAircraft &remoteAircraft, const CAircraftModelList &inList, bool &reduced, CStatusMessageList *log)

View File

@@ -291,11 +291,11 @@ namespace BlackCore
//! Reduce by airline ICAO //! Reduce by airline ICAO
//! \threadsafe //! \threadsafe
static BlackMisc::Simulation::CAircraftModelList ifPossibleReduceByAirline(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft, const BlackMisc::Simulation::CAircraftModelList &inList, 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);
//! 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, 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);
//! By military flag //! By military flag
//! \threadsafe //! \threadsafe

View File

@@ -180,6 +180,16 @@ namespace BlackMisc
return this->findBy(&CAircraftModel::getAircraftIcaoCode, aircraftIcaoCode, &CAircraftModel::getLivery, livery); return this->findBy(&CAircraftModel::getAircraftIcaoCode, aircraftIcaoCode, &CAircraftModel::getLivery, livery);
} }
CAircraftModelList CAircraftModelList::findByAirlineGroup(const CAirlineIcaoCode &airline) const
{
const int id = airline.getGroupId();
if (id < 0) return {};
return this->findBy([ & ](const CAircraftModel & model)
{
return model.getAirlineIcaoCode().getGroupId() == id;
});
}
CAircraftModelList CAircraftModelList::findByLiveryCode(const CLivery &livery) const CAircraftModelList CAircraftModelList::findByLiveryCode(const CLivery &livery) const
{ {
if (!livery.hasCombinedCode()) { return CAircraftModelList(); } if (!livery.hasCombinedCode()) { return CAircraftModelList(); }
@@ -1181,7 +1191,31 @@ namespace BlackMisc
QString CAircraftModelList::getCombinedTypesAsString(const QString &separator) const QString CAircraftModelList::getCombinedTypesAsString(const QString &separator) const
{ {
return this->getCombinedTypes().values().join(separator); if (this->isEmpty()) { return {}; }
return joinStringSet(this->getCombinedTypes(), separator);
}
QSet<QString> CAircraftModelList::getAicraftAndAirlineDesignators(bool withDbId) const
{
QSet<QString> str;
for (const CAircraftModel &model : *this)
{
const QString s = (model.hasAircraftDesignator() ?
(withDbId ? model.getAircraftIcaoCode().getDesignatorDbKey() : model.getAircraftIcaoCodeDesignator()) :
"no aircraft") %
u"/" %
(model.hasAircraftDesignator() ?
(withDbId ? model.getAirlineIcaoCode().getDesignatorDbKey() : model.getAirlineIcaoCodeVDesignator()) :
"no airline");
str.insert(s);
}
return str;
}
QString CAircraftModelList::getAicraftAndAirlineDesignatorsAsString(bool withDbId, const QString &separator) const
{
if (this->isEmpty()) { return {}; }
return joinStringSet(this->getAicraftAndAirlineDesignators(withDbId), separator);
} }
void CAircraftModelList::updateAircraftIcao(const CAircraftIcaoCode &icao) void CAircraftModelList::updateAircraftIcao(const CAircraftIcaoCode &icao)
@@ -1550,6 +1584,9 @@ namespace BlackMisc
u" | civilian: " % QString::number(this->countCivilianAircraft()) % separator % u" | civilian: " % QString::number(this->countCivilianAircraft()) % separator %
u"Different airlines: " % QString::number(this->countDifferentAirlines()) % separator % u"Different airlines: " % QString::number(this->countDifferentAirlines()) % separator %
u"Combined types: '" % this->getCombinedTypesAsString() % u'\'' % separator % u"Combined types: '" % this->getCombinedTypesAsString() % u'\'' % separator %
(this->size() <= 25 ?
(u"Aircraft/airlines: " % this->getAicraftAndAirlineDesignatorsAsString(true) % separator) :
QString()) %
u"Simulators: " % this->countPerSimulator().toQString(); u"Simulators: " % this->countPerSimulator().toQString();
} }

View File

@@ -151,6 +151,9 @@ namespace BlackMisc
//! Find by aircraft and livery //! Find by aircraft and livery
CAircraftModelList findByAircraftAndLivery(const Aviation::CAircraftIcaoCode &aircraftIcaoCode, const Aviation::CLivery &livery) const; CAircraftModelList findByAircraftAndLivery(const Aviation::CAircraftIcaoCode &aircraftIcaoCode, const Aviation::CLivery &livery) const;
//! Find by the corresponding airline group
CAircraftModelList findByAirlineGroup(const BlackMisc::Aviation::CAirlineIcaoCode &airline) const;
//! Find by livery code //! Find by livery code
CAircraftModelList findByLiveryCode(const Aviation::CLivery &livery) const; CAircraftModelList findByLiveryCode(const Aviation::CLivery &livery) const;
@@ -436,6 +439,12 @@ namespace BlackMisc
//! All combined types as string //! All combined types as string
QString getCombinedTypesAsString(const QString &separator = ", ") const; QString getCombinedTypesAsString(const QString &separator = ", ") const;
//! A set of all Aircraft/Airline ICAO codes
QSet<QString> getAicraftAndAirlineDesignators(bool withDbId) const;
//! A set of all Aircraft/Airline ICAO codes
QString getAicraftAndAirlineDesignatorsAsString(bool withDbId, const QString &separator = ", ") const;
//! Update aircraft ICAO //! Update aircraft ICAO
void updateAircraftIcao(const Aviation::CAircraftIcaoCode &icao); void updateAircraftIcao(const Aviation::CAircraftIcaoCode &icao);