NOISSUE do not override already loaded metadata entities with partial data

This commit is contained in:
Petr Mrázek 2017-12-14 02:22:20 +01:00
parent f18afd3d1e
commit daf9d0eaa7
8 changed files with 55 additions and 37 deletions

View File

@ -46,7 +46,6 @@ public: /* types */
public: public:
virtual ~BaseEntity(); virtual ~BaseEntity();
virtual void merge(const std::shared_ptr<BaseEntity> &other) = 0;
virtual void parse(const QJsonObject &obj) = 0; virtual void parse(const QJsonObject &obj) = 0;
virtual QString localFilename() const = 0; virtual QString localFilename() const = 0;

View File

@ -103,7 +103,7 @@ void Index::parse(const QJsonObject& obj)
parseIndex(obj, this); parseIndex(obj, this);
} }
void Index::merge(const Ptr &other) void Index::merge(const std::shared_ptr<Index> &other)
{ {
const QVector<VersionListPtr> lists = std::dynamic_pointer_cast<Index>(other)->m_lists; const QVector<VersionListPtr> lists = std::dynamic_pointer_cast<Index>(other)->m_lists;
// initial load, no need to merge // initial load, no need to merge
@ -124,7 +124,7 @@ void Index::merge(const Ptr &other)
{ {
if (m_uids.contains(list->uid())) if (m_uids.contains(list->uid()))
{ {
m_uids[list->uid()]->merge(list); m_uids[list->uid()]->mergeFromIndex(list);
} }
else else
{ {

View File

@ -58,7 +58,7 @@ public:
QVector<VersionListPtr> lists() const { return m_lists; } QVector<VersionListPtr> lists() const { return m_lists; }
public: // for usage by parsers only public: // for usage by parsers only
void merge(const BaseEntity::Ptr &other) override; void merge(const std::shared_ptr<Index> &other);
void parse(const QJsonObject &obj) override; void parse(const QJsonObject &obj) override;
private: private:

View File

@ -29,7 +29,7 @@ namespace Meta
{ {
// Index // Index
static BaseEntity::Ptr parseIndexInternal(const QJsonObject &obj) static std::shared_ptr<Index> parseIndexInternal(const QJsonObject &obj)
{ {
const QVector<QJsonObject> objects = requireIsArrayOf<QJsonObject>(obj, "packages"); const QVector<QJsonObject> objects = requireIsArrayOf<QJsonObject>(obj, "packages");
QVector<VersionListPtr> lists; QVector<VersionListPtr> lists;
@ -59,7 +59,7 @@ static VersionPtr parseCommonVersion(const QString &uid, const QJsonObject &obj)
return version; return version;
} }
static BaseEntity::Ptr parseVersionInternal(const QJsonObject &obj) static std::shared_ptr<Version> parseVersionInternal(const QJsonObject &obj)
{ {
VersionPtr version = parseCommonVersion(requireString(obj, "uid"), obj); VersionPtr version = parseCommonVersion(requireString(obj, "uid"), obj);
@ -70,7 +70,7 @@ static BaseEntity::Ptr parseVersionInternal(const QJsonObject &obj)
} }
// Version list / package // Version list / package
static BaseEntity::Ptr parseVersionListInternal(const QJsonObject &obj) static std::shared_ptr<VersionList> parseVersionListInternal(const QJsonObject &obj)
{ {
const QString uid = requireString(obj, "uid"); const QString uid = requireString(obj, "uid");

View File

@ -54,43 +54,47 @@ void Meta::Version::parse(const QJsonObject& obj)
parseVersion(obj, this); parseVersion(obj, this);
} }
void Meta::Version::merge(const std::shared_ptr<BaseEntity> &other) void Meta::Version::mergeFromList(const Meta::VersionPtr& other)
{ {
VersionPtr version = std::dynamic_pointer_cast<Version>(other); if(other->m_providesRecommendations)
if(version->m_providesRecommendations)
{ {
if(m_recommended != version->m_recommended) if(m_recommended != other->m_recommended)
{ {
setRecommended(version->m_recommended); setRecommended(other->m_recommended);
} }
} }
if (m_type != version->m_type) if (m_type != other->m_type)
{ {
setType(version->m_type); setType(other->m_type);
} }
if (m_time != version->m_time) if (m_time != other->m_time)
{ {
setTime(version->m_time); setTime(other->m_time);
} }
if (m_requires != version->m_requires) if (m_requires != other->m_requires)
{ {
m_requires = version->m_requires; m_requires = other->m_requires;
} }
if (m_conflicts != version->m_conflicts) if (m_conflicts != other->m_conflicts)
{ {
m_conflicts = version->m_conflicts; m_conflicts = other->m_conflicts;
} }
if (m_parentUid != version->m_parentUid) if (m_parentUid != other->m_parentUid)
{ {
setParentUid(version->m_parentUid); setParentUid(other->m_parentUid);
} }
if(m_volatile != version->m_volatile) if(m_volatile != other->m_volatile)
{ {
setVolatile(version->m_volatile); setVolatile(other->m_volatile);
} }
if(version->m_data) }
void Meta::Version::merge(const VersionPtr &other)
{ {
setData(version->m_data); mergeFromList(other);
if(other->m_data)
{
setData(other->m_data);
} }
} }

View File

@ -84,7 +84,8 @@ public: /* con/des */
return m_data != nullptr; return m_data != nullptr;
} }
void merge(const std::shared_ptr<BaseEntity> &other) override; void merge(const VersionPtr &other);
void mergeFromList(const VersionPtr &other);
void parse(const QJsonObject &obj) override; void parse(const QJsonObject &obj) override;
QString localFilename() const override; QString localFilename() const override;

View File

@ -19,6 +19,7 @@
#include "Version.h" #include "Version.h"
#include "JsonFormat.h" #include "JsonFormat.h"
#include "Version.h"
namespace Meta namespace Meta
{ {
@ -189,32 +190,44 @@ static const Meta::VersionPtr &getBetterVersion(const Meta::VersionPtr &a, const
return (a->type() == "release" ? a : b); return (a->type() == "release" ? a : b);
} }
void VersionList::merge(const BaseEntity::Ptr &other) void VersionList::mergeFromIndex(const VersionListPtr &other)
{ {
const VersionListPtr list = std::dynamic_pointer_cast<VersionList>(other); if (m_name != other->m_name)
if (m_name != list->m_name)
{ {
setName(list->m_name); setName(other->m_name);
} }
if(m_parentUid != list->m_parentUid) if(m_parentUid != other->m_parentUid)
{ {
setParentUid(list->m_parentUid); setParentUid(other->m_parentUid);
}
}
void VersionList::merge(const VersionListPtr &other)
{
if (m_name != other->m_name)
{
setName(other->m_name);
}
if(m_parentUid != other->m_parentUid)
{
setParentUid(other->m_parentUid);
} }
// TODO: do not reset the whole model. maybe? // TODO: do not reset the whole model. maybe?
beginResetModel(); beginResetModel();
m_versions.clear(); m_versions.clear();
if(list->m_versions.isEmpty()) if(other->m_versions.isEmpty())
{ {
qWarning() << "Empty list loaded ..."; qWarning() << "Empty list loaded ...";
} }
for (const VersionPtr &version : list->m_versions) for (const VersionPtr &version : other->m_versions)
{ {
// we already have the version. merge the contents // we already have the version. merge the contents
if (m_lookup.contains(version->version())) if (m_lookup.contains(version->version()))
{ {
m_lookup.value(version->version())->merge(version); m_lookup.value(version->version())->mergeFromList(version);
} }
else else
{ {

View File

@ -80,7 +80,8 @@ public: // for usage only by parsers
void setName(const QString &name); void setName(const QString &name);
void setParentUid(const QString &parentUid); void setParentUid(const QString &parentUid);
void setVersions(const QVector<VersionPtr> &versions); void setVersions(const QVector<VersionPtr> &versions);
void merge(const BaseEntity::Ptr &other) override; void merge(const VersionListPtr &other);
void mergeFromIndex(const VersionListPtr &other);
void parse(const QJsonObject &obj) override; void parse(const QJsonObject &obj) override;
signals: signals: