Move write to table to exportProcessor
authoreileen <emcnaughton@wikimedia.org>
Sat, 20 Jul 2019 02:43:07 +0000 (14:43 +1200)
committereileen <emcnaughton@wikimedia.org>
Tue, 30 Jul 2019 22:38:40 +0000 (10:38 +1200)
CRM/Export/BAO/Export.php
CRM/Export/BAO/ExportProcessor.php

index 58350c2431346e5eb0e6cda8e5b35e7d52ca1010..b7f06d505bcda77850a1fdbaef2ed4e1ab05a46c 100644 (file)
@@ -208,7 +208,7 @@ INSERT INTO {$componentTable} SELECT distinct gc.contact_id FROM civicrm_group_c
       // In order to be able to write a unit test against this function we need to suppress
       // the csv writing. In future hopefully the csv writing & the main processing will be in separate functions.
       if (empty($exportParams['suppress_csv_for_testing'])) {
-        self::writeCSVFromTable($processor);
+        $processor->writeCSVFromTable();
       }
       else {
         // return tableName sqlColumns headerRows in test context
@@ -364,56 +364,6 @@ VALUES $sqlValueString
     CRM_Core_DAO::executeQuery($sql);
   }
 
-  /**
-   * @param \CRM_Export_BAO_ExportProcessor $processor
-   */
-  public static function writeCSVFromTable($processor) {
-    // call export hook
-    $headerRows = $processor->getHeaderRows();
-    $exportTempTable = $processor->getTemporaryTable();
-    CRM_Utils_Hook::export($exportTempTable, $headerRows, $sqlColumns, $exportMode, $componentTable, $ids);
-    if ($exportTempTable !== $processor->getTemporaryTable()) {
-      CRM_Core_Error::deprecatedFunctionWarning('altering the export table in the hook is deprecated (in some flows the table itself will be)');
-      $processor->setTemporaryTable($exportTempTable);
-    }
-    $exportTempTable = $processor->getTemporaryTable();
-    $writeHeader = TRUE;
-    $offset = 0;
-    $limit = self::EXPORT_ROW_COUNT;
-
-    $query = "SELECT * FROM $exportTempTable";
-
-    while (1) {
-      $limitQuery = $query . "
-LIMIT $offset, $limit
-";
-      $dao = CRM_Core_DAO::executeQuery($limitQuery);
-
-      if ($dao->N <= 0) {
-        break;
-      }
-
-      $componentDetails = [];
-      while ($dao->fetch()) {
-        $row = [];
-
-        foreach (array_keys($processor->getSQLColumns()) as $column) {
-          $row[$column] = $dao->$column;
-        }
-        $componentDetails[] = $row;
-      }
-      CRM_Core_Report_Excel::writeCSVFile($processor->getExportFileName(),
-        $headerRows,
-        $componentDetails,
-        NULL,
-        $writeHeader
-      );
-
-      $writeHeader = FALSE;
-      $offset += $limit;
-    }
-  }
-
   /**
    * Get the ids that we want to get related contact details for.
    *
index 5f5a77e653f3a7f6a64f428a302752c61da3e8b1..0f6d1af745b104ccbb6ea13a9cdf48c500767fe4 100644 (file)
@@ -2323,4 +2323,57 @@ WHERE  id IN ( $deleteIDString )
     }
   }
 
+  /**
+   * Write to the csv from the temp table.
+   */
+  public function writeCSVFromTable() {
+    // call export hook
+    $headerRows = $this->getHeaderRows();
+    $exportTempTable = $this->getTemporaryTable();
+    CRM_Utils_Hook::export($exportTempTable, $headerRows, $sqlColumns, $exportMode, $componentTable, $ids);
+    if ($exportTempTable !== $this->getTemporaryTable()) {
+      CRM_Core_Error::deprecatedFunctionWarning('altering the export table in the hook is deprecated (in some flows the table itself will be)');
+      $this->setTemporaryTable($exportTempTable);
+    }
+    $exportTempTable = $this->getTemporaryTable();
+    $writeHeader = TRUE;
+    $offset = 0;
+    // increase this number a lot to avoid making too many queries
+    // LIMIT is not much faster than a no LIMIT query
+    // CRM-7675
+    $limit = 100000;
+
+    $query = "SELECT * FROM $exportTempTable";
+
+    while (1) {
+      $limitQuery = $query . "
+LIMIT $offset, $limit
+";
+      $dao = CRM_Core_DAO::executeQuery($limitQuery);
+
+      if ($dao->N <= 0) {
+        break;
+      }
+
+      $componentDetails = [];
+      while ($dao->fetch()) {
+        $row = [];
+
+        foreach (array_keys($this->getSQLColumns()) as $column) {
+          $row[$column] = $dao->$column;
+        }
+        $componentDetails[] = $row;
+      }
+      CRM_Core_Report_Excel::writeCSVFile($this->getExportFileName(),
+        $headerRows,
+        $componentDetails,
+        NULL,
+        $writeHeader
+      );
+
+      $writeHeader = FALSE;
+      $offset += $limit;
+    }
+  }
+
 }