Skip to content

Commit

Permalink
Fix regression on searching by contact in advanced search
Browse files Browse the repository at this point in the history
  • Loading branch information
eileenmcnaughton committed Sep 9, 2019
1 parent d004755 commit f4ef2eb
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 18 deletions.
58 changes: 40 additions & 18 deletions CRM/Contact/BAO/Query.php
Original file line number Diff line number Diff line change
Expand Up @@ -566,7 +566,8 @@ public function initialize($apiEntity = NULL) {
$this->_whereTables = $this->_tables;

$this->selectClause($apiEntity);
$this->_whereClause = $this->whereClause($apiEntity);
$isForcePrimaryOnly = !empty($apiEntity);
$this->_whereClause = $this->whereClause($isForcePrimaryOnly);
if (array_key_exists('civicrm_contribution', $this->_whereTables)) {
$component = 'contribution';
}
Expand Down Expand Up @@ -1818,9 +1819,11 @@ public static function fixWhereValues($id, &$values, $wildcard = 0, $useEquals =
* Get the where clause for a single field.
*
* @param array $values
* @param string $apiEntity
* @param bool $isForcePrimaryOnly
*
* @throws \CRM_Core_Exception
*/
public function whereClauseSingle(&$values, $apiEntity = NULL) {
public function whereClauseSingle(&$values, $isForcePrimaryOnly = FALSE) {
if ($this->isARelativeDateField($values[0])) {
$this->buildRelativeDateQuery($values);
return;
Expand Down Expand Up @@ -1897,7 +1900,7 @@ public function whereClauseSingle(&$values, $apiEntity = NULL) {

case 'email':
case 'email_id':
$this->email($values, $apiEntity);
$this->email($values, $isForcePrimaryOnly);
return;

case 'phone_numeric':
Expand Down Expand Up @@ -2066,11 +2069,12 @@ public function whereClauseSingle(&$values, $apiEntity = NULL) {
/**
* Given a list of conditions in params generate the required where clause.
*
* @param string $apiEntity
* @param bool $isForcePrimaryEmailOnly
*
* @return string
* @throws \CRM_Core_Exception
*/
public function whereClause($apiEntity = NULL) {
public function whereClause($isForcePrimaryEmailOnly = NULL) {
$this->_where[0] = [];
$this->_qill[0] = [];

Expand All @@ -2097,7 +2101,7 @@ public function whereClause($apiEntity = NULL) {
]);
}
else {
$this->whereClauseSingle($this->_params[$id], $apiEntity);
$this->whereClauseSingle($this->_params[$id], $isForcePrimaryEmailOnly);
}
}

Expand Down Expand Up @@ -3569,26 +3573,26 @@ public function greetings(&$values) {
* Where / qill clause for email
*
* @param array $values
* @param string $apiEntity
* @param string $isForcePrimaryOnly
*
* @throws \CRM_Core_Exception
*/
protected function email(&$values, $apiEntity) {
protected function email(&$values, $isForcePrimaryOnly) {
list($name, $op, $value, $grouping, $wildcard) = $values;
$this->_tables['civicrm_email'] = $this->_whereTables['civicrm_email'] = 1;

// CRM-18147: for Contact's GET API, email fieldname got appended with its entity as in {$apiEntiy}_{$name}
// so following code is use build whereClause for contact's primart email id
if (!empty($apiEntity)) {
$dataType = 'String';
if ($name == 'email_id') {
$dataType = 'Integer';
$name = 'id';
}

if (!empty($isForcePrimaryOnly)) {
$this->_where[$grouping][] = self::buildClause('civicrm_email.is_primary', '=', 1, 'Integer');
$this->_where[$grouping][] = self::buildClause("civicrm_email.$name", $op, $value, $dataType);
return;
}

if (is_array($value)) {
$this->_qill[$grouping][] = $this->getQillForField($name, $value, $op);
$this->_where[$grouping][] = self::buildClause('civicrm_email.email', $op, $value, 'String');
return;
}
// Is this ever hit now? Ideally ensure alwasy an array & handled above.
$n = trim($value);
if ($n) {
if (substr($n, 0, 1) == '"' &&
Expand Down Expand Up @@ -7118,4 +7122,22 @@ protected function getSelectedGroupStatuses($grouping) {
return $statuses;
}

/**
* Get the qill value for the field.
*
* @param $name
* @param array $value
* @param $op
*
* @return string
*/
protected function getQillForField($name, array $value, $op): string {
list($qillop, $qillVal) = CRM_Contact_BAO_Query::buildQillForFieldValue(NULL, $name, $value, $op);
return (string) ts("%1 %2 %3", [
1 => ts('Email'),
2 => $qillop,
3 => $qillVal,
]);
}

}
11 changes: 11 additions & 0 deletions tests/phpunit/api/v3/ContactTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -938,6 +938,17 @@ public function testGetSort() {
$this->callAPISuccess($this->_entity, 'delete', ['id' => $c2['id']]);
}

/**
* Test the like operator works for Contact.get
*
* @throws \CRM_Core_Exception
*/
public function testGetEmailLike() {
$this->individualCreate();
$this->callAPISuccessGetCount('Contact', ['email' => ['LIKE' => 'an%']], 1);
$this->callAPISuccessGetCount('Contact', ['email' => ['LIKE' => 'ab%']], 0);
}

/**
* Test that we can retrieve contacts using array syntax.
*
Expand Down

0 comments on commit f4ef2eb

Please sign in to comment.