Eileen has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/373176 )
Change subject: CRM-20658: Fatal error on Dedupe rule for > 1 match
......................................................................
CRM-20658: Fatal error on Dedupe rule for > 1 match
Bug: T160571
Change-Id: Ib735f997952c9edf5393464255da3e228e837ce7
---
M CRM/Dedupe/BAO/RuleGroup.php
1 file changed, 18 insertions(+), 3 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/wikimedia/fundraising/crm/civicrm
refs/changes/76/373176/1
diff --git a/CRM/Dedupe/BAO/RuleGroup.php b/CRM/Dedupe/BAO/RuleGroup.php
index 5e4096a..87861b9 100644
--- a/CRM/Dedupe/BAO/RuleGroup.php
+++ b/CRM/Dedupe/BAO/RuleGroup.php
@@ -229,20 +229,35 @@
$fieldWeight = array_keys($tableQueries);
$fieldWeight = $fieldWeight[0];
$query = array_shift($tableQueries);
+ $dupeWeightClause = 'ON DUPLICATE KEY UPDATE weight = weight +
VALUES(weight)';
if ($searchWithinDupes) {
// get prepared to search within already found dupes if
$searchWithinDupes flag is set
$dao->query("DROP TEMPORARY TABLE IF EXISTS dedupe_copy");
$dao->query("CREATE TEMPORARY TABLE dedupe_copy SELECT * FROM
dedupe WHERE weight >= {$weightSum}");
- $dao->free();
preg_match($patternColumn, $query, $matches);
- $query = str_replace(' WHERE ', str_replace('column', $matches[1],
$dupeCopyJoin), $query);
+ $count = substr_count($query, ' WHERE ');
+ if ($count == 2 && strpos($query, 'UNION') !== FALSE) {
+ //Create second copy as single temp table cannot be referred
twice in a single query.
+ $dao->query("CREATE TEMPORARY TABLE dedupe_copy_2 SELECT * FROM
dedupe WHERE weight >= {$weightSum}");
+ $dupeCopyJoins = array($dupeCopyJoin, str_replace('dedupe_copy',
'dedupe_copy_2', $dupeCopyJoin));
+ $queryArray = explode('UNION', $query);
+ foreach ($queryArray as $key => $value) {
+ $queryArray[$key] = str_replace(' WHERE ',
str_replace('column', $matches[1], $dupeCopyJoins[$key]), $queryArray[$key]);
+ }
+ $query = implode(' UNION ', $queryArray);
+ $dupeWeightClause = str_replace('weight', 'dedupe.weight',
$dupeWeightClause);
+ }
+ else {
+ $query = str_replace(' WHERE ', str_replace('column',
$matches[1], $dupeCopyJoin), $query);
+ }
+ $dao->free();
}
$searchWithinDupes = 1;
// construct and execute the intermediate query
- $query = "{$insertClause} {$query} {$groupByClause} ON DUPLICATE KEY
UPDATE weight = weight + VALUES(weight)";
+ $query = "{$insertClause} {$query} {$groupByClause}
{$dupeWeightClause}";
$dao->query($query);
// FIXME: we need to be more acurate with affected rows, especially
for insert vs duplicate insert.
--
To view, visit https://gerrit.wikimedia.org/r/373176
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib735f997952c9edf5393464255da3e228e837ce7
Gerrit-PatchSet: 1
Gerrit-Project: wikimedia/fundraising/crm/civicrm
Gerrit-Branch: master
Gerrit-Owner: Eileen <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits