From decefc26ae024dc0236b432e33f9aa45bcfb674e Mon Sep 17 00:00:00 2001 From: "deb.monish" Date: Tue, 6 Mar 2018 12:58:57 +0530 Subject: [PATCH] CRM-21806: Fix issues is search form when FULL_GROUP_BY_MODE enabled --- CRM/Contact/BAO/Query.php | 13 +++++++++++-- CRM/Contact/Selector.php | 5 ++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/CRM/Contact/BAO/Query.php b/CRM/Contact/BAO/Query.php index 4dfcde1e36b7..090e8f469a8b 100644 --- a/CRM/Contact/BAO/Query.php +++ b/CRM/Contact/BAO/Query.php @@ -4872,7 +4872,13 @@ public function searchQuery( $order = $orderBy = $limit = ''; if (!$count) { - list($order, $additionalFromClause) = $this->prepareOrderBy($sort, $sortByChar, $sortOrder, $additionalFromClause); + if (!$groupContacts) { + list($order, $additionalFromClause) = $this->prepareOrderBy($sort, $sortByChar, $sortOrder, $additionalFromClause); + } + // always GROUP BY on contact IDs when $groupContacts = TRUE i.e. when we want return contact IDs only. + else { + $groupByCols = array('contact_a.id'); + } if ($rowCount > 0 && $offset >= 0) { $offset = CRM_Utils_Type::escape($offset, 'Int'); @@ -4890,7 +4896,10 @@ public function searchQuery( list($select, $from, $where, $having) = $this->query($count, $sortByChar, $groupContacts, $onlyDeleted); if (!empty($groupByCols)) { - $select = self::appendAnyValueToSelect($this->_select, $groupByCols, 'GROUP_CONCAT'); + // It doesn't matter to include columns in SELECT clause, which are present in GROUP BY when we just want the contact IDs + if (!$groupContacts) { + $select = self::appendAnyValueToSelect($this->_select, $groupByCols, 'GROUP_CONCAT'); + } $groupBy = " GROUP BY " . implode(', ', $groupByCols); if (!empty($order)) { // retrieve order by columns from ORDER BY clause diff --git a/CRM/Contact/Selector.php b/CRM/Contact/Selector.php index d0f5b4a85a52..b4135b718516 100644 --- a/CRM/Contact/Selector.php +++ b/CRM/Contact/Selector.php @@ -1012,7 +1012,6 @@ public function fillupPrevNextCache($sort, $cacheKey, $start = 0, $end = self::C $sql = $this->_query->searchQuery($start, $end, $sort, FALSE, $this->_query->_includeContactIds, FALSE, TRUE, TRUE); } - $replaceSQL = $this->_query->getSelect(); // CRM-9096 // due to limitations in our search query writer, the above query does not work @@ -1025,10 +1024,10 @@ public function fillupPrevNextCache($sort, $cacheKey, $start = 0, $end = self::C $insertSQL = " INSERT INTO civicrm_prevnext_cache ( entity_table, entity_id1, entity_id2, cacheKey, data ) -SELECT DISTINCT 'civicrm_contact', contact_a.id, contact_a.id, '$cacheKey', contact_a.display_name +SELECT DISTINCT 'civicrm_contact', contact_a.id, contact_a.id, '$cacheKey', contact_a.sort_name "; - $sql = str_replace($replaceSQL, $insertSQL, $sql); + $sql = str_replace(array("SELECT contact_a.id as contact_id", "SELECT contact_a.id as id"), $insertSQL, $sql); try { CRM_Core_DAO::executeQuery($sql); }