From 0a01dff9b89d2661c2a567ebc57f9eb87d7b338c Mon Sep 17 00:00:00 2001 From: eileen Date: Mon, 30 Jan 2017 20:53:50 +1300 Subject: [PATCH] Extract report functions for readability & overidabiity --- CRM/Report/Form.php | 118 ++++++++++++++++++++++++++++---------------- 1 file changed, 76 insertions(+), 42 deletions(-) diff --git a/CRM/Report/Form.php b/CRM/Report/Form.php index d4e4740ea7..2c4b691892 100644 --- a/CRM/Report/Form.php +++ b/CRM/Report/Form.php @@ -2316,50 +2316,10 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND // include statistics columns only if set if (!empty($field['statistics'])) { - foreach ($field['statistics'] as $stat => $label) { - $alias = "{$tableName}_{$fieldName}_{$stat}"; - switch (strtolower($stat)) { - case 'max': - case 'sum': - $select[] = "$stat({$field['dbAlias']}) as $alias"; - $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label; - $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = $field['type']; - $this->_statFields[$label] = $alias; - $this->_selectAliases[] = $alias; - break; - - case 'count': - $select[] = "COUNT({$field['dbAlias']}) as $alias"; - $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label; - $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = CRM_Utils_Type::T_INT; - $this->_statFields[$label] = $alias; - $this->_selectAliases[] = $alias; - break; - - case 'count_distinct': - $select[] = "COUNT(DISTINCT {$field['dbAlias']}) as $alias"; - $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label; - $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = CRM_Utils_Type::T_INT; - $this->_statFields[$label] = $alias; - $this->_selectAliases[] = $alias; - break; - - case 'avg': - $select[] = "ROUND(AVG({$field['dbAlias']}),2) as $alias"; - $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label; - $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = $field['type']; - $this->_statFields[$label] = $alias; - $this->_selectAliases[] = $alias; - break; - } - } + $select = $this->addStatisticsToSelect($field, $tableName, $fieldName, $select); } else { - $alias = "{$tableName}_{$fieldName}"; - $select[] = "{$field['dbAlias']} as $alias"; - $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field); - $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field); - $this->_selectAliases[] = $alias; + $select = $this->addBasicFieldToSelect($tableName, $fieldName, $field, $select); } } } @@ -4914,4 +4874,78 @@ LEFT JOIN civicrm_contact {$field['alias']} ON {$field['alias']}.id = {$this->_a return implode(', ', array_filter($labels)); } + /* + * Add statistics columns. + * + * If a group by is in play then add columns for the statistics fields. + * + * This would lead to a new field in the $row such as $fieldName_sum and a new, matching + * column header field. + * + * @param array $field + * @param string $tableName + * @param string $fieldName + * @param array $select + * + * @return array + */ + protected function addStatisticsToSelect($field, $tableName, $fieldName, $select) { + foreach ($field['statistics'] as $stat => $label) { + $alias = "{$tableName}_{$fieldName}_{$stat}"; + switch (strtolower($stat)) { + case 'max': + case 'sum': + $select[] = "$stat({$field['dbAlias']}) as $alias"; + $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label; + $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = $field['type']; + $this->_statFields[$label] = $alias; + $this->_selectAliases[] = $alias; + break; + + case 'count': + $select[] = "COUNT({$field['dbAlias']}) as $alias"; + $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label; + $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = CRM_Utils_Type::T_INT; + $this->_statFields[$label] = $alias; + $this->_selectAliases[] = $alias; + break; + + case 'count_distinct': + $select[] = "COUNT(DISTINCT {$field['dbAlias']}) as $alias"; + $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label; + $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = CRM_Utils_Type::T_INT; + $this->_statFields[$label] = $alias; + $this->_selectAliases[] = $alias; + break; + + case 'avg': + $select[] = "ROUND(AVG({$field['dbAlias']}),2) as $alias"; + $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label; + $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = $field['type']; + $this->_statFields[$label] = $alias; + $this->_selectAliases[] = $alias; + break; + } + } + return $select; + } + + /** + * Add a basic field to the select clause. + * + * @param string $tableName + * @param string $fieldName + * @param array $field + * @param string $select + * @return array + */ + protected function addBasicFieldToSelect($tableName, $fieldName, $field, $select) { + $alias = "{$tableName}_{$fieldName}"; + $select[] = "{$field['dbAlias']} as $alias"; + $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field); + $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field); + $this->_selectAliases[] = $alias; + return $select; + } + } -- 2.25.1