* */ /** * Created by PhpStorm. * User: Eric * Date: 08/03/2018 * Time: 11:25 */ namespace Combodo\iTop\Application\Search; use DBObjectSearch; use IssueLog; use OQLException; class CriterionParser { /** * @param $sBaseOql * @param $aCriterion * * @return string */ public static function Parse($sBaseOql, $aCriterion) { $aExpression = array(); $aOr = $aCriterion['or']; foreach($aOr as $aAndList) { $sExpression = self::ParseAndList($aAndList['and']); if (!empty($sExpression)) { $aExpression[] = $sExpression; } } if (empty($aExpression)) { return $sBaseOql; } // Sanitize the base OQL if (strpos($sBaseOql, ' WHERE ')) { try { $oSearch = DBObjectSearch::FromOQL($sBaseOql); $oSearch->ResetCondition(); $sBaseOql = $oSearch->ToOQL(); } catch (OQLException $e) { IssueLog::Error($e->getMessage()); } } return $sBaseOql.' WHERE '.implode(" OR ", $aExpression).''; } private static function ParseAndList($aAnd) { $aExpression = array(); foreach($aAnd as $aCriteria) { $aExpression[] = self::ParseCriteria($aCriteria); } if (empty($aExpression)) { return ''; } return '('.implode(" AND ", $aExpression).')'; } private static function ParseCriteria($aCriteria) { if (!empty($aCriteria['oql'])) { return $aCriteria['oql']; } // TODO Manage more complicated case $aRef = explode('.', $aCriteria['ref']); $sRef = '`'.$aRef[0].'`.`'.$aRef[1].'`'; $sOperator = $aCriteria['operator']; $sValue = $aCriteria['values'][0]['value']; return "({$sRef} {$sOperator} '{$sValue}')"; } }