Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Export cleanup - pass processor object rather than the query object #12485

Merged
merged 2 commits into from
Jul 17, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 22 additions & 30 deletions CRM/Export/BAO/Export.php
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ public static function exportComponents(
$queryOperator = 'AND'
) {

$processor = new CRM_Export_BAO_ExportProcessor($exportMode);
$processor = new CRM_Export_BAO_ExportProcessor($exportMode, $queryOperator);
$returnProperties = array();
$paymentFields = $selectedPaymentFields = FALSE;

Expand Down Expand Up @@ -556,15 +556,7 @@ public static function exportComponents(
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, $returnProperties);

if ($mergeSameHousehold == 1) {
if (empty($returnProperties['id'])) {
Expand Down Expand Up @@ -687,7 +679,7 @@ public static function exportComponents(
// 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) {
Expand Down Expand Up @@ -837,7 +829,7 @@ public static function exportComponents(
// 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);
}
}

Expand Down Expand Up @@ -1065,15 +1057,15 @@ public static function exportCustom($customSearchClass, $formValues, $order) {
}

/**
* @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') {
Expand Down Expand Up @@ -1801,17 +1793,17 @@ public static function componentPaymentFields() {
* @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
* @param string $relationQuery
* @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');
Expand Down Expand Up @@ -1849,22 +1841,22 @@ public static function setHeaderRows($field, $headerRows, $sqlColumns, $query, $

$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
Expand All @@ -1884,7 +1876,7 @@ public static function setHeaderRows($field, $headerRows, $sqlColumns, $query, $
}
$headerName = $field . '-' . $hdr;
$headerRows[] = $headerName;
self::sqlColumnDefn($query, $sqlColumns, $headerName);
self::sqlColumnDefn($processor, $sqlColumns, $headerName);
}
}
}
Expand All @@ -1898,7 +1890,7 @@ public static function setHeaderRows($field, $headerRows, $sqlColumns, $query, $
$headerRows[] = $field;
}

self::sqlColumnDefn($query, $sqlColumns, $field);
self::sqlColumnDefn($processor, $sqlColumns, $field);

return array($headerRows, $sqlColumns);
}
Expand All @@ -1913,7 +1905,7 @@ public static function setHeaderRows($field, $headerRows, $sqlColumns, $query, $
* 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
Expand All @@ -1932,16 +1924,16 @@ public static function setHeaderRows($field, $headerRows, $sqlColumns, $query, $
* - 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) {
Expand All @@ -1965,8 +1957,8 @@ public static function getExportStructureArrays($returnProperties, $query, $rela
// 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');
}
Expand Down
66 changes: 65 additions & 1 deletion CRM/Export/BAO/ExportProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,58 @@ class CRM_Export_BAO_ExportProcessor {
*/
protected $exportMode;

/**
* Array of fields in the main query.
*
* @var array
*/
protected $queryFields = [];

/**
* Either AND or OR.
*
* @var string
*/
protected $queryOperator;

/**
* CRM_Export_BAO_ExportProcessor constructor.
*
* @param int $exportMode
* @param string $queryOperator
*/
public function __construct($exportMode) {
public function __construct($exportMode, $queryOperator) {
$this->setExportMode($exportMode);
$this->setQueryMode();
$this->setQueryOperator($queryOperator);
}

/**
* @return string
*/
public function getQueryOperator() {
return $this->queryOperator;
}

/**
* @param string $queryOperator
*/
public function setQueryOperator($queryOperator) {
$this->queryOperator = $queryOperator;
}

/**
* @return array
*/
public function getQueryFields() {
return $this->queryFields;
}

/**
* @param array $queryFields
*/
public function setQueryFields($queryFields) {
$this->queryFields = $queryFields;
}

/**
Expand Down Expand Up @@ -118,4 +162,24 @@ public function setExportMode($exportMode) {
$this->exportMode = $exportMode;
}

/**
* @param $params
* @param $order
* @param $returnProperties
* @return array
*/
public function runQuery($params, $order, $returnProperties) {
$query = new CRM_Contact_BAO_Query($params, $returnProperties, NULL,
FALSE, FALSE, $this->getQueryMode(),
FALSE, TRUE, TRUE, NULL, $this->getQueryOperator()
);

//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);
}

}
10 changes: 6 additions & 4 deletions tests/phpunit/CRM/Export/BAO/ExportTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public function tearDown() {
* Basic test to ensure the exportComponents function completes without error.
*/
public function testExportComponentsNull() {
list($tableName, $sqlColumns) = CRM_Export_BAO_Export::exportComponents(
list($tableName) = CRM_Export_BAO_Export::exportComponents(
TRUE,
array(),
array(),
Expand Down Expand Up @@ -192,8 +192,10 @@ public function testGetExportStructureArrays() {
$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, 'AND');
$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, '');
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');
Expand Down Expand Up @@ -500,7 +502,7 @@ public function testExportDeceasedDoNotMail() {
));

//create address for contact A
$result = $this->callAPISuccess('address', 'create', array(
$this->callAPISuccess('address', 'create', array(
'contact_id' => $contactA['id'],
'location_type_id' => 'Home',
'street_address' => 'ABC 12',
Expand All @@ -511,7 +513,7 @@ public function testExportDeceasedDoNotMail() {
));

//create address for contact B
$result = $this->callAPISuccess('address', 'create', array(
$this->callAPISuccess('address', 'create', array(
'contact_id' => $contactB['id'],
'location_type_id' => 'Home',
'street_address' => 'ABC 12',
Expand Down