Skip to content

Commit

Permalink
CRM-19048 - Additional fix
Browse files Browse the repository at this point in the history
  • Loading branch information
jitendrapurohit committed Nov 11, 2016
1 parent a49de12 commit 408fe09
Showing 1 changed file with 31 additions and 5 deletions.
36 changes: 31 additions & 5 deletions CRM/Utils/QueryFormatter.php
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,17 @@ protected function _formatFts($text, $mode) {
*/
protected function _formatFtsBool($text, $mode) {
$result = NULL;
$operators = array('+', '-', '~', '(', ')');

//Return if searched string ends with an unsupported operator.
foreach ($operators as $val) {
if ($text == '@' || CRM_Utils_String::endsWith($text, $val)) {
$csid = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionValue', 'CRM_Contact_Form_Search_Custom_FullText', 'value', 'name');
$url = CRM_Utils_System::url("civicrm/contact/search/custom", "csid={$csid}&reset=1");
$operators = implode("', '", $operators);
CRM_Core_Error::statusBounce("InnoDB Full-Text Search does not support the use of a string ending with any of these operators ('{$operators}' or a single '@') in boolean mode. These invalid queries return a syntax error.", $url);
}
}

// normalize user-inputted wildcards
$text = str_replace('%', '*', $text);
Expand All @@ -309,7 +320,7 @@ protected function _formatFtsBool($text, $mode) {
else {
switch ($mode) {
case self::MODE_NONE:
$result = $this->mapWords($text, '+word');
$result = $this->mapWords($text, '+word', TRUE);
break;

case self::MODE_PHRASE:
Expand Down Expand Up @@ -380,21 +391,24 @@ protected function _formatLike($text, $mode) {
* User-supplied query string.
* @param string $template
* A prototypical description of each word, eg "word%" or "word*" or "*word*".
* @param bool $quotes
* True if each searched keyword need to be surrounded with quotes.
* @return string
*/
protected function mapWords($text, $template) {
protected function mapWords($text, $template, $quotes = FALSE) {
$result = array();
foreach ($this->parseWords($text) as $word) {
foreach ($this->parseWords($text, $quotes) as $word) {
$result[] = str_replace('word', $word, $template);
}
return implode(' ', $result);
}

/**
* @param $text
* @bool $quotes
* @return array
*/
protected function parseWords($text) {
protected function parseWords($text, $quotes) {
//NYSS 9692 special handling for emails
if (preg_match('/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/', $text)) {
$parts = explode('@', $text);
Expand All @@ -403,7 +417,19 @@ protected function parseWords($text) {
}

//NYSS also replace other occurrences of @
return explode(' ', preg_replace('/[ \r\n\t\@]+/', ' ', trim($text)));
$replacedText = preg_replace('/[ \r\n\t\@]+/', ' ', trim($text));
//filter empty values if any
$keywords = array_filter(explode(' ', $replacedText));

//Ensure each searched keywords are wrapped in double quotes.
if ($quotes) {
foreach ($keywords as &$val) {
if (!is_numeric($val)) {
$val = "\"{$val}\"";
}
}
}
return $keywords;
}

/**
Expand Down

0 comments on commit 408fe09

Please sign in to comment.