CRM-19184 - Activities target contact list does not truncate
authorjitendrapurohit <jitendra.purohit@webaccessglobal.com>
Mon, 8 Aug 2016 10:21:24 +0000 (15:51 +0530)
committerjitendrapurohit <jitendra.purohit@webaccessglobal.com>
Mon, 8 Aug 2016 10:29:34 +0000 (15:59 +0530)
13 files changed:
CRM/Activity/BAO/Activity.php
CRM/Contact/BAO/Query.php
CRM/Report/Form.php
CRM/Report/Form/Activity.php
CRM/Report/Form/Contribute/Detail.php
CRM/Report/Form/Contribute/Lybunt.php
CRM/Report/Form/Contribute/SoftCredit.php
CRM/Report/Form/Contribute/Summary.php
CRM/Report/Form/Contribute/Sybunt.php
CRM/Report/Form/Event/IncomeCountSummary.php
CRM/Report/Form/Member/Summary.php
CRM/Report/Form/Pledge/Summary.php
tests/phpunit/CRM/Activity/BAO/ActivityTest.php

index 3be24e045748123b09e55f03420ef04d8bb9a1ee..54a522b1ee64ee392a39fa12f0c9e525755dcaeb 100644 (file)
@@ -789,22 +789,20 @@ WHERE ac.record_type_id != %1
     $params = array(1 => array($targetID, 'Integer'));
     CRM_Core_DAO::executeQuery($query, $params);
 
+    $activityFields = array("ac.activity_id", "ac.contact_id", "ac.record_type_id", "c.sort_name", "c.is_deleted");
+    $select = CRM_Contact_BAO_Query::appendAnyValueToSelect($activityFields, "ac.activity_id");
+
     // for each activity insert one target contact
     // if we load all target contacts the performance will suffer a lot for mass-activities.
     $query = "
 INSERT INTO {$activityContactTempTable} ( activity_id, contact_id, record_type_id, contact_name, is_deleted, counter )
-SELECT     ac.activity_id,
-           ac.contact_id,
-           ac.record_type_id,
-           c.sort_name,
-           c.is_deleted,
-           count(ac.contact_id)
+{$select}, count(ac.contact_id)
 FROM       {$activityTempTable}
 INNER JOIN civicrm_activity a ON ( a.id = {$activityTempTable}.activity_id )
 INNER JOIN civicrm_activity_contact ac ON ( ac.activity_id = {$activityTempTable}.activity_id )
 INNER JOIN civicrm_contact c ON c.id = ac.contact_id
 WHERE ac.record_type_id = %1
-GROUP BY ac.activity_id, ac.contact_id
+GROUP BY ac.activity_id
 ";
 
     CRM_Core_DAO::executeQuery($query, $params);
index 1467ae6eacb4bf55b081ac806ec75147a9e12b61..eeb4281951eff88baaa164c8ec70731f4dda8bfa 100644 (file)
@@ -4522,6 +4522,41 @@ civicrm_relationship.is_permission_a_b = 0
     }
   }
 
