swift
artifactlist.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2017 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "misc/db/artifactlist.h"
5 
6 #include "misc/stringutils.h"
7 
8 using namespace swift::misc::network;
9 
10 SWIFT_DEFINE_SEQUENCE_MIXINS(swift::misc::db, CArtifact, CArtifactList)
11 
12 namespace swift::misc::db
13 {
14  CArtifactList::CArtifactList() {}
15 
16  CArtifactList::CArtifactList(const CSequence<CArtifact> &other) : CSequence<CArtifact>(other) {}
17 
19  {
20  CPlatformSet platforms;
21  for (const CArtifact &artifact : *this) { platforms.insert(artifact.getPlatform()); }
22  return platforms;
23  }
24 
26  {
27  return this->findFirstByOrDefault(&CArtifact::getPlatform, platform.getPlatform());
28  }
29 
30  CArtifact CArtifactList::findFirstByMatchingNameOrDefault(const QString &name, Qt::CaseSensitivity cs) const
31  {
32  for (const CArtifact &artifact : *this)
33  {
34  if (artifact.matchesName(name, cs)) { return artifact; }
35  }
36  return CArtifact();
37  }
38 
40  {
41  CArtifactList artifacts;
42  for (const CArtifact &artifact : *this)
43  {
44  if (artifact.matchesAnyPlatform(platform)) { artifacts.push_back(artifact); }
45  }
46  return artifacts;
47  }
48 
50  {
51  return this->findBy(&CArtifact::getType, type);
52  }
53 
55  {
57  }
58 
60  bool findMoreStableDistribution) const
61  {
62  CArtifactList al;
63  for (const CArtifact &artifact : *this)
64  {
65  if (!artifact.isWithDistribution(distribution, findMoreStableDistribution)) { continue; }
66  al.push_back(artifact);
67  }
68  return al;
69  }
70 
72  {
73  CArtifactList al;
74  for (const CArtifact &artifact : *this)
75  {
76  if (!artifact.hasUnrestrictedDistribution()) { continue; }
77  al.push_back(artifact);
78  }
79  return al;
80  }
81 
83  const CPlatform &platform,
84  bool findMoreStableDistributions) const
85  {
86  return this->findByMatchingPlatform(platform).findByDistribution(distribution, findMoreStableDistributions);
87  }
88 
89  CArtifact CArtifactList::findFirstByVersionOrDefault(const QVersionNumber &version) const
90  {
91  return this->findFirstByOrDefault(&CArtifact::getQVersion, version);
92  }
93 
95  {
96  const QVersionNumber v = QVersionNumber::fromString(version);
97  return this->findFirstByVersionOrDefault(v);
98  }
99 
101  {
103  for (const CArtifact &artifact : *this)
104  {
105  for (const CDistribution &d : artifact.getDistributions())
106  {
107  // add only once
108  if (dl.contains(d)) { continue; }
109  dl.push_back(d);
110  }
111  }
112  return dl;
113  }
114 
115  void CArtifactList::sortByVersion(Qt::SortOrder order)
116  {
117  this->sort([order](const CArtifact &a, const CArtifact &b) {
118  const QVersionNumber av = a.getQVersion();
119  const QVersionNumber bv = b.getQVersion();
120  return order == Qt::AscendingOrder ? av < bv : bv < av;
121  });
122  }
123 
125  {
126  if (this->size() < 2) { return this->frontOrDefault(); }
127  CArtifactList copy(*this);
128  copy.sortByVersion();
129  return copy.back();
130  }
131 
133  {
134  CRemoteFileList rfs;
135  for (const CArtifact &artifact : *this)
136  {
137  const CRemoteFile rf = artifact.asRemoteFile();
138  if (rf.hasName()) { rfs.push_back(rf); }
139  }
140  return rfs;
141  }
142 
144 
145  QVersionNumber CArtifactList::getLatestQVersion() const { return this->getLatestArtifactOrDefault().getQVersion(); }
146 
147  QStringList CArtifactList::getSortedNames() const
148  {
149  CArtifactList copy(*this);
150  copy.sortByVersion(Qt::DescendingOrder);
151  QStringList names;
152  for (const CArtifact &artifact : std::as_const(copy))
153  {
154  if (artifact.hasName()) { names.push_back(artifact.getName()); }
155  }
156  return names;
157  }
158 
160  {
161  CArtifactList copy(*this);
162  copy.sortByVersion(Qt::DescendingOrder);
163  QStringList versions;
164  for (const CArtifact &artifact : std::as_const(copy))
165  {
166  if (artifact.hasVersion()) { versions.push_back(artifact.getVersion()); }
167  }
168  return versions;
169  }
170 
172  {
173  qint64 s = 0;
174  for (const CArtifact &a : *this) { s += a.getFileSize(); }
175  return s;
176  }
177 
179  {
181  }
182 
184  {
185  CArtifactList artifacts;
186  for (const QJsonValue &value : array)
187  {
188  const CArtifact artifact(CArtifact::fromDatabaseJson(value.toObject()));
189  artifacts.push_back(artifact);
190  }
191  return artifacts;
192  }
193 
195  {
196  if (json.isEmpty()) { return CArtifactList(); }
198  }
199 } // namespace swift::misc::db
iterator insert(const_iterator hint, const T &value)
For compatibility with std::inserter.
Definition: collection.h:199
static QString humanReadableFileSize(qint64 size)
Human readable (GB, MB, ..) file size.
Definition: fileutils.cpp:516
Platform (i.e.
Definition: platform.h:24
Platform getPlatform() const
Platform.
Definition: platform.h:58
static const CPlatform & currentPlatform()
Current platform.
Definition: platform.cpp:158
Value object for a set of platforms.
Definition: platformset.h:22
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
bool contains(const T &object) const
Return true if there is an element equal to given object. Uses the most efficient implementation avai...
Definition: range.h:109
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 back()
Access the last element.
Definition: sequence.h:249
void sort(Predicate p)
In-place sort by a given comparator predicate.
Definition: sequence.h:560
Artifacts ("our software" products)
Definition: artifact.h:23
bool hasUnrestrictedDistribution() const
Has unrestricted distribution.
Definition: artifact.cpp:46
bool isWithDistribution(const CDistribution &distribution, bool acceptMoreStableDistributions) const
Is distributed with given distribution?
Definition: artifact.cpp:48
bool matchesAnyPlatform(const CPlatform &platform) const
Matches any platform.
Definition: artifact.cpp:44
network::CRemoteFile asRemoteFile() const
Turn into remote file.
Definition: artifact.cpp:59
int getFileSize() const
File size.
Definition: artifact.h:77
const CPlatform & getPlatform() const
OS.
Definition: artifact.h:89
static CArtifact fromDatabaseJson(const QJsonObject &json, const QString &prefix={})
Object from database JSON format.
Definition: artifact.cpp:140
bool matchesName(const QString &name, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Matching name?
Definition: artifact.cpp:30
const CDistributionList & getDistributions() const
Related distributions.
Definition: artifact.h:98
ArtifactType getType() const
Get type.
Definition: artifact.h:68
void sortByVersion(Qt::SortOrder order=Qt::AscendingOrder)
Sort by version.
qint64 getTotalFileSize() const
Size of all artifacts.
CArtifact findFirstByMatchingNameOrDefault(const QString &name, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
FInd first by name.
CArtifactList findByType(const CArtifact::ArtifactType type) const
Find by type.
CArtifact findFirstByMatchingPlatformOrDefault(const CPlatform &platform) const
Find first by platform.
CPlatformSet getPlatforms() const
All platforms for all channels.
CArtifact findFirstByVersionOrDefault(const QVersionNumber &version) const
Find by version.
CArtifactList()
Empty constructor.
CArtifactList findByDistribution(const CDistribution &distribution, bool findMoreStableDistribution=false) const
Find by distribution.
CArtifactList findByDistributionAndPlatform(const CDistribution &distribution, const CPlatform &platform, bool findMoreStableDistributions=false) const
Find by distribution and platform.
QVersionNumber getLatestQVersion() const
Latest version.
CArtifact getLatestArtifactOrDefault() const
Latest (newest) artifact.
CArtifactList findMatchingForCurrentPlatform() const
Find for my platform.
QStringList getSortedNames() const
All unique names.
CDistributionList getDistributions() const
All distributions related to these artifacts.
CArtifactList findWithUnrestrictedDistributions() const
Find artifacts with public (unrestricted) distributions.
QStringList getSortedVersions() const
All unique versions.
static CArtifactList fromDatabaseJson(const QJsonArray &array)
From database JSON by array.
network::CRemoteFileList asRemoteFiles() const
As remote files.
QString getLatestVersion() const
Latest version.
QString getTotalFileSizeHumanReadable() const
Size of all artifacts.
CArtifactList findByMatchingPlatform(const CPlatform &platform) const
Find by platform.
Distributions for channel.
Definition: distribution.h:27
Multiple distributions for different channels:
QVersionNumber getQVersion() const
Version as QVersion.
Definition: datastore.cpp:16
const QString & getVersion() const
Version info.
Definition: datastore.h:48
bool hasName() const
Has name?
Definition: remotefile.h:58
Value object encapsulating a list of remote files.
QJsonArray jsonArrayFromString(const QString &json)
JSON Array from string.
Definition: json.cpp:431
#define SWIFT_DEFINE_SEQUENCE_MIXINS(Namespace, T, List)
Explicit template definition of mixins for a CSequence subclass.
Definition: sequence.h:63