From 9d2f6d53cdd5f06b15dbdaa844c4dbca1a5292cb Mon Sep 17 00:00:00 2001 From: eileen Date: Tue, 5 Jun 2018 17:27:50 +1200 Subject: [PATCH 1/2] Pass cachekey around more & criteria less It turned out the toggleDuplicates was not working when criteria was set as the validation rule didn't work. Passing around cacheKey is easier to validate and we know the cache willbe created at the point of toggle. Use cacheKey instead in url --- CRM/Contact/Page/AJAX.php | 6 +----- CRM/Contact/Page/DedupeFind.php | 7 +++---- CRM/Dedupe/Merger.php | 2 +- templates/CRM/Contact/Page/DedupeFind.tpl | 5 ++--- 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/CRM/Contact/Page/AJAX.php b/CRM/Contact/Page/AJAX.php index 937a63904f49..af6fdae49853 100644 --- a/CRM/Contact/Page/AJAX.php +++ b/CRM/Contact/Page/AJAX.php @@ -1017,13 +1017,9 @@ public static function getAddressDisplay() { * Mark dupe pairs as selected from un-selected state or vice-versa, in dupe cache table. */ public static function toggleDedupeSelect() { - $rgid = CRM_Utils_Type::escape($_REQUEST['rgid'], 'Integer'); - $gid = CRM_Utils_Type::escape($_REQUEST['gid'], 'Integer'); $pnid = $_REQUEST['pnid']; $isSelected = CRM_Utils_Type::escape($_REQUEST['is_selected'], 'Boolean'); - $criteria = CRM_Utils_Request::retrieve('criteria', 'Json', $null, FALSE, '{}'); - - $cacheKeyString = CRM_Dedupe_Merger::getMergeCacheKeyString($rgid, $gid, json_decode($criteria, TRUE)); + $cacheKeyString = CRM_Utils_Request::retrieve('cacheKey', 'Alphanumeric', $null, FALSE); $params = array( 1 => array($isSelected, 'Boolean'), diff --git a/CRM/Contact/Page/DedupeFind.php b/CRM/Contact/Page/DedupeFind.php index 287f30ef11fb..a6cc014b3d45 100644 --- a/CRM/Contact/Page/DedupeFind.php +++ b/CRM/Contact/Page/DedupeFind.php @@ -111,6 +111,8 @@ public function run() { $this->assign('urlQuery', CRM_Utils_System::makeQueryString($urlQry)); $this->assign('isSelected', $this->isSelected()); $criteria = json_decode($criteria, TRUE); + $cacheKeyString = CRM_Dedupe_Merger::getMergeCacheKeyString($rgid, $gid, $criteria); + $this->assign('cacheKey', $cacheKeyString); if ($context == 'search') { $context = 'search'; @@ -120,7 +122,7 @@ public function run() { if ($action & CRM_Core_Action::RENEW) { // empty cache if ($rgid) { - CRM_Core_BAO_PrevNextCache::deleteItem(NULL, CRM_Dedupe_Merger::getMergeCacheKeyString($rgid, $gid, $criteria)); + CRM_Core_BAO_PrevNextCache::deleteItem(NULL, $cacheKeyString); } $urlQry['action'] = 'update'; CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm/contact/dedupefind', $urlQry)); @@ -171,9 +173,6 @@ public function run() { $this->assign('sourceUrl', CRM_Utils_System::url('civicrm/ajax/dedupefind', $urlQry, FALSE, NULL, FALSE)); - //reload from cache table - $cacheKeyString = CRM_Dedupe_Merger::getMergeCacheKeyString($rgid, $gid, $criteria); - $stats = CRM_Dedupe_Merger::getMergeStats($cacheKeyString); if ($stats) { $message = CRM_Dedupe_Merger::getMergeStatsMsg($stats); diff --git a/CRM/Dedupe/Merger.php b/CRM/Dedupe/Merger.php index e57e83d6373c..1c444e836b8a 100644 --- a/CRM/Dedupe/Merger.php +++ b/CRM/Dedupe/Merger.php @@ -2035,7 +2035,7 @@ public static function getDuplicatePairs($rule_group_id, $group_id, $reloadCache */ public static function getMergeCacheKeyString($rule_group_id, $group_id, $criteria = array(), $checkPermissions = TRUE) { $contactType = CRM_Dedupe_BAO_RuleGroup::getContactTypeForRuleGroup($rule_group_id); - $cacheKeyString = "merge {$contactType}"; + $cacheKeyString = "merge_{$contactType}"; $cacheKeyString .= $rule_group_id ? "_{$rule_group_id}" : '_0'; $cacheKeyString .= $group_id ? "_{$group_id}" : '_0'; $cacheKeyString .= !empty($criteria) ? md5(serialize($criteria)) : '_0'; diff --git a/templates/CRM/Contact/Page/DedupeFind.tpl b/templates/CRM/Contact/Page/DedupeFind.tpl index d5ac0f2fbabf..afdfe3cc7a16 100644 --- a/templates/CRM/Contact/Page/DedupeFind.tpl +++ b/templates/CRM/Contact/Page/DedupeFind.tpl @@ -324,8 +324,7 @@ var is_selected = CRM.$('.crm-dedupe-select-all').prop('checked') ? 1 : 0; } - var criteria = {/literal}'{$criteria|escape}'{literal}; - criteria = criteria.length > 0 ? criteria : 0; + var cacheKey = {/literal}'{$cacheKey|escape}'{literal}; var dataUrl = {/literal}"{crmURL p='civicrm/ajax/toggleDedupeSelect' h=0 q='snippet=4'}"{literal}; var rgid = {/literal}"{$rgid}"{literal}; @@ -334,7 +333,7 @@ rgid = rgid.length > 0 ? rgid : 0; gid = gid.length > 0 ? gid : 0; - CRM.$.post(dataUrl, {pnid: id, rgid: rgid, gid: gid, is_selected: is_selected, criteria : criteria}, function (data) { + CRM.$.post(dataUrl, {pnid: id, rgid: rgid, gid: gid, is_selected: is_selected, cacheKey : cacheKey}, function (data) { // nothing to do for now }, 'json'); } From 917acf6f4ab51584d03547d1abd3ee199e13278f Mon Sep 17 00:00:00 2001 From: eileen Date: Tue, 12 Jun 2018 14:37:53 +1200 Subject: [PATCH 2/2] Re-instate batch limit --- CRM/Contact/Page/DedupeFind.php | 2 +- CRM/Dedupe/Finder.php | 2 +- CRM/Dedupe/Merger.php | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CRM/Contact/Page/DedupeFind.php b/CRM/Contact/Page/DedupeFind.php index a6cc014b3d45..9807cd36520d 100644 --- a/CRM/Contact/Page/DedupeFind.php +++ b/CRM/Contact/Page/DedupeFind.php @@ -182,7 +182,7 @@ public function run() { CRM_Dedupe_Merger::resetMergeStats($cacheKeyString); } - $this->_mainContacts = CRM_Dedupe_Merger::getDuplicatePairs($rgid, $gid, !$isConflictMode, 0, $this->isSelected(), '', $isConflictMode, $criteria, TRUE); + $this->_mainContacts = CRM_Dedupe_Merger::getDuplicatePairs($rgid, $gid, !$isConflictMode, 0, $this->isSelected(), '', $isConflictMode, $criteria, TRUE, $limit); if (empty($this->_mainContacts)) { if ($isConflictMode) { diff --git a/CRM/Dedupe/Finder.php b/CRM/Dedupe/Finder.php index 6a5f7c9e0ccb..c6aa6cf306b7 100644 --- a/CRM/Dedupe/Finder.php +++ b/CRM/Dedupe/Finder.php @@ -181,7 +181,7 @@ public static function dupesByParams( * array of (cid1, cid2, weight) dupe triples */ public static function dupesInGroup($rgid, $gid, $searchLimit = 0) { - $cids = array_keys(CRM_Contact_BAO_Group::getMember($gid, $searchLimit)); + $cids = array_keys(CRM_Contact_BAO_Group::getMember($gid, TRUE, $searchLimit)); if (!empty($cids)) { return self::dupes($rgid, $cids); } diff --git a/CRM/Dedupe/Merger.php b/CRM/Dedupe/Merger.php index 1c444e836b8a..a2fe7e718748 100644 --- a/CRM/Dedupe/Merger.php +++ b/CRM/Dedupe/Merger.php @@ -1986,6 +1986,7 @@ public static function createMergeActivities($mainId, $otherId) { * @param int $rule_group_id * @param int $group_id * @param bool $reloadCacheIfEmpty + * Should the cache be reloaded if empty - this must be false when in a dedupe action! * @param int $batchLimit * @param bool $isSelected * Limit to selected pairs.