Merge lp:~aacid/unity-scopes-shell/optimize_resultsmodel_data into lp:unity-scopes-shell

Proposed by Albert Astals Cid
Status: Merged
Approved by: Marcus Tomlinson
Approved revision: 338
Merged at revision: 347
Proposed branch: lp:~aacid/unity-scopes-shell/optimize_resultsmodel_data
Merge into: lp:unity-scopes-shell
Diff against target: 185 lines (+50/-34)
2 files modified
src/Unity/resultsmodel.cpp (+48/-32)
src/Unity/resultsmodel.h (+2/-2)
To merge this branch: bzr merge lp:~aacid/unity-scopes-shell/optimize_resultsmodel_data
Reviewer Review Type Date Requested Status
Marcus Tomlinson (community) Approve
Review via email: mp+300883@code.launchpad.net

Commit message

Optimize ResultsModel::data a bit

Do the role to component string early in ::setComponentsMapping instead of every time in ::data
This way we do not need to create temporary strings every time ::data gets called

Also since we know there's a finite amount of roles, store the role->string mapping in a vector instead of a map/hash

To post a comment you must log in.
Revision history for this message
Marcus Tomlinson (marcustomlinson) wrote :

Looks good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/Unity/resultsmodel.cpp'
--- src/Unity/resultsmodel.cpp 2016-05-05 09:40:46 +0000
+++ src/Unity/resultsmodel.cpp 2016-07-22 13:17:47 +0000
@@ -43,6 +43,7 @@
43 , m_maxAttributes(2)43 , m_maxAttributes(2)
44 , m_purge(true)44 , m_purge(true)
45{45{
46 m_componentMapping.resize(RoleSocialActions + 1);
46}47}
4748
48QString ResultsModel::categoryId() const49QString ResultsModel::categoryId() const
@@ -60,17 +61,45 @@
6061
61void ResultsModel::setComponentsMapping(QHash<QString, QString> const& mapping)62void ResultsModel::setComponentsMapping(QHash<QString, QString> const& mapping)
62{63{
63 std::unordered_map<std::string, std::string> newMapping;64 QVector<std::string> newMapping(RoleSocialActions + 1);
64 for (auto it = mapping.begin(); it != mapping.end(); ++it) {65 for (auto it = mapping.begin(); it != mapping.end(); ++it) {
65 newMapping[it.key().toStdString()] = it.value().toStdString();66 Roles field;
67 const QString fieldName = it.key();
68 if (fieldName == QLatin1String("title")) {
69 field = RoleTitle;
70 } else if (fieldName == QLatin1String("attributes")) {
71 field = RoleAttributes;
72 } else if (fieldName == QLatin1String("art")) {
73 field = RoleArt;
74 } else if (fieldName == QLatin1String("subtitle")) {
75 field = RoleSubtitle;
76 } else if (fieldName == QLatin1String("mascot")) {
77 field = RoleMascot;
78 } else if (fieldName == QLatin1String("emblem")) {
79 field = RoleEmblem;
80 } else if (fieldName == QLatin1String("summary")) {
81 field = RoleSummary;
82 } else if (fieldName == QLatin1String("background")) {
83 field = RoleBackground;
84 } else if (fieldName == QLatin1String("overlay-color")) {
85 field = RoleOverlayColor;
86 } else if (fieldName == QLatin1String("quick-preview-data")) {
87 field = RoleQuickPreviewData;
88 } else if (fieldName == QLatin1String("social-actions")) {
89 field = RoleSocialActions;
90 } else {
91 qDebug() << "Unknown components field" << fieldName;
92 break;
93 }
94 newMapping[field] = it.value().toStdString();
66 }95 }
6796
68 if (rowCount() > 0) {97 if (rowCount() > 0) {
69 beginResetModel();98 beginResetModel();
70 m_componentMapping.swap(newMapping);99 m_componentMapping = newMapping;
71 endResetModel();100 endResetModel();
72 } else {101 } else {
73 m_componentMapping.swap(newMapping);102 m_componentMapping = newMapping;
74 }103 }
75}104}
76105
@@ -218,13 +247,11 @@
218}247}
219248
220QVariant249QVariant
221ResultsModel::componentValue(scopes::Result const* result, std::string const& fieldName) const250ResultsModel::componentValue(scopes::Result const* result, Roles field) const
222{251{
223 auto mappingIt = m_componentMapping.find(fieldName);252 std::string const& realFieldName = m_componentMapping[field];
224 if (mappingIt == m_componentMapping.end()) {253 if (realFieldName.empty())
225 return QVariant();254 return QVariant();
226 }
227 std::string const& realFieldName = mappingIt->second;
228 try {255 try {
229 scopes::Variant const& v = result->value(realFieldName);256 scopes::Variant const& v = result->value(realFieldName);
230 return scopeVariantToQVariant(v);257 return scopeVariantToQVariant(v);
@@ -238,12 +265,8 @@
238QVariant265QVariant
239ResultsModel::attributesValue(scopes::Result const* result) const266ResultsModel::attributesValue(scopes::Result const* result) const
240{267{
241 auto mappingIt = m_componentMapping.find("attributes");
242 if (mappingIt == m_componentMapping.end()) {
243 return QVariant();
244 }
245 try {268 try {
246 std::string const& realFieldName = mappingIt->second;269 std::string const& realFieldName = m_componentMapping[RoleAttributes];
247 scopes::Variant const& v = result->value(realFieldName);270 scopes::Variant const& v = result->value(realFieldName);
248 if (v.which() != scopes::Variant::Type::Array) {271 if (v.which() != scopes::Variant::Type::Array) {
249 return QVariant();272 return QVariant();
@@ -301,7 +324,7 @@
301QVariant324QVariant
302ResultsModel::data(const QModelIndex& index, int role) const325ResultsModel::data(const QModelIndex& index, int role) const
303{326{
304 int row = index.row();327 const int row = index.row();
305 if (row >= m_results.size())328 if (row >= m_results.size())
306 {329 {
307 qWarning() << "ResultsModel::data - invalid index" << row << "size"330 qWarning() << "ResultsModel::data - invalid index" << row << "size"
@@ -309,7 +332,7 @@
309 return QVariant();332 return QVariant();
310 }333 }
311334
312 scopes::Result* result = m_results.at(index.row()).get();335 scopes::Result* result = m_results.at(row).get();
313336
314 switch (role) {337 switch (role) {
315 case RoleUri:338 case RoleUri:
@@ -319,11 +342,9 @@
319 case RoleDndUri:342 case RoleDndUri:
320 return QString::fromStdString(result->dnd_uri());343 return QString::fromStdString(result->dnd_uri());
321 case RoleResult:344 case RoleResult:
322 return QVariant::fromValue(std::static_pointer_cast<unity::scopes::Result>(m_results.at(index.row())));345 return QVariant::fromValue(std::static_pointer_cast<unity::scopes::Result>(m_results.at(row)));
323 case RoleTitle:
324 return componentValue(result, "title");
325 case RoleArt: {346 case RoleArt: {
326 QString image(componentValue(result, "art").toString());347 QString image(componentValue(result, RoleArt).toString());
327 if (image.isEmpty()) {348 if (image.isEmpty()) {
328 QString uri(QString::fromStdString(result->uri()));349 QString uri(QString::fromStdString(result->uri()));
329 // FIXME: figure out a better way and get rid of this, it's an awful hack350 // FIXME: figure out a better way and get rid of this, it's an awful hack
@@ -339,25 +360,24 @@
339 }360 }
340 return image;361 return image;
341 }362 }
363 case RoleTitle:
342 case RoleSubtitle:364 case RoleSubtitle:
343 return componentValue(result, "subtitle");
344 case RoleMascot:365 case RoleMascot:
345 return componentValue(result, "mascot");
346 case RoleEmblem:366 case RoleEmblem:
347 return componentValue(result, "emblem");367 case RoleSummary:
368 case RoleOverlayColor:
369 case RoleQuickPreviewData:
370 case RoleSocialActions:
371 return componentValue(result, Roles(role));
348 case RoleAttributes:372 case RoleAttributes:
349 return attributesValue(result);373 return attributesValue(result);
350 case RoleSummary:
351 return componentValue(result, "summary");
352 case RoleBackground: {374 case RoleBackground: {
353 QVariant backgroundVariant(componentValue(result, "background"));375 QVariant backgroundVariant(componentValue(result, RoleBackground));
354 if (backgroundVariant.isNull()) {376 if (backgroundVariant.isNull()) {
355 return backgroundVariant;377 return backgroundVariant;
356 }378 }
357 return backgroundUriToVariant(backgroundVariant.toString());379 return backgroundUriToVariant(backgroundVariant.toString());
358 }380 }
359 case RoleOverlayColor:
360 return componentValue(result, "overlay-color");
361 case RoleScopeId:381 case RoleScopeId:
362 if (result->uri().compare(0, 8, "scope://") == 0) {382 if (result->uri().compare(0, 8, "scope://") == 0) {
363 try {383 try {
@@ -368,10 +388,6 @@
368 }388 }
369 }389 }
370 return QVariant();390 return QVariant();
371 case RoleQuickPreviewData:
372 return componentValue(result, "quick-preview-data");
373 case RoleSocialActions:
374 return componentValue(result, "social-actions");
375 default:391 default:
376 return QVariant();392 return QVariant();
377 }393 }
378394
=== modified file 'src/Unity/resultsmodel.h'
--- src/Unity/resultsmodel.h 2016-03-17 16:35:16 +0000
+++ src/Unity/resultsmodel.h 2016-07-22 13:17:47 +0000
@@ -73,10 +73,10 @@
73 bool needsPurging() const;73 bool needsPurging() const;
7474
75private:75private:
76 QVariant componentValue(unity::scopes::Result const* result, std::string const& fieldName) const;76 QVariant componentValue(unity::scopes::Result const* result, Roles field) const;
77 QVariant attributesValue(unity::scopes::Result const* result) const;77 QVariant attributesValue(unity::scopes::Result const* result) const;
7878
79 std::unordered_map<std::string, std::string> m_componentMapping;79 QVector<std::string> m_componentMapping;
80 QList<std::shared_ptr<unity::scopes::Result>> m_results;80 QList<std::shared_ptr<unity::scopes::Result>> m_results;
81 QString m_categoryId;81 QString m_categoryId;
82 int m_maxAttributes;82 int m_maxAttributes;

Subscribers

People subscribed via source and target branches

to all changes: