From 3b2bbbfbc5bc6d22c333a19324b4bce43a59c89a Mon Sep 17 00:00:00 2001 From: eileen Date: Thu, 29 Mar 2018 21:48:39 +1300 Subject: [PATCH] CRM-21677 reduce unnecessary joins in reports --- CRM/Report/Form/Contribute/Detail.php | 23 +++++++------ CRM/Report/Form/Contribute/History.php | 31 +++-------------- .../Form/Contribute/HouseholdSummary.php | 33 ++----------------- .../Form/Contribute/OrganizationSummary.php | 25 ++------------ CRM/Report/Form/Contribute/Recur.php | 11 ++----- 5 files changed, 24 insertions(+), 99 deletions(-) diff --git a/CRM/Report/Form/Contribute/Detail.php b/CRM/Report/Form/Contribute/Detail.php index 84b1ce6b3e0..7068fb7468a 100644 --- a/CRM/Report/Form/Contribute/Detail.php +++ b/CRM/Report/Form/Contribute/Detail.php @@ -31,9 +31,6 @@ * @copyright CiviCRM LLC (c) 2004-2018 */ class CRM_Report_Form_Contribute_Detail extends CRM_Report_Form { - protected $_addressField = FALSE; - - protected $_emailField = FALSE; protected $_summary = NULL; @@ -413,6 +410,7 @@ public function statistics(&$rows) { $group = "\nGROUP BY {$this->_aliases['civicrm_contribution']}.currency"; $sql = "{$select} {$this->_from} {$this->_where} {$group}"; $dao = CRM_Core_DAO::executeQuery($sql); + $this->addToDeveloperTab($sql); while ($dao->fetch()) { $totalAmount[] = CRM_Utils_Money::format($dao->amount, $dao->currency) . " (" . $dao->count . ")"; @@ -463,6 +461,7 @@ public function statistics(&$rows) { {$this->_softFrom} GROUP BY {$this->_aliases['civicrm_contribution']}.currency"; $dao = CRM_Core_DAO::executeQuery($sql); + $this->addToDeveloperTab($sql); while ($dao->fetch()) { $totalAmount[] = CRM_Utils_Money::format($dao->amount, $dao->currency) . " (" . $dao->count . ")"; @@ -526,6 +525,7 @@ public function postProcess() { // 1. use main contribution query to build temp table 1 $sql = $this->buildQuery(); $tempQuery = "CREATE TEMPORARY TABLE civireport_contribution_detail_temp1 {$this->_databaseAttributes} AS {$sql}"; + $this->addToDeveloperTab($tempQuery); CRM_Core_DAO::executeQuery($tempQuery); $this->setPager(); @@ -544,6 +544,7 @@ public function postProcess() { // we inner join with temp1 to restrict soft contributions to those in temp1 table $sql = "{$select} {$this->_from} {$this->_where} {$this->_groupBy}"; $tempQuery = "CREATE TEMPORARY TABLE civireport_contribution_detail_temp2 {$this->_databaseAttributes} AS {$sql}"; + $this->addToDeveloperTab($tempQuery); CRM_Core_DAO::executeQuery($tempQuery); if (CRM_Utils_Array::value('contribution_or_soft_value', $this->_params) == 'soft_credits_only' @@ -582,6 +583,7 @@ public function postProcess() { // 4. build temp table 3 $sql = "CREATE TEMPORARY TABLE civireport_contribution_detail_temp3 {$this->_databaseAttributes} AS {$tempQuery}"; + $this->addToDeveloperTab($sql); CRM_Core_DAO::executeQuery($sql); // 5. Re-construct order-by to make sense for final query on temp3 table @@ -753,6 +755,7 @@ public function alterDisplay(&$rows) { SELECT civicrm_contact_id, civicrm_contact_sort_name, civicrm_contribution_total_amount_sum, civicrm_contribution_currency FROM civireport_contribution_detail_temp2 WHERE civicrm_contribution_contribution_id={$row['civicrm_contribution_contribution_id']}"; + $this->addToDeveloperTab($query); $dao = CRM_Core_DAO::executeQuery($query); $string = ''; $separator = ($this->_outputMode !== 'csv') ? "
" : ' '; @@ -775,6 +778,7 @@ public function alterDisplay(&$rows) { SELECT civicrm_contact_id, civicrm_contact_sort_name FROM civireport_contribution_detail_temp1 WHERE civicrm_contribution_contribution_id={$row['civicrm_contribution_contribution_id']}"; + $this->addToDeveloperTab($query); $dao = CRM_Core_DAO::executeQuery($query); $string = ''; while ($dao->fetch()) { @@ -854,6 +858,7 @@ public function sectionTotals() { // initialize array of total counts $sumcontribs = $totals = array(); $dao = CRM_Core_DAO::executeQuery($query); + $this->addToDeveloperTab($query); while ($dao->fetch()) { // let $this->_alterDisplay translate any integer ids to human-readable values. @@ -941,16 +946,10 @@ public function appendAdditionalFromJoins() { INNER JOIN (SELECT c.id, IF(COUNT(oc.id) = 0, 0, 1) AS ordinality FROM civicrm_contribution c LEFT JOIN civicrm_contribution oc ON c.contact_id = oc.contact_id AND oc.receive_date < c.receive_date GROUP BY c.id) {$this->_aliases['civicrm_contribution_ordinality']} ON {$this->_aliases['civicrm_contribution_ordinality']}.id = {$this->_aliases['civicrm_contribution']}.id"; } - $this->addPhoneFromClause(); - - $this->addAddressFromClause(); + $this->joinPhoneFromContact(); + $this->joinAddressFromContact(); + $this->joinEmailFromContact(); - if ($this->_emailField) { - $this->_from .= " - LEFT JOIN civicrm_email {$this->_aliases['civicrm_email']} - ON {$this->_aliases['civicrm_contact']}.id = {$this->_aliases['civicrm_email']}.contact_id AND - {$this->_aliases['civicrm_email']}.is_primary = 1\n"; - } // include contribution note if (!empty($this->_params['fields']['contribution_note']) || !empty($this->_params['note_value']) diff --git a/CRM/Report/Form/Contribute/History.php b/CRM/Report/Form/Contribute/History.php index f9fbf895d37..9764c84bd01 100644 --- a/CRM/Report/Form/Contribute/History.php +++ b/CRM/Report/Form/Contribute/History.php @@ -29,15 +29,10 @@ * * @package CRM * @copyright CiviCRM LLC (c) 2004-2018 - * $Id$ - * */ class CRM_Report_Form_Contribute_History extends CRM_Report_Form { // Primary Contacts count limitCONSTROW_COUNT_LIMIT = 10; - protected $_addressField = FALSE; - protected $_emailField = FALSE; - protected $_phoneField = FALSE; protected $_relationshipColumns = array(); protected $_customGroupExtends = array( @@ -327,6 +322,7 @@ public function preProcess() { public function select() { $select = array(); + // @todo remove this & use parent (with maybe some override in this or better yet selectWhere fn) $this->_columnHeaders = array(); foreach ($this->_columns as $tableName => $table) { @@ -336,15 +332,6 @@ public function select() { if (!empty($field['required']) || !empty($this->_params['fields'][$fieldName]) ) { - if ($tableName == 'civicrm_address') { - $this->_addressField = TRUE; - } - if ($tableName == 'civicrm_email') { - $this->_emailField = TRUE; - } - if ($tableName == 'civicrm_phone') { - $this->_phoneField = TRUE; - } if ($tableName == 'civicrm_relationship') { $this->_relationshipColumns["{$tableName}_{$fieldName}"] = "{$field['dbAlias']} as {$tableName}_{$fieldName}"; $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field); @@ -398,23 +385,13 @@ public function from() { ON {$this->_aliases['civicrm_contact']}.id = {$this->_aliases['civicrm_contribution']}.contact_id AND {$this->_aliases['civicrm_contribution']}.is_test = 0 "; - if ($this->_emailField) { - $this->_from .= " LEFT JOIN civicrm_email {$this->_aliases['civicrm_email']} - ON ({$this->_aliases['civicrm_contact']}.id = {$this->_aliases['civicrm_email']}.contact_id AND - {$this->_aliases['civicrm_email']}.is_primary = 1) "; - } - - if ($this->_phoneField) { - $this->_from .= " LEFT JOIN civicrm_phone {$this->_aliases['civicrm_phone']} - ON ({$this->_aliases['civicrm_contact']}.id = {$this->_aliases['civicrm_phone']}.contact_id AND - {$this->_aliases['civicrm_phone']}.is_primary = 1) "; - } - $relContacAlias = 'contact_relationship'; $this->_relationshipFrom = " INNER JOIN civicrm_relationship {$this->_aliases['civicrm_relationship']} ON (({$this->_aliases['civicrm_relationship']}.contact_id_a = {$relContacAlias}.id OR {$this->_aliases['civicrm_relationship']}.contact_id_b = {$relContacAlias}.id ) AND {$this->_aliases['civicrm_relationship']}.is_active = 1) "; - $this->addAddressFromClause(); + $this->joinAddressFromContact(); + $this->joinPhoneFromContact(); + $this->joinEmailFromContact(); // for credit card type $this->addFinancialTrxnFromClause(); diff --git a/CRM/Report/Form/Contribute/HouseholdSummary.php b/CRM/Report/Form/Contribute/HouseholdSummary.php index b6f8afac55d..cb0225bf5d9 100644 --- a/CRM/Report/Form/Contribute/HouseholdSummary.php +++ b/CRM/Report/Form/Contribute/HouseholdSummary.php @@ -29,15 +29,9 @@ * * @package CRM * @copyright CiviCRM LLC (c) 2004-2018 - * $Id$ - * */ class CRM_Report_Form_Contribute_HouseholdSummary extends CRM_Report_Form { - protected $_addressField = FALSE; - - protected $_emailField = FALSE; - public $_drilldownReport = array('contribute/detail' => 'Link to Detail Report'); protected $_summary = NULL; @@ -232,11 +226,8 @@ public function __construct() { parent::__construct(); } - public function preProcess() { - parent::preProcess(); - } - public function select() { + // @todo remove this & use parent select. $this->_columnHeaders = $select = array(); foreach ($this->_columns as $tableName => $table) { if (array_key_exists('fields', $table)) { @@ -244,12 +235,6 @@ public function select() { if (!empty($field['required']) || !empty($this->_params['fields'][$fieldName]) ) { - if ($tableName == 'civicrm_address') { - $this->_addressField = TRUE; - } - elseif ($tableName == 'civicrm_email') { - $this->_emailField = TRUE; - } if (!empty($field['statistics'])) { foreach ($field['statistics'] as $stat => $label) { @@ -274,8 +259,6 @@ public function select() { } public function from() { - - $this->_from = NULL; $this->_from = " FROM civicrm_relationship {$this->_aliases['civicrm_relationship']} LEFT JOIN civicrm_contact {$this->_aliases['civicrm_contact_household']} ON @@ -286,18 +269,8 @@ public function from() { INNER JOIN civicrm_contribution {$this->_aliases['civicrm_contribution']} ON ({$this->_aliases['civicrm_contribution']}.contact_id = {$this->_aliases['civicrm_relationship']}.$this->otherContact ) AND {$this->_aliases['civicrm_contribution']}.is_test = 0 "; - if ($this->_addressField) { - $this->_from .= " - LEFT JOIN civicrm_address {$this->_aliases['civicrm_address']} ON - {$this->_aliases['civicrm_contact']}.id = {$this->_aliases['civicrm_address']}.contact_id AND - {$this->_aliases['civicrm_address']}.is_primary = 1\n "; - } - if ($this->_emailField) { - $this->_from .= " - LEFT JOIN civicrm_email {$this->_aliases['civicrm_email']} ON - {$this->_aliases['civicrm_contact']}.id = {$this->_aliases['civicrm_email']}.contact_id AND - {$this->_aliases['civicrm_email']}.is_primary = 1\n "; - } + $this->joinAddressFromContact(); + $this->joinEmailFromContact(); // for credit card type $this->addFinancialTrxnFromClause(); diff --git a/CRM/Report/Form/Contribute/OrganizationSummary.php b/CRM/Report/Form/Contribute/OrganizationSummary.php index a44d5e63df9..e3565a80cb5 100644 --- a/CRM/Report/Form/Contribute/OrganizationSummary.php +++ b/CRM/Report/Form/Contribute/OrganizationSummary.php @@ -32,10 +32,6 @@ */ class CRM_Report_Form_Contribute_OrganizationSummary extends CRM_Report_Form { - protected $_addressField = FALSE; - - protected $_emailField = FALSE; - public $_drilldownReport = array('contribute/detail' => 'Link to Detail Report'); protected $_summary = NULL; @@ -238,17 +234,12 @@ public function preProcess() { } public function select() { + // @todo remove this in favour of using parent function $this->_columnHeaders = $select = array(); foreach ($this->_columns as $tableName => $table) { if (array_key_exists('fields', $table)) { foreach ($table['fields'] as $fieldName => $field) { if (!empty($field['required']) || !empty($this->_params['fields'][$fieldName])) { - if ($tableName == 'civicrm_address') { - $this->_addressField = TRUE; - } - elseif ($tableName == 'civicrm_email') { - $this->_emailField = TRUE; - } if (!empty($field['statistics'])) { foreach ($field['statistics'] as $stat => $label) { @@ -285,18 +276,8 @@ public function from() { INNER JOIN civicrm_contribution {$this->_aliases['civicrm_contribution']} ON ({$this->_aliases['civicrm_contribution']}.contact_id = {$this->_aliases['civicrm_relationship']}.$this->otherContact ) AND {$this->_aliases['civicrm_contribution']}.is_test = 0 "; - if ($this->_addressField) { - $this->_from .= " - LEFT JOIN civicrm_address {$this->_aliases['civicrm_address']} ON - {$this->_aliases['civicrm_contact']}.id = {$this->_aliases['civicrm_address']}.contact_id AND - {$this->_aliases['civicrm_address']}.is_primary = 1\n "; - } - if ($this->_emailField) { - $this->_from .= " - LEFT JOIN civicrm_email {$this->_aliases['civicrm_email']} ON - {$this->_aliases['civicrm_contact']}.id = {$this->_aliases['civicrm_email']}.contact_id AND - {$this->_aliases['civicrm_email']}.is_primary = 1\n "; - } + $this->joinAddressFromContact(); + $this->joinEmailFromContact(); // for credit card type $this->addFinancialTrxnFromClause(); diff --git a/CRM/Report/Form/Contribute/Recur.php b/CRM/Report/Form/Contribute/Recur.php index d2cf531ef61..fd44c88bb87 100644 --- a/CRM/Report/Form/Contribute/Recur.php +++ b/CRM/Report/Form/Contribute/Recur.php @@ -273,14 +273,9 @@ public function from() { $this->_from .= " LEFT JOIN civicrm_contribution {$this->_aliases['civicrm_contribution']} ON {$this->_aliases['civicrm_contribution_recur']}.id = {$this->_aliases['civicrm_contribution']}.contribution_recur_id"; - $this->_from .= " - LEFT JOIN civicrm_email {$this->_aliases['civicrm_email']} - ON ({$this->_aliases['civicrm_contact']}.id = {$this->_aliases['civicrm_email']}.contact_id AND - {$this->_aliases['civicrm_email']}.is_primary = 1)"; - $this->_from .= " - LEFT JOIN civicrm_phone {$this->_aliases['civicrm_phone']} - ON ({$this->_aliases['civicrm_contact']}.id = {$this->_aliases['civicrm_phone']}.contact_id AND - {$this->_aliases['civicrm_phone']}.is_primary = 1)"; + + $this->joinPhoneFromContact(); + $this->joinEmailFromContact(); // for credit card type $this->addFinancialTrxnFromClause();