Advanced Search

SVN:b1162[5403]
This commit is contained in:
Eric Espié
2018-03-09 13:42:19 +00:00
parent 767507d195
commit 7d95c02b57
7 changed files with 52 additions and 24 deletions

View File

@@ -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;

View File

@@ -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";
}
}

View File

@@ -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';
}

View File

@@ -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)

View File

@@ -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);

View File

@@ -47,6 +47,9 @@
<testsuite name="Tickets">
<directory>itop-tickets</directory>
</testsuite>
<testsuite name="Application">
<directory>application</directory>
</testsuite>
</testsuites>
<!-- Code coverage white list -->

View File

@@ -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());
}
}