Rex Dieter adf30af
From 55dc6d141a20e2438308214ab60c18e282dd7b43 Mon Sep 17 00:00:00 2001
Rex Dieter adf30af
From: =?UTF-8?q?Dan=20Vr=C3=A1til?= <dvratil@redhat.com>
Rex Dieter adf30af
Date: Mon, 8 Dec 2014 10:33:51 +0100
Rex Dieter adf30af
Subject: [PATCH 25/30] Avoid repeated calls to PimItem::flags() and
Rex Dieter adf30af
 PimItem::tags()
Rex Dieter adf30af
Rex Dieter adf30af
The queries results are not cached, so each call to those methods runs an SQL
Rex Dieter adf30af
query. At least in case of flags, this reduced the number of queries to one
Rex Dieter adf30af
query per changed item.
Rex Dieter adf30af
---
Rex Dieter adf30af
 server/src/storage/datastore.cpp | 10 ++++++----
Rex Dieter adf30af
 1 file changed, 6 insertions(+), 4 deletions(-)
Rex Dieter adf30af
Rex Dieter adf30af
diff --git a/server/src/storage/datastore.cpp b/server/src/storage/datastore.cpp
Rex Dieter adf30af
index c9fa0c3..035395e 100644
Rex Dieter adf30af
--- a/server/src/storage/datastore.cpp
Rex Dieter adf30af
+++ b/server/src/storage/datastore.cpp
Rex Dieter adf30af
@@ -220,7 +220,8 @@ bool DataStore::setItemsFlags( const PimItem::List &items, const QVector<Flag> &
Rex Dieter adf30af
   setBoolPtr( flagsChanged, false );
Rex Dieter adf30af
 
Rex Dieter adf30af
   Q_FOREACH ( const PimItem &item, items ) {
Rex Dieter adf30af
-    Q_FOREACH ( const Flag &flag, item.flags() ) {
Rex Dieter adf30af
+    const Flag::List itemFlags = item.flags();
Rex Dieter adf30af
+    Q_FOREACH ( const Flag &flag, itemFlags ) {
Rex Dieter adf30af
       if ( !flags.contains( flag ) ) {
Rex Dieter adf30af
         removedFlags << flag.name().toLatin1();
Rex Dieter adf30af
         Query::Condition cond;
Rex Dieter adf30af
@@ -231,7 +232,7 @@ bool DataStore::setItemsFlags( const PimItem::List &items, const QVector<Flag> &
Rex Dieter adf30af
     }
Rex Dieter adf30af
 
Rex Dieter adf30af
     Q_FOREACH ( const Flag &flag, flags ) {
Rex Dieter adf30af
-      if ( !item.flags().contains( flag ) ) {
Rex Dieter adf30af
+      if ( !itemFlags.contains( flag ) ) {
Rex Dieter adf30af
         addedFlags << flag.name().toLatin1();
Rex Dieter adf30af
         insIds << item.id();
Rex Dieter adf30af
         insFlags << flag.id();
Rex Dieter adf30af
@@ -414,7 +415,8 @@ bool DataStore::setItemsTags( const PimItem::List &items, const Tag::List &tags,
Rex Dieter adf30af
   setBoolPtr( tagsChanged, false );
Rex Dieter adf30af
 
Rex Dieter adf30af
   Q_FOREACH ( const PimItem &item, items ) {
Rex Dieter adf30af
-    Q_FOREACH ( const Tag &tag, item.tags() ) {
Rex Dieter adf30af
+    const Tag::List itemTags = item.tags();
Rex Dieter adf30af
+    Q_FOREACH ( const Tag &tag, itemTags ) {
Rex Dieter adf30af
       if ( !tags.contains( tag ) ) {
Rex Dieter adf30af
         // Remove tags from items that had it set
Rex Dieter adf30af
         removedTags << tag.id();
Rex Dieter adf30af
@@ -426,7 +428,7 @@ bool DataStore::setItemsTags( const PimItem::List &items, const Tag::List &tags,
Rex Dieter adf30af
     }
Rex Dieter adf30af
 
Rex Dieter adf30af
     Q_FOREACH ( const Tag &tag, tags ) {
Rex Dieter adf30af
-      if ( !item.tags().contains( tag ) ) {
Rex Dieter adf30af
+      if ( !itemTags.contains( tag ) ) {
Rex Dieter adf30af
         // Add tags to items that did not have the tag
Rex Dieter adf30af
         addedTags << tag.id();
Rex Dieter adf30af
         insIds << item.id();
Rex Dieter adf30af
-- 
Rex Dieter adf30af
2.1.0
Rex Dieter adf30af