(dev/core#217) CRM_Contact_Selector::rebuildPreNextCache - Use PrevNextCache::fillWit...
authorTim Otten <totten@civicrm.org>
Sat, 30 Jun 2018 00:34:07 +0000 (17:34 -0700)
committerTim Otten <totten@civicrm.org>
Tue, 24 Jul 2018 00:40:47 +0000 (17:40 -0700)
CRM/Contact/Selector.php
CRM/Core/PrevNextCache/Interface.php
CRM/Core/PrevNextCache/Sql.php

index f0ee4584a4801d6f1c367d0b5baf9edc03bf12ba..a3c270231cab5a2b6c0a74756776d8e213efd5a9 100644 (file)
@@ -1083,18 +1083,17 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se
     $dao = CRM_Core_DAO::executeQuery($sql);
 
     // build insert query, note that currently we build cache for 500 (self::CACHE_SIZE) contact records at a time, hence below approach
-    $insertValues = array();
+    $rows = [];
     while ($dao->fetch()) {
-      $insertValues[] = "('civicrm_contact', {$dao->contact_id}, {$dao->contact_id}, '{$cacheKey}', '" . CRM_Core_DAO::escapeString($dao->sort_name) . "')";
+      $rows[] = [
+        'entity_table' => 'civicrm_contact',
+        'entity_id1' => $dao->contact_id,
+        'entity_id2' => $dao->contact_id,
+        'data' => $dao->sort_name,
+      ];
     }
 
-    //update pre/next cache using single insert query
-    if (!empty($insertValues)) {
-      $sql = 'INSERT INTO civicrm_prevnext_cache ( entity_table, entity_id1, entity_id2, cacheKey, data ) VALUES
-' . implode(',', $insertValues);
-
-      $result = CRM_Core_DAO::executeQuery($sql);
-    }
+    Civi::service('prevnext')->fillWithArray($cacheKey, $rows);
   }
 
   /**
index 06e725bb72fda0279eb485296ce6bdb6221efcc2..5220ca205c76969491a3b2a061e9d95cce6aa0ca 100644 (file)
@@ -36,6 +36,7 @@ interface CRM_Core_PrevNextCache_Interface {
   /**
    * Store the results of a SQL query in the cache.
    *
+   * @param string $cacheKey
    * @param string $sql
    *   A SQL query. The query *MUST* be a SELECT statement which yields
    *   the following columns (in order): entity_table, entity_id1, entity_id2, cacheKey, data
@@ -43,4 +44,18 @@ interface CRM_Core_PrevNextCache_Interface {
    */
   public function fillWithSql($cacheKey, $sql);
 
+  /**
+   * Store the contents of an array in the cache.
+   *
+   * @param string $cacheKey
+   * @param array $rows
+   *   A list of cache records. Each record should have keys:
+   *    - entity_table
+   *    - entity_id1
+   *    - entity_id2
+   *    - data
+   * @return bool
+   */
+  public function fillWithArray($cacheKey, $rows);
+
 }
index 980af48f82363354a4418d95b8b416f62159f8c6..7882e9ad8355181307890d6b5aed8f30b80819d6 100644 (file)
@@ -52,4 +52,26 @@ INSERT INTO civicrm_prevnext_cache ( entity_table, entity_id1, entity_id2, cache
     return TRUE;
   }
 
+  public function fillWithArray($cacheKey, $rows) {
+    if (empty($rows)) {
+      return;
+    }
+
+    $insert = CRM_Utils_SQL_Insert::into('civicrm_prevnext_cache')
+      ->columns([
+        'entity_table',
+        'entity_id1',
+        'entity_id2',
+        'cacheKey',
+        'data'
+      ]);
+
+    foreach ($rows as &$row) {
+      $insert->row($row + ['cacheKey' => $cacheKey]);
+    }
+
+    CRM_Core_DAO::executeQuery($insert->toSQL());
+    return TRUE;
+  }
+
 }