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