swift
liverylist.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2015 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include "misc/predicates.h"
7 #include "misc/range.h"
8 
9 using namespace swift::misc::aviation;
10 
11 SWIFT_DEFINE_SEQUENCE_MIXINS(swift::misc::aviation, CLivery, CLiveryList)
12 
13 namespace swift::misc::aviation
14 {
16 
18  {
19  QString icaoCode(icao.trimmed().toUpper());
20  if (icaoCode.isEmpty()) { return {}; }
21  return this->findBy(&CLivery::getAirlineIcaoCodeDesignator, icaoCode);
22  }
23 
25  {
26  if (this->isEmpty() || !icao.hasValidDesignator()) { return {}; }
27  CLiveryList candidates;
28  for (const CLivery &livery : *this)
29  {
30  if (!livery.isAirlineStandardLivery()) { continue; }
31  const CAirlineIcaoCode livIcao = livery.getAirlineIcaoCode();
32  if (livIcao.isDbEqual(icao)) { return livery; }
33  if (livIcao.getVDesignator() != icao.getVDesignator()) { continue; }
34  if (icao.getName().size() > 5 && livery.getDescription().contains(icao.getName(), Qt::CaseInsensitive))
35  {
36  return livery;
37  }
38  candidates.push_back(livery);
39  }
40 
41  if (candidates.size() < 2) { return candidates.frontOrDefault(); }
42  const CLiveryList operatingAirlines = candidates.findBy(&CLivery::isAirlineOperating, true);
43  if (!operatingAirlines.isEmpty()) { return operatingAirlines.frontOrDefault(); }
44  return candidates.frontOrDefault();
45  }
46 
48  {
49  const QString icaoDesignator(icao.trimmed().toUpper());
50  if (icaoDesignator.isEmpty()) { return {}; }
51  return this->findFirstByOrDefault([&](const CLivery &livery) {
52  if (!livery.isAirlineStandardLivery()) { return false; }
53  return livery.getAirlineIcaoCode().matchesVDesignator(icaoDesignator);
54  });
55  }
56 
58  {
59  if (containedString.isEmpty()) { return {}; }
60  return this->findBy([&](const CLivery &livery) {
61  // keep isAirlineStandardLivery first (faster)
62  return livery.isAirlineStandardLivery() && livery.isContainedInSimplifiedAirlineName(containedString);
63  });
64  }
65 
67  {
68  if (candidate.isEmpty()) { return {}; }
69  return this->findBy([&](const CLivery &livery) {
70  // keep isAirlineStandardLivery first (faster)
71  return livery.isAirlineStandardLivery() &&
73  });
74  }
75 
77  {
78  if (!fuselage.isValid() || !tail.isValid()) { return {}; }
79  return this->findFirstByOrDefault([&](const CLivery &livery) {
80  if (!livery.isColorLivery()) { return false; }
81  return livery.matchesColors(fuselage, tail);
82  });
83  }
84 
86  {
87  if (!fuselage.isValid() || !tail.isValid()) { return {}; }
88  CLivery bestMatch;
89  double bestDistance = 1.0;
90  for (const CLivery &livery : *this)
91  {
92  if (!livery.isColorLivery()) { continue; }
93  const double d = livery.getColorDistance(fuselage, tail);
94  if (d == 0.0) { return livery; } // exact match
95  if (d < bestDistance)
96  {
97  bestMatch = livery;
98  bestDistance = d;
99  }
100  }
101  return bestMatch;
102  }
103 
105  {
106  if (!CLivery::isValidCombinedCode(combinedCode)) { return {}; }
107  return this->findFirstByOrDefault(
108  [&](const CLivery &livery) { return livery.matchesCombinedCode(combinedCode); });
109  }
110 
112  {
113  if (this->isEmpty()) { return {}; }
115  if (sort) { codes.sort(); }
116  return codes;
117  }
118 
120  {
121  if (this->isEmpty()) { return {}; }
123  if (sort) { codes.sort(); }
124  return codes;
125  }
126 
128  {
129  if (this->isEmpty()) { return {}; }
131  if (sort) { codes.sort(); }
132  return codes;
133  }
134 
136  {
137  CAirlineIcaoCodeList icaos;
138  for (const CLivery &livery : *this) { icaos.push_back(livery.getAirlineIcaoCode()); }
139  return icaos;
140  }
141 
143  {
144  // multiple searches are slow, maybe we can performance optimize this
145  // in the future
146 
147  // first try on id, that would be perfect
148  if (liveryPattern.hasValidDbKey()) { return liveryPattern; }
149 
150  // by combined code
151  if (liveryPattern.hasCombinedCode())
152  {
153  const QString cc(liveryPattern.getCombinedCode());
154  const CLivery l(this->findByCombinedCode(cc));
155  if (l.hasCompleteData()) { return l; }
156  }
157 
158  // by airline
159  if (liveryPattern.hasValidAirlineDesignator())
160  {
161  const QString icao(liveryPattern.getAirlineIcaoCodeDesignator());
162  const CLivery l(this->findStdLiveryByAirlineIcaoVDesignator(icao));
163  if (l.hasCompleteData()) { return l; }
164 
165  // lenient search by assuming that a virtual airline is not annotated by "V"
166  // VHDU not found, but HDU
167  const CLiveryList liveries = this->findByAirlineIcaoDesignator(icao);
168  if (liveries.size() == 1) { return liveries.front(); }
169  if (liveries.size() > 1)
170  {
171  if (liveryPattern.hasAirlineName())
172  {
173  // reduce by name
174  const CLiveryList liveriesByName =
175  liveries.findStdLiveriesBySimplifiedAirlineName(liveryPattern.getAirlineName());
176  if (!liveriesByName.isEmpty()) { return liveriesByName.front(); }
177  }
178  return liveries.front();
179  }
180  }
181 
182  // lenient search by name contained (slow)
183  if (liveryPattern.getAirlineIcaoCode().hasName())
184  {
185  const QString search(liveryPattern.getAirlineIcaoCode().getSimplifiedName());
186  const CLiveryList liveries(this->findStdLiveriesByNamesOrTelephonyDesignator(search));
187  if (!liveries.isEmpty()) { return liveries.front(); }
188  }
189  return {};
190  }
191 
193  const CAirlineIcaoCodeList &relatedAirlines)
194  {
195  AirlineIcaoIdMap airlineIcaos = relatedAirlines.toIdMap();
196 
197  CLiveryList models;
198  for (const QJsonValue &value : array)
199  {
200  models.push_back(CLivery::fromDatabaseJsonCaching(value.toObject(), airlineIcaos));
201  }
202  return models;
203  }
204 } // namespace swift::misc::aviation
auto findFirstByOrDefault(Predicate p, const Value &def) const
Return a copy of the first element for which a given predicate returns true, or a default value if th...
Definition: range.h:70
auto transform(F function) const
Return a new container generated by applying some transformation function to all elements of this one...
Definition: range.h:403
bool isValid() const
Valid?
Definition: rgbcolor.cpp:141
size_type size() const
Returns number of elements in the sequence.
Definition: sequence.h:273
const_reference frontOrDefault() const
Access the first element, or a default-initialized value if the sequence is empty.
Definition: sequence.h:239
CSequence findBy(Predicate p) const
Return a copy containing only those elements for which a given predicate returns true.
Definition: sequence.h:398
void push_back(const T &value)
Appends an element at the end of the sequence.
Definition: sequence.h:305
reference front()
Access the first element.
Definition: sequence.h:225
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
Value object for ICAO classification.
QString getSimplifiedName() const
Get a simplified upper case name for searching by removing all characters except A-Z.
bool hasValidDesignator() const
Airline designator available?
bool matchesVDesignator(const QString &designator) const
Matches v-designator string?
bool matchesNamesOrTelephonyDesignator(const QString &candidate) const
Relaxed check by name or telephony designator (aka callsign, not to be confused with CCallsign)
QString getVDesignator() const
Get airline, e.g. "DLH", but "VMVA" for virtual airlines.
const QString & getName() const
Get name, e.g. "Lufthansa".
bool hasName() const
Has (airline) name?
Value object encapsulating a list of ICAO codes.
AirlineIcaoIdMap toIdMap() const
To id map.
Value object encapsulating information about an airpot.
Definition: livery.h:29
const QString & getAirlineIcaoCodeDesignator() const
Corresponding airline designator, if any.
Definition: livery.h:68
bool hasAirlineName() const
Has airline name?
Definition: livery.cpp:157
double getColorDistance(const CLivery &otherLivery) const
Color distance 0..1 (0 is best)
Definition: livery.cpp:180
bool matchesCombinedCode(const QString &candidate) const
Matches combined code.
Definition: livery.cpp:99
const CAirlineIcaoCode & getAirlineIcaoCode() const
Corresponding airline, if any.
Definition: livery.h:65
QString getCombinedCodePlusInfoAndId() const
Combined code, info, plus id.
Definition: livery.cpp:69
static bool isValidCombinedCode(const QString &candidate)
Valid combined code string?
Definition: livery.cpp:280
bool hasValidAirlineDesignator() const
Airline available?
Definition: livery.cpp:155
const QString & getAirlineName() const
Get corresponding airline name.
Definition: livery.h:86
bool isAirlineOperating() const
Is airline operating?
Definition: livery.cpp:167
bool hasCompleteData() const
Complete data?
Definition: livery.cpp:124
bool isAirlineStandardLivery() const
Livery representing airline standard livery.
Definition: livery.cpp:172
const QString & getCombinedCode() const
Combined code.
Definition: livery.h:71
bool matchesColors(const CRgbColor &fuselage, const CRgbColor &tail) const
Matches colors.
Definition: livery.cpp:106
const QString & getDescription() const
Get description.
Definition: livery.h:83
static CLivery fromDatabaseJsonCaching(const QJsonObject &json, AirlineIcaoIdMap &airlineIcaos, const QString &prefix=QString("liv_"))
Object from JSON caching.
Definition: livery.cpp:233
bool isContainedInSimplifiedAirlineName(const QString &candidate) const
Does simplified airline name contain the candidate.
Definition: livery.cpp:74
bool hasCombinedCode() const
Livery combined code available?
Definition: livery.cpp:159
bool isColorLivery() const
Color livery?
Definition: livery.cpp:178
QString getCombinedCodePlusInfo() const
Combined code plus info.
Definition: livery.cpp:58
Value object for a list of airports.
Definition: liverylist.h:29
QStringList getCombinedCodesPlusInfo(bool sort=false) const
All combined codes plus more info.
Definition: liverylist.cpp:119
CLiveryList findStdLiveriesByNamesOrTelephonyDesignator(const QString &candidate) const
By names or telephony designator(aka callsign)
Definition: liverylist.cpp:66
CAirlineIcaoCodeList getAirlines() const
All aircraft codes.
Definition: liverylist.cpp:135
CLiveryList()=default
Default constructor.
QStringList getCombinedCodes(bool sort=false) const
All combined codes.
Definition: liverylist.cpp:111
CLiveryList findByAirlineIcaoDesignator(const QString &icao) const
Find livery by airline.
Definition: liverylist.cpp:17
static CLiveryList fromDatabaseJsonCaching(const QJsonArray &array, const CAirlineIcaoCodeList &relatedAirlines={})
Caching version from DB data.
Definition: liverylist.cpp:192
CLivery smartLiverySelector(const CLivery &liveryPattern) const
Find by multiple criteria.
Definition: liverylist.cpp:142
CLivery findColorLiveryOrDefault(const CRgbColor &fuselage, const CRgbColor &tail) const
Search for colors.
Definition: liverylist.cpp:76
CLivery findClosestColorLiveryOrDefault(const CRgbColor &fuselage, const CRgbColor &tail) const
Search for colors.
Definition: liverylist.cpp:85
QStringList getCombinedCodesPlusInfoAndId(bool sort=false) const
All combined codes plus more info.
Definition: liverylist.cpp:127
CLivery findStdLiveryByAirlineIcaoVDesignator(const QString &icao) const
Find livery by airline.
Definition: liverylist.cpp:47
CLiveryList findStdLiveriesBySimplifiedAirlineName(const QString &containedString) const
By simplified name.
Definition: liverylist.cpp:57
CLivery findByCombinedCode(const QString &combinedCode) const
Find livery by combined code.
Definition: liverylist.cpp:104
bool isDbEqual(const IDatastoreObjectWithIntegerKey &other) const
Same DB key and hence equal.
Definition: datastore.h:105
bool hasValidDbKey() const
Has valid DB key.
Definition: datastore.h:102
auto MemberTransform(T memberFunc)
Returns a function object that returns the value returned by one of it's argument member functions.
Definition: predicates.h:54
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
qsizetype size() const const
QString toUpper() const const
QString trimmed() const const
void sort(Qt::CaseSensitivity cs)
CaseInsensitive
#define SWIFT_DEFINE_SEQUENCE_MIXINS(Namespace, T, List)
Explicit template definition of mixins for a CSequence subclass.
Definition: sequence.h:63