From c82efe441fca6efc500f398a2e4ab2664db5fc60 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sun, 17 Feb 2019 16:34:12 +0100 Subject: [PATCH] Ref T472, category support for ICAO value objects --- src/blackmisc/aviation/aircrafticaocode.cpp | 10 ++++++++-- src/blackmisc/aviation/aircrafticaocode.h | 17 +++++++++++++++-- .../aviation/aircrafticaocodelist.cpp | 19 +++++++++++++++---- src/blackmisc/aviation/aircrafticaocodelist.h | 4 +++- 4 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/blackmisc/aviation/aircrafticaocode.cpp b/src/blackmisc/aviation/aircrafticaocode.cpp index 7e5220073..eee9fb8ec 100644 --- a/src/blackmisc/aviation/aircrafticaocode.cpp +++ b/src/blackmisc/aviation/aircrafticaocode.cpp @@ -584,6 +584,7 @@ namespace BlackMisc switch (i) { case IndexAircraftDesignator: return CVariant::fromValue(m_designator); + case IndexCategory: return m_category.propertyByIndex(index.copyFrontRemoved()); case IndexIataCode: return CVariant::fromValue(m_iataCode); case IndexFamily: return CVariant::fromValue(m_family); case IndexCombinedAircraftType: return CVariant::fromValue(m_combinedType); @@ -611,6 +612,7 @@ namespace BlackMisc switch (i) { case IndexAircraftDesignator: this->setDesignator(variant.value()); break; + case IndexCategory: m_category.setPropertyByIndex(index.copyFrontRemoved(), variant); break; case IndexIataCode: this->setIataCode(variant.value()); break; case IndexFamily: this->setFamily(variant.value()); break; case IndexCombinedAircraftType: this->setCombinedType(variant.value()); break; @@ -634,6 +636,7 @@ namespace BlackMisc switch (i) { case IndexAircraftDesignator: return m_designator.compare(compareValue.getDesignator(), Qt::CaseInsensitive); + case IndexCategory: return m_category.comparePropertyByIndex(index.copyFrontRemoved(), compareValue.getCategory()); case IndexIataCode: return m_iataCode.compare(compareValue.getIataCode(), Qt::CaseInsensitive); case IndexFamily: return m_family.compare(compareValue.getFamily(), Qt::CaseInsensitive); case IndexCombinedAircraftType: return m_combinedType.compare(compareValue.getCombinedType(), Qt::CaseInsensitive); @@ -770,6 +773,8 @@ namespace BlackMisc return CAircraftIcaoCode(); } + const int engineCount(json.value(prefix % u"enginecount").toInt(-1)); + const int categoryId(json.value(prefix % u"idcategory").toInt(-1)); const QString designator(json.value(prefix % u"designator").toString()); const QString iata(json.value(prefix % u"iata").toString()); const QString family(json.value(prefix % u"family").toString()); @@ -779,8 +784,8 @@ namespace BlackMisc const QString modelSwift(json.value(prefix % u"modelswift").toString()); const QString type(json.value(prefix % u"type").toString()); const QString engine(json.value(prefix % u"engine").toString()); - const int engineCount(json.value(prefix % u"enginecount").toInt(-1)); const QString combined(createdCombinedString(type, engineCount, engine)); + QString wtc(json.value(prefix % u"wtc").toString()); if (wtc.length() > 1 && wtc.contains("/")) { @@ -800,6 +805,7 @@ namespace BlackMisc real, legacy, military, rank ); code.setKeyVersionTimestampFromDatabaseJson(json, prefix); + if (categoryId >=0) { code.setCategoryId(categoryId); } return code; } @@ -813,7 +819,7 @@ namespace BlackMisc QString CAircraftIcaoCode::createdCombinedString(const QString &type, int engineCount, const QString &engine) { - const bool valid = engineCount >= 0 && engineCount < 10; + const bool valid = (engineCount >= 0 && engineCount < 10); return createdCombinedString(type, valid ? QString::number(engineCount) : "", engine); } } // namespace diff --git a/src/blackmisc/aviation/aircrafticaocode.h b/src/blackmisc/aviation/aircrafticaocode.h index 2fdd7da4b..9a3327e18 100644 --- a/src/blackmisc/aviation/aircrafticaocode.h +++ b/src/blackmisc/aviation/aircrafticaocode.h @@ -12,6 +12,7 @@ #ifndef BLACKMISC_AVIATION_AIRCRAFTICAOCODE_H #define BLACKMISC_AVIATION_AIRCRAFTICAOCODE_H +#include "aircraftcategory.h" #include "blackmisc/db/datastore.h" #include "blackmisc/pq/length.h" #include "blackmisc/blackmiscexport.h" @@ -39,7 +40,7 @@ namespace BlackMisc //! Properties by index enum ColumnIndex { - IndexAircraftDesignator = BlackMisc::CPropertyIndex::GlobalIndexCAircraftIcaoCode, + IndexAircraftDesignator = CPropertyIndex::GlobalIndexCAircraftIcaoCode, IndexIataCode, IndexFamily, IndexCombinedAircraftType, @@ -54,6 +55,7 @@ namespace BlackMisc IndexIsLegacy, IndexIsVtol, IndexRank, + IndexCategory, IndexDesignatorManufacturer //!< designator and manufacturer }; @@ -254,6 +256,15 @@ namespace BlackMisc //! Combined family descriptive string with key QString getCombinedFamilyStringWithKey() const; + //! Get category + const CAircraftCategory &getCategory() const { return m_category; } + + //! Set category + void setCategory(const CAircraftCategory &category) { m_category = category; } + + //! Set category id + void setCategoryId(int id) { m_category.setDbKey(id); } + //! All data set? bool hasCompleteData() const; @@ -348,7 +359,8 @@ namespace BlackMisc bool m_realWorld = true; //!< real world aircraft bool m_legacy = false; //!< legacy code bool m_military = false; //!< military aircraft? - int m_rank = 10; //!< rank among same codes (0 is best) + int m_rank = 10; //!< rank among same codes (0 is best) + CAircraftCategory m_category; //!< aircraft category //! Create a combined string like L2J static QString createdCombinedString(const QString &type, const QString &engineCount, const QString &engine); @@ -368,6 +380,7 @@ namespace BlackMisc BLACK_METAMEMBER(modelDescription), BLACK_METAMEMBER(modelIataDescription), BLACK_METAMEMBER(modelSwiftDescription), + BLACK_METAMEMBER(category), BLACK_METAMEMBER(wtc), BLACK_METAMEMBER(military), BLACK_METAMEMBER(realWorld), diff --git a/src/blackmisc/aviation/aircrafticaocodelist.cpp b/src/blackmisc/aviation/aircrafticaocodelist.cpp index 6ddfdab2a..b45b13b1b 100644 --- a/src/blackmisc/aviation/aircrafticaocodelist.cpp +++ b/src/blackmisc/aviation/aircrafticaocodelist.cpp @@ -7,7 +7,8 @@ * contained in the LICENSE file. */ -#include "blackmisc/aviation/aircrafticaocodelist.h" +#include "aircrafticaocodelist.h" +#include "aircraftcategorylist.h" #include "blackmisc/range.h" #include @@ -314,19 +315,29 @@ namespace BlackMisc { const QMap counts(countManufacturers()); if (counts.isEmpty()) return { {}, 0 }; - const auto pair = *std::max_element(counts.keyValueBegin(), counts.keyValueEnd(), [](const auto &a, const auto &b) + const auto pair = *std::max_element(counts.keyValueBegin(), counts.keyValueEnd(), [](const auto & a, const auto & b) { return a.second < b.second; }); return { pair.first, pair.second }; } - CAircraftIcaoCodeList CAircraftIcaoCodeList::fromDatabaseJson(const QJsonArray &array, bool ignoreIncompleteAndDuplicates, CAircraftIcaoCodeList *inconsistent) + CAircraftIcaoCodeList CAircraftIcaoCodeList::fromDatabaseJson(const QJsonArray &array, const CAircraftCategoryList &categories, bool ignoreIncompleteAndDuplicates, CAircraftIcaoCodeList *inconsistent) { CAircraftIcaoCodeList codes; for (const QJsonValue &value : array) { - const CAircraftIcaoCode icao(CAircraftIcaoCode::fromDatabaseJson(value.toObject())); + CAircraftIcaoCode icao(CAircraftIcaoCode::fromDatabaseJson(value.toObject())); + const int catId = icao.getCategory().getDbKey(); + if (!categories.isEmpty() && catId >= 0) + { + const CAircraftCategory category = categories.findByKey(catId); + if (!category.isNull()) + { + icao.setCategory(category); + } + } + if (!icao.hasSpecialDesignator() && !icao.hasCompleteData()) { if (ignoreIncompleteAndDuplicates) { continue; } diff --git a/src/blackmisc/aviation/aircrafticaocodelist.h b/src/blackmisc/aviation/aircrafticaocodelist.h index ce649cba3..eb5afa1a3 100644 --- a/src/blackmisc/aviation/aircrafticaocodelist.h +++ b/src/blackmisc/aviation/aircrafticaocodelist.h @@ -28,6 +28,8 @@ namespace BlackMisc { namespace Aviation { + class CAircraftCategoryList; + //! Value object encapsulating a list of ICAO codes. class BLACKMISC_EXPORT CAircraftIcaoCodeList : public CSequence, @@ -139,7 +141,7 @@ namespace BlackMisc QPair maxCountManufacturer() const; //! From our database JSON format - static CAircraftIcaoCodeList fromDatabaseJson(const QJsonArray &array, bool ignoreIncompleteAndDuplicates = true, CAircraftIcaoCodeList *inconsistent = nullptr); + static CAircraftIcaoCodeList fromDatabaseJson(const QJsonArray &array, const CAircraftCategoryList &categories, bool ignoreIncompleteAndDuplicates = true, CAircraftIcaoCodeList *inconsistent = nullptr); }; } //namespace } // namespace