From 955b8bafea15e669cb425342ac5b5137445d7e3c Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Wed, 14 Oct 2015 19:56:31 +0200 Subject: [PATCH] Moved smart selector functions to lists --- src/blackcore/icaodatareader.cpp | 53 ++++--------------- src/blackcore/icaodatareader.h | 4 +- src/blackcore/modeldatareader.cpp | 49 ++++------------- src/blackcore/modeldatareader.h | 2 +- .../aviation/aircrafticaocodelist.cpp | 44 +++++++++++++++ src/blackmisc/aviation/aircrafticaocodelist.h | 3 ++ .../aviation/airlineicaocodelist.cpp | 13 +++++ src/blackmisc/aviation/airlineicaocodelist.h | 3 ++ src/blackmisc/aviation/liverylist.cpp | 27 ++++++++++ src/blackmisc/aviation/liverylist.h | 4 ++ src/blackmisc/simulation/distributorlist.cpp | 14 +++++ src/blackmisc/simulation/distributorlist.h | 2 + 12 files changed, 135 insertions(+), 83 deletions(-) diff --git a/src/blackcore/icaodatareader.cpp b/src/blackcore/icaodatareader.cpp index 6f3772ecf..5c0de52f2 100644 --- a/src/blackcore/icaodatareader.cpp +++ b/src/blackcore/icaodatareader.cpp @@ -60,48 +60,10 @@ namespace BlackCore return m_airlineIcaos; } - CAircraftIcaoCode CIcaoDataReader::smartAircraftIcaoSelector(const CAircraftIcaoCode &icao) const + CAircraftIcaoCode CIcaoDataReader::smartAircraftIcaoSelector(const CAircraftIcaoCode &icaoPattern) const { CAircraftIcaoCodeList codes(getAircraftIcaoCodes()); // thread safe copy - if (icao.hasValidDbKey()) - { - int k = icao.getDbKey(); - CAircraftIcaoCode c(codes.findByKey(k)); - if (c.hasCompleteData()) { return c; } - } - - if (icao.hasKnownDesignator()) - { - const QString d(icao.getDesignator()); - codes = codes.findByDesignator(d); - if (codes.size() == 1) { return codes.front(); } - if (codes.isEmpty()) { return icao; } - codes.sortByRank(); - - // intentionally continue here - } - - // further reduce by manufacturer - if (icao.hasManufacturer()) - { - const QString m(icao.getManufacturer()); - codes = codes.findByManufacturer(m); - if (codes.size() == 1) { return codes.front(); } - if (codes.isEmpty()) { return icao; } - - // intentionally continue here - } - - // lucky punch on description? - if (icao.hasModelDescription()) - { - // do not affect codes here, it might return no results - const QString d(icao.getModelDescription()); - CAircraftIcaoCodeList cm(codes.findByDescription(d)); - if (cm.size() == 1) { return cm.front(); } - if (cm.size() > 1 && cm.size() < codes.size()) { return codes.front(); } - } - return codes.frontOrDefault(); // sorted by rank + return codes.smartAircraftIcaoSelector(icaoPattern); // sorted by rank } CCountryList CIcaoDataReader::getCountries() const @@ -132,9 +94,10 @@ namespace BlackCore return getAirlineIcaoCodes().findByKey(key); } - CAirlineIcaoCode CIcaoDataReader::smartAirlineIcaoSelector(const CAirlineIcaoCode &icao) const + CAirlineIcaoCode CIcaoDataReader::smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern) const { - return icao; + CAirlineIcaoCodeList codes(this->getAirlineIcaoCodes()); // thread safe copy + return codes.smartAirlineIcaoSelector(icaoPattern); } int CIcaoDataReader::getAircraftIcaoCodesCount() const @@ -210,6 +173,7 @@ namespace BlackCore // wrap pointer, make sure any exit cleans up reply // required to use delete later as object is created in a different thread QScopedPointer nwReply(nwReplyPtr); + QString urlString(nwReply->url().toString()); QJsonArray array = this->setStatusAndTransformReplyIntoDatastoreResponse(nwReply.data()); if (array.isEmpty()) { @@ -225,11 +189,13 @@ namespace BlackCore this->m_aircraftIcaos = codes; } emit dataRead(CEntityFlags::AircraftIcaoEntity, CEntityFlags::ReadFinished, n); + CLogMessage(this).info("Read %1 %2 from %3") << n << CEntityFlags::flagToString(CEntityFlags::AircraftIcaoEntity) << urlString; } void CIcaoDataReader::ps_parseAirlineIcaoData(QNetworkReply *nwReplyPtr) { QScopedPointer nwReply(nwReplyPtr); + QString urlString(nwReply->url().toString()); QJsonArray array = this->setStatusAndTransformReplyIntoDatastoreResponse(nwReply.data()); if (array.isEmpty()) { @@ -245,11 +211,13 @@ namespace BlackCore this->m_airlineIcaos = codes; } emit dataRead(CEntityFlags::AirlineIcaoEntity, CEntityFlags::ReadFinished, n); + CLogMessage(this).info("Read %1 %2 from %3") << n << CEntityFlags::flagToString(CEntityFlags::AirlineIcaoEntity) << urlString; } void CIcaoDataReader::ps_parseCountryData(QNetworkReply *nwReplyPtr) { QScopedPointer nwReply(nwReplyPtr); + QString urlString(nwReply->url().toString()); QJsonArray array = this->setStatusAndTransformReplyIntoDatastoreResponse(nwReply.data()); if (array.isEmpty()) { @@ -265,6 +233,7 @@ namespace BlackCore this->m_countries = countries; } emit dataRead(CEntityFlags::CountryEntity, CEntityFlags::ReadFinished, n); + CLogMessage(this).info("Read %1 %2 from %3") << n << CEntityFlags::flagToString(CEntityFlags::CountryEntity) << urlString; } bool CIcaoDataReader::readFromJsonFiles(const QString &dir, CEntityFlags::Entity whatToRead) diff --git a/src/blackcore/icaodatareader.h b/src/blackcore/icaodatareader.h index d4e86b8d0..7bf3f7be7 100644 --- a/src/blackcore/icaodatareader.h +++ b/src/blackcore/icaodatareader.h @@ -54,7 +54,7 @@ namespace BlackCore //! Get best match for incomplete aircraft ICAO code //! \threadsafe - BlackMisc::Aviation::CAircraftIcaoCode smartAircraftIcaoSelector(const BlackMisc::Aviation::CAircraftIcaoCode &icao) const; + BlackMisc::Aviation::CAircraftIcaoCode smartAircraftIcaoSelector(const BlackMisc::Aviation::CAircraftIcaoCode &icaoPattern) const; //! Get countries //! \threadsafe @@ -82,7 +82,7 @@ namespace BlackCore //! Get best match for incomplete airline ICAO code //! \threadsafe - BlackMisc::Aviation::CAirlineIcaoCode smartAirlineIcaoSelector(const BlackMisc::Aviation::CAirlineIcaoCode &icao) const; + BlackMisc::Aviation::CAirlineIcaoCode smartAirlineIcaoSelector(const BlackMisc::Aviation::CAirlineIcaoCode &icaoPattern) const; //! Get aircraft ICAO information count //! \threadsafe diff --git a/src/blackcore/modeldatareader.cpp b/src/blackcore/modeldatareader.cpp index 2d305223c..dae6dc229 100644 --- a/src/blackcore/modeldatareader.cpp +++ b/src/blackcore/modeldatareader.cpp @@ -59,34 +59,10 @@ namespace BlackCore return liveries.findByKey(id); } - CLivery CModelDataReader::smartLiverySelector(const CLivery &livery) const + CLivery CModelDataReader::smartLiverySelector(const CLivery &liveryPattern) const { CLiveryList liveries(getLiveries()); // thread safe copy - - // first try on id, that would be perfect - if (livery.hasValidDbKey()) - { - int k = livery.getDbKey(); - CLivery l(liveries.findByKey(k)); - if (l.hasCompleteData()) { return l; } - } - - // by combined code - if (livery.hasCombinedCode()) - { - QString cc(livery.getCombinedCode()); - CLivery l(liveries.findByCombinedCode(cc)); - if (l.hasCompleteData()) { return l; } - } - - if (livery.hasValidAirlineDesignator()) - { - QString icao(livery.getAirlineIcaoCodeDesignator()); - CLivery l(liveries.findByAirlineIcaoDesignatorStdLivery(icao)); - if (l.hasCompleteData()) { return l; } - } - - return CLivery(); + return liveries.smartLiverySelector(liveryPattern); } CDistributorList CModelDataReader::getDistributors() const @@ -127,19 +103,10 @@ namespace BlackCore return m_distributors.size(); } - CDistributor CModelDataReader::smartDistributorSelector(const CDistributor &distributor) const + CDistributor CModelDataReader::smartDistributorSelector(const CDistributor &distributorPattern) const { CDistributorList distributors(getDistributors()); // thread safe copy - if (distributor.hasValidDbKey()) - { - QString k(distributor.getDbKey()); - CDistributor d(distributors.findByKey(k)); - if (d.hasCompleteData()) { return d; } - - // more lenient search - return distributors.findByIdOrAlias(k); - } - return CDistributor(); + return distributors.smartDistributorSelector(distributorPattern); } int CModelDataReader::getModelsCount() const @@ -196,6 +163,7 @@ namespace BlackCore // wrap pointer, make sure any exit cleans up reply // required to use delete later as object is created in a different thread QScopedPointer nwReply(nwReplyPtr); + QString urlString(nwReply->url().toString()); QJsonArray array = this->setStatusAndTransformReplyIntoDatastoreResponse(nwReply.data()); if (array.isEmpty()) { @@ -210,13 +178,15 @@ namespace BlackCore QWriteLocker wl(&this->m_lockLivery); this->m_liveries = liveries; } - // never emit when lcok is held -> deadlock + // never emit when lock is held -> deadlock emit dataRead(CEntityFlags::LiveryEntity, CEntityFlags::ReadFinished, n); + CLogMessage(this).info("Read %1 %2 from %3") << n << CEntityFlags::flagToString(CEntityFlags::LiveryEntity) << urlString; } void CModelDataReader::ps_parseDistributorData(QNetworkReply *nwReplyPtr) { QScopedPointer nwReply(nwReplyPtr); + QString urlString(nwReply->url().toString()); QJsonArray array = this->setStatusAndTransformReplyIntoDatastoreResponse(nwReply.data()); if (array.isEmpty()) { @@ -232,11 +202,13 @@ namespace BlackCore this->m_distributors = distributors; } emit dataRead(CEntityFlags::DistributorEntity, CEntityFlags::ReadFinished, n); + CLogMessage(this).info("Read %1 %2 from %3") << n << CEntityFlags::flagToString(CEntityFlags::DistributorEntity) << urlString; } void CModelDataReader::ps_parseModelData(QNetworkReply *nwReplyPtr) { QScopedPointer nwReply(nwReplyPtr); + QString urlString(nwReply->url().toString()); QJsonArray array = this->setStatusAndTransformReplyIntoDatastoreResponse(nwReply.data()); if (array.isEmpty()) { @@ -252,6 +224,7 @@ namespace BlackCore this->m_models = models; } emit dataRead(CEntityFlags::ModelEntity, CEntityFlags::ReadFinished, n); + CLogMessage(this).info("Read %1 %2 from %3") << n << CEntityFlags::flagToString(CEntityFlags::ModelEntity) << urlString; } bool CModelDataReader::readFromJsonFiles(const QString &dir, CEntityFlags::Entity whatToRead) diff --git a/src/blackcore/modeldatareader.h b/src/blackcore/modeldatareader.h index 454c1e4a0..3c314ea22 100644 --- a/src/blackcore/modeldatareader.h +++ b/src/blackcore/modeldatareader.h @@ -78,7 +78,7 @@ namespace BlackCore //! Best match specified by distributor //! \threadsafe - BlackMisc::Simulation::CDistributor smartDistributorSelector(const BlackMisc::Simulation::CDistributor &distributor) const; + BlackMisc::Simulation::CDistributor smartDistributorSelector(const BlackMisc::Simulation::CDistributor &distributorPattern) const; //! Get models count //! \threadsafe diff --git a/src/blackmisc/aviation/aircrafticaocodelist.cpp b/src/blackmisc/aviation/aircrafticaocodelist.cpp index f2119fe54..884c33189 100644 --- a/src/blackmisc/aviation/aircrafticaocodelist.cpp +++ b/src/blackmisc/aviation/aircrafticaocodelist.cpp @@ -82,5 +82,49 @@ namespace BlackMisc return codes; } + CAircraftIcaoCode CAircraftIcaoCodeList::smartAircraftIcaoSelector(const CAircraftIcaoCode &icaoPattern) const + { + if (icaoPattern.hasValidDbKey()) + { + int k = icaoPattern.getDbKey(); + CAircraftIcaoCode c(this->findByKey(k)); + if (c.hasCompleteData()) { return c; } + } + + CAircraftIcaoCodeList codes(*this); // copy and reduce + if (icaoPattern.hasKnownDesignator()) + { + const QString d(icaoPattern.getDesignator()); + codes = codes.findByDesignator(d); + if (codes.size() == 1) { return codes.front(); } + if (codes.isEmpty()) { return icaoPattern; } + codes.sortByRank(); + + // intentionally continue here + } + + // further reduce by manufacturer + if (icaoPattern.hasManufacturer()) + { + const QString m(icaoPattern.getManufacturer()); + codes = codes.findByManufacturer(m); + if (codes.size() == 1) { return codes.front(); } + if (codes.isEmpty()) { return icaoPattern; } + + // intentionally continue here + } + + // lucky punch on description? + if (icaoPattern.hasModelDescription()) + { + // do not affect codes here, it might return no results + const QString d(icaoPattern.getModelDescription()); + CAircraftIcaoCodeList cm(codes.findByDescription(d)); + if (cm.size() == 1) { return cm.front(); } + if (cm.size() > 1 && cm.size() < codes.size()) { return codes.front(); } + } + return codes.frontOrDefault(); // sorted by rank + } + } // namespace } // namespace diff --git a/src/blackmisc/aviation/aircrafticaocodelist.h b/src/blackmisc/aviation/aircrafticaocodelist.h index 69f04d34b..818000c4e 100644 --- a/src/blackmisc/aviation/aircrafticaocodelist.h +++ b/src/blackmisc/aviation/aircrafticaocodelist.h @@ -50,6 +50,9 @@ namespace BlackMisc //! Find by designator, then best match by rank CAircraftIcaoCode findFirstByDesignatorAndRank(const QString &designator); + //! Best selection by given pattern + CAircraftIcaoCode smartAircraftIcaoSelector(const CAircraftIcaoCode &icaoPattern) const; + //! Sort by rank void sortByRank(); diff --git a/src/blackmisc/aviation/airlineicaocodelist.cpp b/src/blackmisc/aviation/airlineicaocodelist.cpp index ee89e1888..af04faf17 100644 --- a/src/blackmisc/aviation/airlineicaocodelist.cpp +++ b/src/blackmisc/aviation/airlineicaocodelist.cpp @@ -26,6 +26,19 @@ namespace BlackMisc }); } + CAirlineIcaoCode CAirlineIcaoCodeList::smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern) const + { + if (icaoPattern.hasValidDbKey()) + { + return this->findByKey(icaoPattern.getDbKey(), icaoPattern); + } + + if (!icaoPattern.hasValidDesignator()) { return CAirlineIcaoCode(); } + + //! \todo smart airline selector, further criteria + return icaoPattern; + } + CAirlineIcaoCode CAirlineIcaoCodeList::findByVDesignator(const QString &designator) { if (CAirlineIcaoCode::isValidAirlineDesignator(designator)) { return CAirlineIcaoCode(); } diff --git a/src/blackmisc/aviation/airlineicaocodelist.h b/src/blackmisc/aviation/airlineicaocodelist.h index f3b21d190..4f33e3112 100644 --- a/src/blackmisc/aviation/airlineicaocodelist.h +++ b/src/blackmisc/aviation/airlineicaocodelist.h @@ -43,6 +43,9 @@ namespace BlackMisc //! Not unique because of virtual airlines CAirlineIcaoCodeList findByDesignator(const QString &designator); + //! Best selection by given pattern + CAirlineIcaoCode smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern) const; + //! Find by v-designator, this should be unique CAirlineIcaoCode findByVDesignator(const QString &designator); diff --git a/src/blackmisc/aviation/liverylist.cpp b/src/blackmisc/aviation/liverylist.cpp index e587ea8a7..228eb505d 100644 --- a/src/blackmisc/aviation/liverylist.cpp +++ b/src/blackmisc/aviation/liverylist.cpp @@ -51,5 +51,32 @@ namespace BlackMisc }); } + CLivery CLiveryList::smartLiverySelector(const CLivery &liveryPattern) const + { + // first try on id, that would be perfect + if (liveryPattern.hasValidDbKey()) + { + int k = liveryPattern.getDbKey(); + CLivery l(this->findByKey(k)); + if (l.hasCompleteData()) { return l; } + } + + // by combined code + if (liveryPattern.hasCombinedCode()) + { + QString cc(liveryPattern.getCombinedCode()); + CLivery l(this->findByCombinedCode(cc)); + if (l.hasCompleteData()) { return l; } + } + + if (liveryPattern.hasValidAirlineDesignator()) + { + QString icao(liveryPattern.getAirlineIcaoCodeDesignator()); + CLivery l(this->findByAirlineIcaoDesignatorStdLivery(icao)); + if (l.hasCompleteData()) { return l; } + } + return CLivery(); + } + } // namespace } // namespace diff --git a/src/blackmisc/aviation/liverylist.h b/src/blackmisc/aviation/liverylist.h index 58572d1b4..ef25d3c70 100644 --- a/src/blackmisc/aviation/liverylist.h +++ b/src/blackmisc/aviation/liverylist.h @@ -44,6 +44,10 @@ namespace BlackMisc //! Find livery by combined code CLivery findByCombinedCode(const QString &combinedCode) const; + + //! Find + CLivery smartLiverySelector(const CLivery &liveryPattern) const; + }; } //namespace } // namespace diff --git a/src/blackmisc/simulation/distributorlist.cpp b/src/blackmisc/simulation/distributorlist.cpp index 5e6835a7b..f6b7d3c84 100644 --- a/src/blackmisc/simulation/distributorlist.cpp +++ b/src/blackmisc/simulation/distributorlist.cpp @@ -30,5 +30,19 @@ namespace BlackMisc return CDistributor(); } + CDistributor CDistributorList::smartDistributorSelector(const CDistributor &distributorPattern) + { + if (distributorPattern.hasValidDbKey()) + { + QString k(distributorPattern.getDbKey()); + CDistributor d(this->findByKey(k)); + if (d.hasCompleteData()) { return d; } + + // more lenient search + return this->findByIdOrAlias(k); + } + return CDistributor(); + } + } // namespace } // namespace diff --git a/src/blackmisc/simulation/distributorlist.h b/src/blackmisc/simulation/distributorlist.h index 1c6546d98..8e4453ed2 100644 --- a/src/blackmisc/simulation/distributorlist.h +++ b/src/blackmisc/simulation/distributorlist.h @@ -43,6 +43,8 @@ namespace BlackMisc //! Find by id or alias CDistributor findByIdOrAlias(const QString &name); + //! Best match by given pattern + CDistributor smartDistributorSelector(const CDistributor &distributorPattern); }; } //namespace } // namespace