CRM-15711 - Improve efficiency of deleting a contact
authorColeman Watts <coleman@civicrm.org>
Wed, 10 Dec 2014 22:30:37 +0000 (17:30 -0500)
committerColeman Watts <coleman@civicrm.org>
Thu, 11 Dec 2014 02:41:32 +0000 (21:41 -0500)
CRM/Contact/BAO/Contact.php
CRM/Contact/BAO/GroupContactCache.php

index 0ced7cfa7274d87b718cba03677467ad138c61ca..9bba46e9c282a22e0a5f4473cf51f00d9b9a77b1 100644 (file)
@@ -860,8 +860,13 @@ WHERE     civicrm_contact.id = " . CRM_Utils_Type::escape($id, 'Integer');
     //delete the contact id from recently view
     CRM_Utils_Recent::delContact($id);
 
-    // reset the group contact cache for this group
-    CRM_Contact_BAO_GroupContactCache::remove();
+    // Update the group contact cache
+    if ($restore) {
+      CRM_Contact_BAO_GroupContactCache::remove();
+    }
+    else {
+      CRM_Contact_BAO_GroupContactCache::removeContact($id);
+    }
 
     // delete any dupe cache entry
     CRM_Core_BAO_PrevNextCache::deleteItem($id);
index acda3a755da8734156da24c0611193e78ac998a8..bd0115dc10fcd4013a82122a0107e7559dd5c276 100644 (file)
@@ -384,6 +384,30 @@ WHERE  id = %1
     CRM_Core_DAO::executeQuery($update, $params);
   }
 
+  /**
+   * Removes one or more contacts from the smart group cache
+   * @param int|array $cid
+   * @param int $groupId
+   * @return bool - true if successful
+   */
+  static function removeContact($cid, $groupId = NULL) {
+    $cids = array();
+    // sanitize input
+    foreach ((array) $cid as $c) {
+      $cids[] = CRM_Utils_Type::escape($c, 'Integer');
+    }
+    if ($cids) {
+      $condition = count($cids) == 1 ? "= {$cids[0]}" : "IN (" . implode(',', $cids) . ")";
+      if ($groupId) {
+        $condition .= " AND group_id = " . CRM_Utils_Type::escape($groupId, 'Integer');
+      }
+      $sql = "DELETE FROM civicrm_group_contact_cache WHERE contact_id $condition";
+      CRM_Core_DAO::executeQuery($sql);
+      return TRUE;
+    }
+    return FALSE;
+  }
+
   /**
    * Load the smart group cache for a saved search
    *