From adabfa4065d9c128ae809d324858d7040c8de3aa Mon Sep 17 00:00:00 2001 From: eileen Date: Mon, 16 Jul 2018 15:29:42 +1200 Subject: [PATCH] Start passing around processor instead of query object --- CRM/Export/BAO/Export.php | 50 +++++++++------------ CRM/Export/BAO/ExportProcessor.php | 42 +++++++++++++++++ tests/phpunit/CRM/Export/BAO/ExportTest.php | 4 +- 3 files changed, 66 insertions(+), 30 deletions(-) diff --git a/CRM/Export/BAO/Export.php b/CRM/Export/BAO/Export.php index 4fb071ff20..06dbd629a6 100644 --- a/CRM/Export/BAO/Export.php +++ b/CRM/Export/BAO/Export.php @@ -556,15 +556,7 @@ INSERT INTO {$componentTable} SELECT distinct gc.contact_id FROM civicrm_group_c CRM_Contact_BAO_ProximityQuery::fixInputParams($params); } - $query = new CRM_Contact_BAO_Query($params, $returnProperties, NULL, - FALSE, FALSE, $queryMode, - FALSE, TRUE, TRUE, NULL, $queryOperator - ); - - //sort by state - //CRM-15301 - $query->_sort = $order; - list($select, $from, $where, $having) = $query->query(); + list($query, $select, $from, $where, $having) = $processor->runQuery($params, $order, $queryOperator, $returnProperties); if ($mergeSameHousehold == 1) { if (empty($returnProperties['id'])) { @@ -687,7 +679,7 @@ INSERT INTO {$componentTable} SELECT distinct gc.contact_id FROM civicrm_group_c // for CRM-3157 purposes $i18n = CRM_Core_I18n::singleton(); - list($outputColumns, $headerRows, $sqlColumns, $metadata) = self::getExportStructureArrays($returnProperties, $query, $relationQuery, $selectedPaymentFields); + list($outputColumns, $headerRows, $sqlColumns, $metadata) = self::getExportStructureArrays($returnProperties, $processor, $relationQuery, $selectedPaymentFields); $limitReached = FALSE; while (!$limitReached) { @@ -837,7 +829,7 @@ INSERT INTO {$componentTable} SELECT distinct gc.contact_id FROM civicrm_group_c // where other header definitions take place. $headerRows = array_merge($headerRows, $paymentHeaders); foreach (array_keys($paymentHeaders) as $paymentHdr) { - self::sqlColumnDefn($query, $sqlColumns, $paymentHdr); + self::sqlColumnDefn($processor, $sqlColumns, $paymentHdr); } } @@ -1065,15 +1057,15 @@ INSERT INTO {$componentTable} SELECT distinct gc.contact_id FROM civicrm_group_c } /** - * @param $query + * @param \CRM_Export_BAO_ExportProcessor $processor * @param $sqlColumns * @param $field */ - public static function sqlColumnDefn($query, &$sqlColumns, $field) { + public static function sqlColumnDefn($processor, &$sqlColumns, $field) { if (substr($field, -4) == '_a_b' || substr($field, -4) == '_b_a') { return; } - $queryFields = $query->_fields; + $queryFields = $processor->getQueryFields(); $fieldName = CRM_Utils_String::munge(strtolower($field), '_', 64); if ($fieldName == 'id') { @@ -1801,7 +1793,7 @@ WHERE {$whereClause}"; * @param array $headerRows * @param array $sqlColumns * Columns to go in the temp table. - * @param CRM_Contact_BAO_Query $query + * @param \CRM_Export_BAO_ExportProcessor $processor * @param array|string $value * @param array $phoneTypes * @param array $imProviders @@ -1809,9 +1801,9 @@ WHERE {$whereClause}"; * @param array $selectedPaymentFields * @return array */ - public static function setHeaderRows($field, $headerRows, $sqlColumns, $query, $value, $phoneTypes, $imProviders, $relationQuery, $selectedPaymentFields) { + public static function setHeaderRows($field, $headerRows, $sqlColumns, $processor, $value, $phoneTypes, $imProviders, $relationQuery, $selectedPaymentFields) { - $queryFields = $query->_fields; + $queryFields = $processor->getQueryFields(); // Split campaign into 2 fields for id and title if (substr($field, -14) == 'campaign_title') { $headerRows[] = ts('Campaign Title'); @@ -1849,22 +1841,22 @@ WHERE {$whereClause}"; $headerRows[] = $headerName; - self::sqlColumnDefn($query, $sqlColumns, $headerName); + self::sqlColumnDefn($processor, $sqlColumns, $headerName); } elseif ($relationField == 'phone_type_id') { $headerName = $field . '-' . 'Phone Type'; $headerRows[] = $headerName; - self::sqlColumnDefn($query, $sqlColumns, $headerName); + self::sqlColumnDefn($processor, $sqlColumns, $headerName); } elseif ($relationField == 'provider_id') { $headerName = $field . '-' . 'Im Service Provider'; $headerRows[] = $headerName; - self::sqlColumnDefn($query, $sqlColumns, $headerName); + self::sqlColumnDefn($processor, $sqlColumns, $headerName); } elseif ($relationField == 'state_province_id') { $headerName = $field . '-' . 'state_province_id'; $headerRows[] = $headerName; - self::sqlColumnDefn($query, $sqlColumns, $headerName); + self::sqlColumnDefn($processor, $sqlColumns, $headerName); } elseif (is_array($relationValue) && $relationField == 'location') { // fix header for location type case @@ -1884,7 +1876,7 @@ WHERE {$whereClause}"; } $headerName = $field . '-' . $hdr; $headerRows[] = $headerName; - self::sqlColumnDefn($query, $sqlColumns, $headerName); + self::sqlColumnDefn($processor, $sqlColumns, $headerName); } } } @@ -1898,7 +1890,7 @@ WHERE {$whereClause}"; $headerRows[] = $field; } - self::sqlColumnDefn($query, $sqlColumns, $field); + self::sqlColumnDefn($processor, $sqlColumns, $field); return array($headerRows, $sqlColumns); } @@ -1913,7 +1905,7 @@ WHERE {$whereClause}"; * as a step on the refactoring path rather than how it should be. * * @param array $returnProperties - * @param CRM_Contact_BAO_Contact $query + * @param \CRM_Export_BAO_ExportProcessor $processor * @param string $relationQuery * @param array $selectedPaymentFields * @return array @@ -1932,16 +1924,16 @@ WHERE {$whereClause}"; * - b) this code is old & outdated. Submit your answers to circular bin or better * yet find a way to comment them for posterity. */ - public static function getExportStructureArrays($returnProperties, $query, $relationQuery, $selectedPaymentFields) { + public static function getExportStructureArrays($returnProperties, $processor, $relationQuery, $selectedPaymentFields) { $metadata = $headerRows = $outputColumns = $sqlColumns = array(); $phoneTypes = CRM_Core_PseudoConstant::get('CRM_Core_DAO_Phone', 'phone_type_id'); $imProviders = CRM_Core_PseudoConstant::get('CRM_Core_DAO_IM', 'provider_id'); - $queryFields = $query->_fields; + $queryFields = $processor->getQueryFields(); foreach ($returnProperties as $key => $value) { if ($key != 'location' || !is_array($value)) { $outputColumns[$key] = $value; - list($headerRows, $sqlColumns) = self::setHeaderRows($key, $headerRows, $sqlColumns, $query, $value, $phoneTypes, $imProviders, $relationQuery, $selectedPaymentFields); + list($headerRows, $sqlColumns) = self::setHeaderRows($key, $headerRows, $sqlColumns, $processor, $value, $phoneTypes, $imProviders, $relationQuery, $selectedPaymentFields); } else { foreach ($value as $locationType => $locationFields) { @@ -1965,8 +1957,8 @@ WHERE {$whereClause}"; // Warning: shame inducing hack. $metadata[$daoFieldName]['pseudoconstant']['var'] = 'imProviders'; } - self::sqlColumnDefn($query, $sqlColumns, $outputFieldName); - list($headerRows, $sqlColumns) = self::setHeaderRows($outputFieldName, $headerRows, $sqlColumns, $query, $value, $phoneTypes, $imProviders, $relationQuery, $selectedPaymentFields); + self::sqlColumnDefn($processor, $sqlColumns, $outputFieldName); + list($headerRows, $sqlColumns) = self::setHeaderRows($outputFieldName, $headerRows, $sqlColumns, $processor, $value, $phoneTypes, $imProviders, $relationQuery, $selectedPaymentFields); if ($actualDBFieldName == 'country' || $actualDBFieldName == 'world_region') { $metadata[$daoFieldName] = array('context' => 'country'); } diff --git a/CRM/Export/BAO/ExportProcessor.php b/CRM/Export/BAO/ExportProcessor.php index 985eba5121..807c231628 100644 --- a/CRM/Export/BAO/ExportProcessor.php +++ b/CRM/Export/BAO/ExportProcessor.php @@ -48,6 +48,27 @@ class CRM_Export_BAO_ExportProcessor { */ protected $exportMode; + /** + * Array of fields in the main query. + * + * @var array + */ + protected $queryFields = []; + + /** + * @return array + */ + public function getQueryFields() { + return $this->queryFields; + } + + /** + * @param array $queryFields + */ + public function setQueryFields($queryFields) { + $this->queryFields = $queryFields; + } + /** * CRM_Export_BAO_ExportProcessor constructor. * @@ -118,4 +139,25 @@ class CRM_Export_BAO_ExportProcessor { $this->exportMode = $exportMode; } + /** + * @param $params + * @param $order + * @param $queryOperator + * @param $returnProperties + * @return array + */ + public function runQuery($params, $order, $queryOperator, $returnProperties) { + $query = new CRM_Contact_BAO_Query($params, $returnProperties, NULL, + FALSE, FALSE, $this->getQueryMode(), + FALSE, TRUE, TRUE, NULL, $queryOperator + ); + + //sort by state + //CRM-15301 + $query->_sort = $order; + list($select, $from, $where, $having) = $query->query(); + $this->setQueryFields($query->_fields); + return array($query, $select, $from, $where, $having); + } + } diff --git a/tests/phpunit/CRM/Export/BAO/ExportTest.php b/tests/phpunit/CRM/Export/BAO/ExportTest.php index 175bbd4693..1eae9a092d 100644 --- a/tests/phpunit/CRM/Export/BAO/ExportTest.php +++ b/tests/phpunit/CRM/Export/BAO/ExportTest.php @@ -192,8 +192,10 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase { $pattern = '/as `?([^`,]*)/'; $queryFieldAliases = array(); preg_match_all($pattern, $select, $queryFieldAliases, PREG_PATTERN_ORDER); + $processor = new CRM_Export_BAO_ExportProcessor(CRM_Contact_BAO_Query::MODE_CONTRIBUTE); + $processor->setQueryFields($query->_fields); - list($outputFields) = CRM_Export_BAO_Export::getExportStructureArrays($returnProperties, $query, $contactRelationshipTypes, '', array()); + list($outputFields) = CRM_Export_BAO_Export::getExportStructureArrays($returnProperties, $processor, $contactRelationshipTypes, '', array()); foreach (array_keys($outputFields) as $fieldAlias) { if ($fieldAlias == 'Home-country') { $this->assertTrue(in_array($fieldAlias . '_id', $queryFieldAliases[1]), 'Country is subject to some funky translate so we make sure country id is present'); -- 2.25.1