From 009bfc3ed13594768b376b11d867053a3ac87d61 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 9 Aug 2016 18:24:07 +0200 Subject: [PATCH] refs #720, finder by Telephony designator (aka callsign) and name --- src/blackmisc/aviation/airlineicaocode.cpp | 7 +++ src/blackmisc/aviation/airlineicaocode.h | 3 ++ .../aviation/airlineicaocodelist.cpp | 44 ++++++++++++++----- src/blackmisc/aviation/airlineicaocodelist.h | 3 ++ src/blackmisc/aviation/liverylist.cpp | 22 ++++++---- src/blackmisc/aviation/liverylist.h | 5 ++- 6 files changed, 63 insertions(+), 21 deletions(-) diff --git a/src/blackmisc/aviation/airlineicaocode.cpp b/src/blackmisc/aviation/airlineicaocode.cpp index 10737e0a1..da28f4658 100644 --- a/src/blackmisc/aviation/airlineicaocode.cpp +++ b/src/blackmisc/aviation/airlineicaocode.cpp @@ -125,6 +125,13 @@ namespace BlackMisc return this->matchesVDesignator(candidate) || this->matchesIataCode(candidate); } + bool CAirlineIcaoCode::matchesNamesOrTelephonyDesignator(const QString &candidate) const + { + const QString cand(candidate.toUpper().trimmed()); + if (this->getName().contains(cand, Qt::CaseInsensitive) || this->getTelephonyDesignator().contains(cand, Qt::CaseInsensitive)) { return true; } + return this->isContainedInSimplifiedName(candidate); + } + bool CAirlineIcaoCode::isContainedInSimplifiedName(const QString &candidate) const { if (candidate.isEmpty() || !this->hasName()) { return false; } diff --git a/src/blackmisc/aviation/airlineicaocode.h b/src/blackmisc/aviation/airlineicaocode.h index f553cf367..46f02dc95 100644 --- a/src/blackmisc/aviation/airlineicaocode.h +++ b/src/blackmisc/aviation/airlineicaocode.h @@ -149,6 +149,9 @@ namespace BlackMisc //! Matches IATA code or v-designator? bool matchesVDesignatorOrIataCode(const QString &candidate) const; + //! Relaxed check by name or telephony designator (aka callsign, not to be confused with CCallsign) + bool matchesNamesOrTelephonyDesignator(const QString &candidate) const; + //! Does simplified name contain the candidate bool isContainedInSimplifiedName(const QString &candidate) const; diff --git a/src/blackmisc/aviation/airlineicaocodelist.cpp b/src/blackmisc/aviation/airlineicaocodelist.cpp index 6b8fd0256..39867bc5a 100644 --- a/src/blackmisc/aviation/airlineicaocodelist.cpp +++ b/src/blackmisc/aviation/airlineicaocodelist.cpp @@ -89,6 +89,15 @@ namespace BlackMisc }); } + CAirlineIcaoCodeList CAirlineIcaoCodeList::findByNamesOrTelephonyDesignator(const QString &candidate) const + { + if (candidate.isEmpty()) { return CAirlineIcaoCodeList(); } + return this->findBy([&](const CAirlineIcaoCode & code) + { + return code.matchesNamesOrTelephonyDesignator(candidate); + }); + } + CAirlineIcaoCodeList CAirlineIcaoCodeList::findByMilitary(bool military) const { return this->findBy([&](const CAirlineIcaoCode & code) @@ -99,33 +108,44 @@ namespace BlackMisc CAirlineIcaoCode CAirlineIcaoCodeList::smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern, const CCallsign &callsign) const { + if (icaoPattern.hasValidDbKey()) { return icaoPattern; } const CAirlineIcaoCode patternUsed = icaoPattern.thisOrCallsignCode(callsign); - if (patternUsed.hasValidDbKey()) - { - return this->findByKey(icaoPattern.getDbKey(), icaoPattern); - } // search by parts - CAirlineIcaoCodeList codes; + CAirlineIcaoCodeList codesFound; if (patternUsed.hasValidDesignator()) { - codes = this->findByVDesignator(patternUsed.getVDesignator()); + codesFound = this->findByVDesignator(patternUsed.getVDesignator()); } else { - codes = this->findByIataCode(patternUsed.getIataCode()); + codesFound = this->findByIataCode(patternUsed.getIataCode()); } - if (codes.size() == 1) { return codes.front(); } + if (codesFound.size() == 1) { return codesFound.front(); } + if (codesFound.isEmpty()) + { + codesFound = this->findByNamesOrTelephonyDesignator(patternUsed.getName()); + } + else + { + // further reduce + if (patternUsed.hasName()) + { + CAirlineIcaoCodeList backup(codesFound); + codesFound = this->findByNamesOrTelephonyDesignator(patternUsed.getName()); + if (codesFound.isEmpty()) { codesFound = backup; } + } + } // further reduce if (patternUsed.hasValidCountry()) { - CAirlineIcaoCodeList countryCodes = codes.findByCountryIsoCode(patternUsed.getCountry().getIsoCode()); + CAirlineIcaoCodeList countryCodes = codesFound.findByCountryIsoCode(patternUsed.getCountry().getIsoCode()); if (!countryCodes.isEmpty()) { return countryCodes.front(); } } - if (!codes.isEmpty()) { return codes.front(); } + if (!codesFound.isEmpty()) { return codesFound.front(); } return patternUsed; } @@ -205,5 +225,5 @@ namespace BlackMisc if (sort) { c.sort(); } return c; } - } // namespace -} // namespace + } // ns +} // ns diff --git a/src/blackmisc/aviation/airlineicaocodelist.h b/src/blackmisc/aviation/airlineicaocodelist.h index 2f3051742..0d2331621 100644 --- a/src/blackmisc/aviation/airlineicaocodelist.h +++ b/src/blackmisc/aviation/airlineicaocodelist.h @@ -69,6 +69,9 @@ namespace BlackMisc //! Find if simplified name contains search string CAirlineIcaoCodeList findBySimplifiedNameContaining(const QString &containedString) const; + //! Find by names or telephony designator (aka callsign, not to be confused with CCallsign) + CAirlineIcaoCodeList findByNamesOrTelephonyDesignator(const QString &candidate) const; + //! Find by military flag CAirlineIcaoCodeList findByMilitary(bool military) const; diff --git a/src/blackmisc/aviation/liverylist.cpp b/src/blackmisc/aviation/liverylist.cpp index 71d9686df..863dd2fa5 100644 --- a/src/blackmisc/aviation/liverylist.cpp +++ b/src/blackmisc/aviation/liverylist.cpp @@ -59,6 +59,17 @@ namespace BlackMisc }); } + CLiveryList CLiveryList::findStdLiveriesByNamesOrTelephonyDesignator(const QString &candidate) const + { + if (candidate.isEmpty()) { return CLiveryList(); } + return this->findBy([&](const CLivery & livery) + { + // keep isAirlineStandardLivery first (faster) + return livery.isAirlineStandardLivery() && + livery.getAirlineIcaoCode().matchesNamesOrTelephonyDesignator(candidate); + }); + } + CLivery CLiveryList::findStdLiveryByAirlineIcaoVDesignator(const CAirlineIcaoCode &icao) const { return this->findStdLiveryByAirlineIcaoVDesignator(icao.getVDesignator()); @@ -92,15 +103,10 @@ namespace BlackMisc CLivery CLiveryList::smartLiverySelector(const CLivery &liveryPattern) const { // multiple searches are slow, maybe we can performance optimize this - // in the futuew + // in the future // first try on id, that would be perfect - if (liveryPattern.hasValidDbKey()) - { - int k = liveryPattern.getDbKey(); - const CLivery l(this->findByKey(k)); - if (l.hasCompleteData()) { return l; } - } + if (liveryPattern.hasValidDbKey()) { return liveryPattern; } // by combined code if (liveryPattern.hasCombinedCode()) @@ -122,7 +128,7 @@ namespace BlackMisc if (liveryPattern.getAirlineIcaoCode().hasName()) { const QString search(liveryPattern.getAirlineIcaoCode().getSimplifiedName()); - const CLiveryList liveries(this->findStdLiveriesBySimplifiedAirlineName(search)); + const CLiveryList liveries(this->findStdLiveriesByNamesOrTelephonyDesignator(search)); if (!liveries.isEmpty()) { return liveries.front(); diff --git a/src/blackmisc/aviation/liverylist.h b/src/blackmisc/aviation/liverylist.h index 77b669469..605ef95e1 100644 --- a/src/blackmisc/aviation/liverylist.h +++ b/src/blackmisc/aviation/liverylist.h @@ -55,6 +55,9 @@ namespace BlackMisc //! By simplified name CLiveryList findStdLiveriesBySimplifiedAirlineName(const QString &containedString) const; + //! By names or telephony designator(aka callsign) + CLiveryList findStdLiveriesByNamesOrTelephonyDesignator(const QString &candidate) const; + //! Find livery by combined code CLivery findByCombinedCode(const QString &combinedCode) const; @@ -64,7 +67,7 @@ namespace BlackMisc //! All combined codes plus more info QStringList getCombinedCodesPlusInfo(bool sort = false) const; - //! Find + //! Find by multiple criteria CLivery smartLiverySelector(const CLivery &liveryPattern) const; }; } //namespace