+  /**
+   * For some special cases, grouping by subset of select fields becomes mandatory.
+   * Hence, full_group_by mode is handled by appending any_value
+   * keyword to select fields not present in groupBy
+   *
+   * @param array $selectClauses
+   * @param array $groupBy - Columns already included in GROUP By clause.
+   *
+   * @return string
+   */
+  public static function appendAnyValueToSelect($selectClauses, $groupBy) {
+    $mysqlVersion = CRM_Core_DAO::singleValueQuery('SELECT VERSION()');
+    $sqlMode = explode(',', CRM_Core_DAO::singleValueQuery('SELECT @@sql_mode'));
+
+    // Disable only_full_group_by mode for lower sql versions.
+    if (version_compare($mysqlVersion, '5.7', '<') || (!empty($sqlMode) && !in_array('ONLY_FULL_GROUP_BY', $sqlMode))) {
+      $key = array_search('ONLY_FULL_GROUP_BY', $sqlMode);
+      unset($sqlMode[$key]);
+      CRM_Core_DAO::executeQuery("SET SESSION sql_mode = '" . implode(',', $sqlMode) . "'");
+    }
+    else {
+      $groupBy = array_map('trim', (array) $groupBy);
+      $aggregateFunctions = '/(ROUND|AVG|COUNT|GROUP_CONCAT|SUM|MAX|MIN)\(/i';
+      foreach ($selectClauses as $key => &$val) {
+        list($selectColumn, $alias) = array_pad(preg_split('/ as /i', $val), 2, NULL);
+        // append ANY_VALUE() keyword
+        if (!in_array($selectColumn, $groupBy) && preg_match($aggregateFunctions, trim($selectColumn)) !== 1) {
+          $val = str_replace($selectColumn, "ANY_VALUE({$selectColumn})", $val);
+        }
+      }
+    }
+
+    return "SELECT " . implode(', ', $selectClauses) . " ";
+  }
+
   /**
    * Include Select columns in groupBy clause.
    *
index 04be6ad607de867f000cc8275268315c55692348..a4c589826249877b62b536e9fb16ddd825107417 100644 (file)
@@ -2644,35 +2644,6 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND
     return $sql;
   }
 
-  /**
-   * append select with ANY_VALUE() keyword.
-   *
-   * @param array $selectClauses
-   * @param array $groupBy - Columns already included in GROUP By clause.
-   */
-  public function appendSelect($selectClauses, $groupBy) {
-    $mysqlVersion = CRM_Core_DAO::singleValueQuery('SELECT VERSION()');
-    $sqlMode = explode(',', CRM_Core_DAO::singleValueQuery('SELECT @@sql_mode'));
-
-    // Disable only_full_group_by mode for lower sql versions.
-    if (version_compare($mysqlVersion, '5.7', '<') || (!empty($sqlMode) && !in_array('ONLY_FULL_GROUP_BY', $sqlMode))) {
-      $key = array_search('ONLY_FULL_GROUP_BY', $sqlMode);
-      unset($sqlMode[$key]);
-      CRM_Core_DAO::executeQuery("SET SESSION sql_mode = '" . implode(',', $sqlMode) . "'");
-      return;
-    }
-    $groupBy = array_map('trim', (array) $groupBy);
-    $aggregateFunctions = '/(ROUND|AVG|COUNT|GROUP_CONCAT|SUM|MAX|MIN)\(/i';
-    foreach ($selectClauses as $key => &$val) {
-      list($selectColumn, $alias) = array_pad(preg_split('/ as /i', $val), 2, NULL);
-      // append ANY_VALUE() keyword
-      if (!in_array($selectColumn, $groupBy) && preg_match($aggregateFunctions, trim($selectColumn)) !== 1) {
-        $val = str_replace($selectColumn, "ANY_VALUE({$selectColumn})", $val);
-      }
-    }
-    $this->_select = "SELECT " . implode(', ', $selectClauses) . " ";
-  }
-
   /**
    * Build group by clause.
    */
@@ -2846,7 +2817,7 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND
         $ifnulls[] = "ifnull($alias, '') as $alias";
       }
       $this->_select = "SELECT " . implode(", ", $ifnulls);
-      $this->appendSelect($ifnulls, $sectionAliases);
+      $this->_select = CRM_Contact_BAO_Query::appendAnyValueToSelect($ifnulls, $sectionAliases);
 
       // Group (un-limited) report by all aliases and get counts. This might
       // be done more efficiently when the contents of $sql are known, ie. by
index a78eda2db29016b41a6c27944554eacfeb49a235..7b06de4f37d06f850c1de3fbc0694bf34020986e 100644 (file)
@@ -1035,7 +1035,7 @@ FROM civireport_activity_temp_target tar
         $ifnulls[] = "ifnull($alias, '') as $alias";
       }
       $this->_select = "SELECT " . implode(", ", $ifnulls);
