diff --git a/CRM/Contact/BAO/Query.php b/CRM/Contact/BAO/Query.php
index d62f6279d24c..9d5e64a38a51 100644
--- a/CRM/Contact/BAO/Query.php
+++ b/CRM/Contact/BAO/Query.php
@@ -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';
}
@@ -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;
@@ -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':
@@ -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] = [];
@@ -2097,7 +2101,7 @@ public function whereClause($apiEntity = NULL) {
]);
}
else {
- $this->whereClauseSingle($this->_params[$id], $apiEntity);
+ $this->whereClauseSingle($this->_params[$id], $isForcePrimaryEmailOnly);
}
}
@@ -3569,26 +3573,29 @@ 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);
+ }
+ // @todo - this should come from the $this->_fields array
+ $dbName = $name === 'email_id' ? 'id' : $name;
+
+ if (is_array($value) || $name === 'email_id') {
+ $this->_qill[$grouping][] = $this->getQillForField($name, $value, $op);
+ $this->_where[$grouping][] = self::buildClause('civicrm_email.' . $dbName, $op, $value, 'String');
return;
}
+ // Is this ever hit now? Ideally ensure always an array & handle above.
$n = trim($value);
if ($n) {
if (substr($n, 0, 1) == '"' &&
@@ -7118,4 +7125,22 @@ protected function getSelectedGroupStatuses($grouping) {
return $statuses;
}
+ /**
+ * Get the qill value for the field.
+ *
+ * @param $name
+ * @param array|int|string $value
+ * @param $op
+ *
+ * @return string
+ */
+ protected function getQillForField($name, $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,
+ ]);
+ }
+
}
diff --git a/CRM/Upgrade/Incremental/sql/5.17.1.mysql.tpl b/CRM/Upgrade/Incremental/sql/5.17.1.mysql.tpl
new file mode 100644
index 000000000000..00d208673b2c
--- /dev/null
+++ b/CRM/Upgrade/Incremental/sql/5.17.1.mysql.tpl
@@ -0,0 +1 @@
+{* file to handle db changes in 5.17.1 during upgrade *}
diff --git a/release-notes.md b/release-notes.md
index a35dc34a517c..b5f82463cadc 100644
--- a/release-notes.md
+++ b/release-notes.md
@@ -15,6 +15,15 @@ Other resources for identifying changes are:
* https://github.com/civicrm/civicrm-joomla
* https://github.com/civicrm/civicrm-wordpress
+## CiviCRM 5.17.1
+
+Released September 9, 2019
+
+- **[Synopsis](release-notes/5.17.1.md#synopsis)**
+- **[Bugs resolved](release-notes/5.17.1.md#bugs)**
+- **[Credits](release-notes/5.17.1.md#credits)**
+- **[Feedback](release-notes/5.17.1.md#feedback)**
+
## CiviCRM 5.17.0
Released September 4, 2019
diff --git a/release-notes/5.17.1.md b/release-notes/5.17.1.md
new file mode 100644
index 000000000000..58a979c599ef
--- /dev/null
+++ b/release-notes/5.17.1.md
@@ -0,0 +1,39 @@
+# CiviCRM 5.17.1
+
+Released September 9, 2019
+
+- **[Synopsis](#synopsis)**
+- **[Bugs resolved](#bugs)**
+- **[Credits](#credits)**
+- **[Feedback](#feedback)**
+
+## Synopsis
+
+| *Does this version...?* | |
+|:--------------------------------------------------------------- |:-------:|
+| Fix security vulnerabilities? | no |
+| Change the database schema? | no |
+| Alter the API? | no |
+| Require attention to configuration options? | no |
+| **Fix problems installing or upgrading to a previous version?** | **yes** |
+| Introduce features? | no |
+| **Fix bugs?** | **yes** |
+
+## Bugs resolved
+
+- **CiviCampaign: Fix deletion of campaigns when popups are disabled ([dev/core#1233](https://lab.civicrm.org/dev/core/issues/1233): [#15233](https://github.com/civicrm/civicrm-core/pull/15233))**
+- **Upgrade: Fix adding of pptx to the list of safe file extensions ([dev/core#1190](https://lab.civicrm.org/dev/core/issues/1190): [#15239](https://github.com/civicrm/civicrm-core/pull/15239))**
+
+## Credits
+
+This release was developed by the following authors and reviewers:
+
+Wikimedia Foundation - Eileen McNaughton; iXiam - César Ramos; Dave D;
+CiviCRM - Tim Otten; Australian Greens - Seamus Lee
+
+## Feedback
+
+These release notes are edited by Tim Otten and Andrew Hunt. If you'd like to
+provide feedback on them, please login to https://chat.civicrm.org/civicrm and
+contact `@agh1`.
+
diff --git a/tests/phpunit/api/v3/ContactTest.php b/tests/phpunit/api/v3/ContactTest.php
index 146d5abad7e0..3883c0ecee02 100644
--- a/tests/phpunit/api/v3/ContactTest.php
+++ b/tests/phpunit/api/v3/ContactTest.php
@@ -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.
*