From d1d3c04a17aede152b7ed668a30c3e96f73e7882 Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Fri, 15 Jan 2016 20:06:44 -0500 Subject: [PATCH] CRM-17645 - Move util function --- CRM/Case/BAO/Case.php | 2 +- CRM/Case/BAO/CaseContact.php | 2 +- CRM/Core/DAO.php | 27 +--------------- CRM/Utils/SQL.php | 61 ++++++++++++++++++++++++++++++++++++ CRM/Utils/SQL/Select.php | 28 +++++++++++++++++ 5 files changed, 92 insertions(+), 28 deletions(-) create mode 100644 CRM/Utils/SQL.php diff --git a/CRM/Case/BAO/Case.php b/CRM/Case/BAO/Case.php index d4d19f8bb9..139ac088f5 100644 --- a/CRM/Case/BAO/Case.php +++ b/CRM/Case/BAO/Case.php @@ -3130,7 +3130,7 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; 'is_deleted' => CRM_Core_Permission::check('administer CiviCase') ? array() : array("= 0"), ); // Ensure the user has permission to view the case client - $contactClause = CRM_Core_DAO::mergeSubquery('Contact'); + $contactClause = CRM_Utils_SQL::mergeSubquery('Contact'); if ($contactClause) { $contactClause = implode(' AND contact_id ', $contactClause); $clauses['id'][] = "IN (SELECT case_id FROM civicrm_case_contact WHERE contact_id $contactClause)"; diff --git a/CRM/Case/BAO/CaseContact.php b/CRM/Case/BAO/CaseContact.php index 4e693b42b3..38beb7c8b4 100644 --- a/CRM/Case/BAO/CaseContact.php +++ b/CRM/Case/BAO/CaseContact.php @@ -83,7 +83,7 @@ class CRM_Case_BAO_CaseContact extends CRM_Case_DAO_CaseContact { public function addSelectWhereClause() { return array( // Reuse case acls - 'case_id' => CRM_Core_DAO::mergeSubquery('Case'), + 'case_id' => CRM_Utils_SQL::mergeSubquery('Case'), // Case acls already check for contact access so we can just mark contact_id as handled 'contact_id' => array(), ); diff --git a/CRM/Core/DAO.php b/CRM/Core/DAO.php index f256fde225..76892fb626 100644 --- a/CRM/Core/DAO.php +++ b/CRM/Core/DAO.php @@ -2471,7 +2471,7 @@ SELECT contact_id $clauses = array(); foreach ($this->fields() as $fieldName => $field) { if (strpos($fieldName, 'contact_id') === 0 && CRM_Utils_Array::value('FKClassName', $field) == 'CRM_Contact_DAO_Contact') { - $clauses[$fieldName] = self::mergeSubquery('Contact'); + $clauses[$fieldName] = CRM_Utils_SQL::mergeSubquery('Contact'); } } CRM_Utils_Hook::selectWhereClause($this, $clauses); @@ -2501,29 +2501,4 @@ SELECT contact_id return $clauses; } - /** - * Helper function for adding the permissioned subquery from one entity onto another - * - * @param string $entity - * @param string $joinColumn - * @return array - */ - public static function mergeSubquery($entity, $joinColumn = 'id') { - $baoName = _civicrm_api3_get_BAO($entity); - $bao = new $baoName(); - $clauses = $subclauses = array(); - foreach ((array) $bao->addSelectWhereClause() as $field => $vals) { - if ($vals && $field == $joinColumn) { - $clauses = array_merge($clauses, (array) $vals); - } - elseif ($vals) { - $subclauses[] = "$field " . implode(" AND $field ", (array) $vals); - } - } - if ($subclauses) { - $clauses[] = "IN (SELECT `$joinColumn` FROM `" . $bao->tableName() . "` WHERE " . implode(' AND ', $subclauses) . ")"; - } - return $clauses; - } - } diff --git a/CRM/Utils/SQL.php b/CRM/Utils/SQL.php new file mode 100644 index 0000000000..dd878bf3b8 --- /dev/null +++ b/CRM/Utils/SQL.php @@ -0,0 +1,61 @@ +addSelectWhereClause() as $field => $vals) { + if ($vals && $field == $joinColumn) { + $clauses = array_merge($clauses, (array) $vals); + } + elseif ($vals) { + $subclauses[] = "$field " . implode(" AND $field ", (array) $vals); + } + } + if ($subclauses) { + $clauses[] = "IN (SELECT `$joinColumn` FROM `" . $bao->tableName() . "` WHERE " . implode(' AND ', $subclauses) . ")"; + } + return $clauses; + } + +} diff --git a/CRM/Utils/SQL/Select.php b/CRM/Utils/SQL/Select.php index e130e57994..15e3df4803 100644 --- a/CRM/Utils/SQL/Select.php +++ b/CRM/Utils/SQL/Select.php @@ -1,4 +1,29 @@ where('activity_type_id = #type') * ->param('type', 234), * @endcode + * + * @package CRM + * @copyright CiviCRM LLC (c) 2004-2015 */ class CRM_Utils_SQL_Select implements ArrayAccess { -- 2.25.1