-      $this->appendSelect($ifnulls, $sectionAliases);
+      $this->_select = CRM_Contact_BAO_Query::appendAnyValueToSelect($ifnulls, $sectionAliases);
 
       $query = $this->_select .
         ", count(DISTINCT civicrm_activity_id) as ct from civireport_activity_temp_target group by " .
index 7ebd1cdcb19db9d8cc121f6ab57c01a8e18c5473..d3c984841cb207856caad9d7daedafceb6a86c49 100644 (file)
@@ -886,7 +886,7 @@ WHERE  civicrm_contribution_contribution_id={$row['civicrm_contribution_contribu
         $ifnulls[] = "ifnull($alias, '') as $alias";
       }
       $this->_select = "SELECT " . implode(", ", $ifnulls);
-      $this->appendSelect($ifnulls, $sectionAliases);
+      $this->_select = CRM_Contact_BAO_Query::appendAnyValueToSelect($ifnulls, $sectionAliases);
 
       /* Group (un-limited) report by all aliases and get counts. This might
        * be done more efficiently when the contents of $sql are known, ie. by
index c17bc0b8160b030efdf3b9128e6e89875cd12d58..f599dea959a918b13053f9a1f9c59e62f3770316 100644 (file)
@@ -552,7 +552,7 @@ class CRM_Report_Form_Contribute_Lybunt extends CRM_Report_Form {
 
   public function groupBy() {
     $this->_groupBy = "GROUP BY  {$this->_aliases['civicrm_contribution']}.contact_id ";
-    $this->appendSelect($this->_selectClauses, "{$this->_aliases['civicrm_contribution']}.contact_id");
+    $this->_select = CRM_Contact_BAO_Query::appendAnyValueToSelect($this->_selectClauses, "{$this->_aliases['civicrm_contribution']}.contact_id");
     $this->assign('chartSupported', TRUE);
   }
 
index 70b99eb3134942a8c64eb2e20ac62757a658df5b..52c6165ed67e544dfe55029ec6ff76412ddac393 100644 (file)
@@ -459,7 +459,7 @@ class CRM_Report_Form_Contribute_SoftCredit extends CRM_Report_Form {
 
   public function groupBy() {
     $this->_rollup = 'WITH ROLLUP';
-    $this->appendSelect($this->selectClause, array("{$this->_aliases['civicrm_contribution_soft']}.contact_id", "constituentname.id"));
+    $this->_select = CRM_Contact_BAO_Query::appendAnyValueToSelect($this->selectClause, array("{$this->_aliases['civicrm_contribution_soft']}.contact_id", "constituentname.id"));
     $this->_groupBy = "
 GROUP BY {$this->_aliases['civicrm_contribution_soft']}.contact_id, constituentname.id {$this->_rollup}";
   }
index ee09282b3ddd717078878cd9d7e35fc718167aec..aaf70648057f65aec42b6b22c940d3cd9947c243 100644 (file)
@@ -559,7 +559,7 @@ class CRM_Report_Form_Contribute_Summary extends CRM_Report_Form {
     }
     $this->_groupBy .= $this->_rollup;
     // append select with ANY_VALUE() keyword
-    $this->appendSelect($this->_selectClauses, $groupBy);
+    $this->_select = CRM_Contact_BAO_Query::appendAnyValueToSelect($this->_selectClauses, $groupBy);
   }
 
   /**
index fae15cf5e6d6d1422d995c89d79d89254d0bac30..a38f5116ff0384d3bb7668b3196f4a8629a086ed 100644 (file)
@@ -398,7 +398,7 @@ class CRM_Report_Form_Contribute_Sybunt extends CRM_Report_Form {
     $this->assign('chartSupported', TRUE);
     $fiscalYearOffset = self::fiscalYearOffset("{$this->_aliases['civicrm_contribution']}.receive_date");
     $this->_groupBy = "GROUP BY {$this->_aliases['civicrm_contribution']}.contact_id, {$fiscalYearOffset}";
-    $this->appendSelect($this->_selectClauses, array("{$this->_aliases['civicrm_contribution']}.contact_id", $fiscalYearOffset));
+    $this->_select = CRM_Contact_BAO_Query::appendAnyValueToSelect($this->_selectClauses, array("{$this->_aliases['civicrm_contribution']}.contact_id", $fiscalYearOffset));
     $this->_groupBy .= " {$this->_rollup}";
   }
 
index f502c2d0a4bc0048a9356b48ba19dca00cb92a74..fedf49585fb1de7751a09f77482db8b04449fd06 100644 (file)
@@ -305,7 +305,7 @@ class CRM_Report_Form_Event_IncomeCountSummary extends CRM_Report_Form_Event {
   public function groupBy() {
     $this->assign('chartSupported', TRUE);
     $this->_rollup = " WITH ROLLUP";
-    $this->appendSelect($this->_selectClauses, "{$this->_aliases['civicrm_event']}.id");
+    $this->_select = CRM_Contact_BAO_Query::appendAnyValueToSelect($this->_selectClauses, "{$this->_aliases['civicrm_event']}.id");
     $this->_groupBy = " GROUP BY {$this->_aliases['civicrm_event']}.id {$this->_rollup}";
   }
 
index f7d2f77890d7ae004b048d087fce608aee51e923..8bbba645b1d83b553a8aff7c9448e06ad3f13fc2 100644 (file)
@@ -382,7 +382,7 @@ class CRM_Report_Form_Member_Summary extends CRM_Report_Form {
       }
 
       $this->_rollup = ' WITH ROLLUP';
-      $this->appendSelect($this->_selectClauses, array_filter($this->_groupBy));
+      $this->_select = CRM_Contact_BAO_Query::appendAnyValueToSelect($this->_selectClauses, array_filter($this->_groupBy));
       $this->_groupBy = 'GROUP BY ' . implode(', ', array_filter($this->_groupBy)) .
         " {$this->_rollup} ";
     }
index a5b4d022d91bac2a3d33f066d2ca392452819c36..6fa2d37d64e3d7acfaad30c631eaecedb597df9b 100644 (file)
@@ -280,7 +280,7 @@ class CRM_Report_Form_Pledge_Summary extends CRM_Report_Form {
       $groupBy = "{$this->_aliases['civicrm_contact']}.id";
       $this->_groupBy = "GROUP BY {$groupBy}";
     }
-    $this->appendSelect($this->_selectClauses, $groupBy);
+    $this->_select = CRM_Contact_BAO_Query::appendAnyValueToSelect($this->_selectClauses, $groupBy);
     $this->_groupBy .= " {$this->_rollup}";
   }
 
index bc7e1776fad8d01fc03278e8c5bb28d36f10f82f..09abc8b66bd5b11be706b0ec1bcea2359b7c3861 100644 (file)
@@ -499,6 +499,32 @@ class CRM_Activity_BAO_ActivityTest extends CiviUnitTestCase {
     }
   }
 
+  /**
+   * Test target contact count.
+   */
+  public function testTargetCountforContactSummary() {
+    $targetCount = 5;
+    $contactId = $this->individualCreate();
+    for ($i = 0; $i < $targetCount; $i++) {
+      $targetContactIDs[] = $this->individualCreate(array(), $i);
+    }
+    // create activities with 5 target contacts
+    $activityParams = array(
+      'source_contact_id' => $contactId,
+      'target_contact_id' => $targetContactIDs,
+    );
+    $this->activityCreate($activityParams);
+
+    $params = array(
+      'contact_id' => $contactId,
+      'context' => 'activity',
+    );
+    $activities = CRM_Activity_BAO_Activity::getActivities($params);
+
+    //verify target count
+    $this->assertEquals($targetCount, $activities[1]['target_contact_counter']);
+  }
+
   /**
    * Test getActivities BAO method.
    */