$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);
}
}
+ /**
+ * 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.
*
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.
*/
$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
$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 " .
$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
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);
}
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}";
}
}
$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);
}
/**
$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}";
}
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}";
}
}
$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} ";
}
$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}";
}
}
}
+ /**
+ * 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.
*/