mirror of
https://github.com/Combodo/iTop.git
synced 2026-04-20 00:58:48 +02:00
Advanced Search
SVN:b1162[5403]
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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';
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -99,11 +99,9 @@ class SearchForm
|
||||
$sHtml .= "<div id=\"fs_{$sSearchFormId}_criterion_outer\">\n";
|
||||
$sHtml .= "</div>\n";
|
||||
|
||||
|
||||
$sPrimaryClassName = $oSet->GetClass();
|
||||
$sPrimaryClassAlias = $oSet->GetClassAlias();
|
||||
|
||||
|
||||
$aFields = self::GetFields($sPrimaryClassName, $sPrimaryClassAlias);
|
||||
$oSearch = $oSet->GetFilter();
|
||||
$aCriterion = self::GetCriterion($oSearch);
|
||||
|
||||
@@ -47,6 +47,9 @@
|
||||
<testsuite name="Tickets">
|
||||
<directory>itop-tickets</directory>
|
||||
</testsuite>
|
||||
<testsuite name="Application">
|
||||
<directory>application</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
|
||||
<!-- Code coverage white list -->
|
||||
|
||||
@@ -78,10 +78,10 @@ class CriterionParserTest extends ItopDataTestCase
|
||||
]
|
||||
}
|
||||
', true);
|
||||
$sOQL = CriterionParser::Parse($sBaseOql, $aCriterion);
|
||||
$oSearch = CriterionParser::Parse($sBaseOql, $aCriterion);
|
||||
|
||||
$this->debug($sOQL);
|
||||
//$this->debug($oSearch);
|
||||
|
||||
$this->assertEquals("SELECT `UserRequest` FROM UserRequest AS `UserRequest` WHERE ((`UserRequest`.`start_date` > '2017-01-01') AND (`UserRequest`.`start_date` < '2018-01-01'))", $sOQL);
|
||||
$this->assertEquals("SELECT `UserRequest` FROM UserRequest AS `UserRequest` WHERE ((`UserRequest`.`start_date` > '2017-01-01') AND (`UserRequest`.`start_date` < '2018-01-01'))", $oSearch->ToOQL());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user