diff --git a/pages/ajax.searchform.php b/pages/ajax.searchform.php index a2a6d309e..343a54e21 100644 --- a/pages/ajax.searchform.php +++ b/pages/ajax.searchform.php @@ -50,8 +50,7 @@ try $oPage->SetContentType('text/html'); $aParams = json_decode($sParams, true); - $sOQL = CriterionParser::Parse($aParams['base_oql'], $aParams['criterion']); - $oFilter = DBSearch::FromOQL($sOQL); + $oFilter = CriterionParser::Parse($aParams['base_oql'], $aParams['criterion']); $oDisplayBlock = new DisplayBlock($oFilter, 'list', false); $aExtraParams['display_limit'] = true; diff --git a/sources/application/search/criterionconversion/criteriontooql.class.inc.php b/sources/application/search/criterionconversion/criteriontooql.class.inc.php index bf6e39854..036124f2f 100644 --- a/sources/application/search/criterionconversion/criteriontooql.class.inc.php +++ b/sources/application/search/criterionconversion/criteriontooql.class.inc.php @@ -50,37 +50,60 @@ class CriterionToOQL extends CriterionConversionAbstract self::OP_ENDS_WITH => 'EndsWithToOql', self::OP_EMPTY => 'EmptyToOql', self::OP_NOT_EMPTY => 'NotEmptyToOql', + self::OP_ALL => 'AllToOql', ); if (array_key_exists($sOperator, $aMappedOperators)) { $sFct = $aMappedOperators[$sOperator]; - return self::$sFct($sRef, $sOperator, $aCriteria['values']); + return self::$sFct($sRef, $sOperator, self::GetValues($aCriteria)); } - $sValue = $aCriteria['values'][0]['value']; + $sValue = self::GetValue(self::GetValues($aCriteria), 0); return "({$sRef} {$sOperator} '{$sValue}')"; } + private static function GetValues($aCriteria) + { + if (!array_key_exists('values', $aCriteria)) + { + return array(); + } + return $aCriteria['values']; + } + + private static function GetValue($aValues, $iIndex) + { + if (!array_key_exists($iIndex, $aValues)) + { + return null; + } + if (!array_key_exists('value', $aValues[$iIndex])) + { + return null; + } + return $aValues[$iIndex]['value']; + } + protected static function ContainsToOql($sRef, $sOperator, $aValues) { - $sValue = $aValues[0]['value']; + $sValue = self::GetValue($aValues, 0); return "({$sRef} LIKE '%{$sValue}%')"; } protected static function StartsWithToOql($sRef, $sOperator, $aValues) { - $sValue = $aValues[0]['value']; + $sValue = self::GetValue($aValues, 0); return "({$sRef} LIKE '{$sValue}%')"; } protected static function EndsWithToOql($sRef, $sOperator, $aValues) { - $sValue = $aValues[0]['value']; + $sValue = self::GetValue($aValues, 0); return "({$sRef} LIKE '%{$sValue}')"; } @@ -95,4 +118,9 @@ class CriterionToOQL extends CriterionConversionAbstract return "({$sRef} != '')"; } + protected static function AllToOql($sRef, $sOperator, $aValues) + { + return "1"; + } + } \ No newline at end of file diff --git a/sources/application/search/criterionconversionabstract.class.inc.php b/sources/application/search/criterionconversionabstract.class.inc.php index d8f901874..04ede456b 100644 --- a/sources/application/search/criterionconversionabstract.class.inc.php +++ b/sources/application/search/criterionconversionabstract.class.inc.php @@ -31,7 +31,7 @@ abstract class CriterionConversionAbstract const OP_ENDS_WITH = 'ends_with'; const OP_EMPTY = 'empty'; const OP_NOT_EMPTY = 'not_empty'; - + const OP_ALL = 'all'; } diff --git a/sources/application/search/criterionparser.class.inc.php b/sources/application/search/criterionparser.class.inc.php index 3ae4748f2..4aaa58b86 100644 --- a/sources/application/search/criterionparser.class.inc.php +++ b/sources/application/search/criterionparser.class.inc.php @@ -41,7 +41,7 @@ class CriterionParser * @param $sBaseOql * @param $aCriterion * - * @return string + * @return \DBSearch */ public static function Parse($sBaseOql, $aCriterion) { @@ -57,24 +57,24 @@ class CriterionParser } } - if (empty($aExpression)) - { - return $sBaseOql; - } - - // Sanitize the base OQL try { $oSearch = DBObjectSearch::FromOQL($sBaseOql); + if (empty($aExpression)) + { + return $oSearch; + } + $oSearch->ResetCondition(); - $sBaseOql = str_replace(' WHERE 1', '', $oSearch->ToOQL()); + $oExpression = \Expression::FromOQL(implode(" OR ", $aExpression)); + $oSearch->AddConditionExpression($oExpression); + + return $oSearch; } catch (OQLException $e) { IssueLog::Error($e->getMessage()); } - - - return $sBaseOql.' WHERE '.implode(" OR ", $aExpression).''; + return null; } private static function ParseAndList($aAnd) diff --git a/sources/application/search/searchform.class.inc.php b/sources/application/search/searchform.class.inc.php index 57c56b4ec..701c0a875 100644 --- a/sources/application/search/searchform.class.inc.php +++ b/sources/application/search/searchform.class.inc.php @@ -99,11 +99,9 @@ class SearchForm $sHtml .= "