* */ /** * Created by PhpStorm. * User: Eric * Date: 08/03/2018 * Time: 16:46 */ namespace Combodo\iTop\Test\UnitTest\Application\Search; use Combodo\iTop\Application\Search\CriterionConversion\CriterionToOQL; use Combodo\iTop\Application\Search\CriterionConversion\CriterionToSearchForm; use Combodo\iTop\Application\Search\CriterionParser; use Combodo\iTop\Application\Search\SearchForm; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; class CriterionConversionTest extends ItopDataTestCase { /** * @throws \Exception */ protected function setUp() { parent::setUp(); require_once(APPROOT."sources/application/search/criterionconversionabstract.class.inc.php"); } /** * @dataProvider ToOqlProvider * * @param $sJSONCriterion * @param $sExpectedOQL */ public function testToOql($sJSONCriterion, $sExpectedOQL) { $sOql = CriterionToOQL::Convert( json_decode($sJSONCriterion, true) ); $this->debug($sOql); $this->assertEquals($sExpectedOQL, $sOql); } public function ToOqlProvider() { return array( '>' => array( '{ "ref": "UserRequest.start_date", "values": [ { "value": "2017-01-01", "label": "2017-01-01 00:00:00" } ], "operator": ">", "oql": "" }', "(`UserRequest`.`start_date` > '2017-01-01')" ), 'contains' => array( '{ "ref": "Contact.name", "values": [ { "value": "toto", "label": "toto" } ], "operator": "contains", "oql": "" }', "(`Contact`.`name` LIKE '%toto%')" ), 'starts_with' => array( '{ "ref": "Contact.name", "values": [ { "value": "toto", "label": "toto" } ], "operator": "starts_with", "oql": "" }', "(`Contact`.`name` LIKE 'toto%')" ), 'ends_with' => array( '{ "ref": "Contact.name", "values": [ { "value": "toto", "label": "toto" } ], "operator": "ends_with", "oql": "" }', "(`Contact`.`name` LIKE '%toto')" ), 'empty' => array( '{ "ref": "Contact.name", "values": [ { "value": "", "label": "" } ], "operator": "empty", "oql": "" }', "(`Contact`.`name` = '')" ), 'not_empty' => array( '{ "ref": "Contact.name", "values": [ { "value": "", "label": "" } ], "operator": "not_empty", "oql": "" }', "(`Contact`.`name` != '')" ), ); } /** * @dataProvider ToSearchFormProvider * * @param $aCriterion * @param $sExpectedOperator * * @throws \OQLException */ function testToSearchForm($aCriterion, $sExpectedOperator) { $oSearchForm = new SearchForm(); $oSearch = \DBSearch::FromOQL("SELECT Contact"); $aFields = $oSearchForm->GetFields(new \DBObjectSet($oSearch)); $aRes = CriterionToSearchForm::Convert($aCriterion, $aFields); $this->debug($aRes); $this->assertEquals($sExpectedOperator, $aRes[0]['operator']); } function ToSearchFormProvider() { return array( '=' => array( json_decode('[ { "ref": "Contact.name", "widget": "string", "values": [ { "value": "toto", "label": "toto" } ], "operator": "=", "oql": "(`Contact`.`name` = \'toto\')" } ]', true), '=' ), 'starts_with' => array( json_decode('[ { "ref": "Contact.name", "widget": "string", "values": [ { "value": "toto%", "label": "toto%" } ], "operator": "LIKE", "oql": "(`Contact`.`name` LIKE \'toto%\')" } ]', true), 'starts_with' ), 'ends_with' => array( json_decode('[ { "ref": "Contact.name", "widget": "string", "values": [ { "value": "%toto", "label": "%toto" } ], "operator": "LIKE", "oql": "(`Contact`.`name` LIKE \'%toto\')" } ]', true), 'ends_with' ), 'contains' => array( json_decode('[ { "widget": "string", "ref": "Contact.name", "values": [ { "value": "%toto%", "label": "%toto%" } ], "operator": "LIKE", "oql": "(`Contact`.`name` LIKE \'%toto%\')" } ]', true), 'contains' ), 'empty1' => array( json_decode('[ { "widget": "string", "ref": "Contact.name", "values": [ { "value": "", "label": "" } ], "operator": "LIKE", "oql": "(`Contact`.`name` LIKE \'\')" } ]', true), 'empty' ), 'empty2' => array( json_decode('[ { "widget": "string", "ref": "Contact.name", "values": [ { "value": "", "label": "" } ], "operator": "=", "oql": "(`Contact`.`name` = \'\')" } ]', true), 'empty' ), 'not_empty' => array( json_decode('[ { "widget": "string", "ref": "Contact.name", "values": [ { "value": "", "label": "" } ], "operator": "!=", "oql": "(`Contact`.`name` != \'\')" } ]', true), 'not_empty' ), ); } /** * @dataProvider OqlProvider * * @param $sOQL * * @throws \OQLException */ function testOqlToForSearchToOql($sOQL) { $this->debug($sOQL); $oSearchForm = new SearchForm(); $oSearch = \DBSearch::FromOQL($sOQL); $aFields = $oSearchForm->GetFields(new \DBObjectSet($oSearch)); $aCriterion = $oSearchForm->GetCriterion($oSearch, $aFields); $aAndCriterion = $aCriterion['or'][0]['and']; $aNewCriterion = array(); foreach($aAndCriterion as $aCriteria) { if ($aCriteria['widget'] != \AttributeDefinition::SEARCH_WIDGET_TYPE_RAW) { unset($aCriteria['oql']); if (isset($aFields['zlist'][$aCriteria['ref']])) { $aField = $aFields['zlist'][$aCriteria['ref']]; } else { $aField = $aFields['others'][$aCriteria['ref']]; } $aCriteria['code'] = $aField['code']; $aCriteria['class'] = $aField['class']; } $aNewCriterion[] = $aCriteria; } $this->debug($aNewCriterion); $aCriterion['or'][0]['and'] = $aNewCriterion; $oSearch->ResetCondition(); $oFilter = CriterionParser::Parse($oSearch->ToOQL(), $aCriterion); $this->debug($oFilter->ToOQL()); $this->assertTrue(true); } function OqlProvider() { return array( 'ISNULL' => array('OQL' => "SELECT Server WHERE ISNULL(nb_u)"), 'start' => array('OQL' => "SELECT Contact WHERE status = 'active' AND name LIKE 'toto%'"), 'enum + key =' => array('OQL' => "SELECT Contact WHERE status = 'active' AND org_id = 3"), 'enum =' => array('OQL' => "SELECT Contact WHERE status = 'active'"), 'enum IN' => array('OQL' => "SELECT Contact WHERE status IN ('active', 'inactive')"), 'enum NOT IN' => array('OQL' => "SELECT Contact WHERE status NOT IN ('active')"), 'key NOT IN' => array('OQL' => "SELECT Contact WHERE org_id NOT IN ('1')"), 'key IN' => array('OQL' => "SELECT Contact WHERE org_id IN ('1')"), 'Date relative' => array('OQL' => "SELECT UserRequest WHERE DATE_SUB(NOW(), INTERVAL 14 DAY) < start_date"), 'Date between 1' => array('OQL' => "SELECT UserRequest WHERE start_date > '2017-01-01 00:00:00' AND '2018-01-01 00:00:00' >= start_date"), 'Date between 2' => array('OQL' => "SELECT UserRequest WHERE start_date > '2017-01-01 00:00:00' AND status = 'active' AND org_id = 3 AND '2018-01-01 00:00:00' >= start_date"), 'Date between 3' => array('OQL' => "SELECT UserRequest WHERE start_date >= '2017-01-01 00:00:00' AND '2017-01-01 00:00:00' >= start_date"), 'Date between 4' => array('OQL' => "SELECT UserRequest WHERE start_date >= '2017-01-01 00:00:00' AND '2017-01-01 01:00:00' > start_date"), 'Date between 5' => array('OQL' => "SELECT UserRequest WHERE start_date >= '2017-01-01 00:00:00' AND '2017-01-02 00:00:00' > start_date"), 'Date between 6' => array('OQL' => "SELECT UserRequest WHERE start_date >= '2017-01-01' AND '2017-01-02' >= start_date"), 'Date between 7' => array('OQL' => "SELECT CustomerContract WHERE ((start_date >= '2018-03-01') AND (start_date < '2018-04-01'))"), 'Date =' => array('OQL' => "SELECT CustomerContract WHERE (start_date = '2018-03-01')"), 'Date =2' => array('OQL' => "SELECT UserRequest WHERE (DATE_FORMAT(start_date, '%Y-%m-%d') = '2018-03-21')"), 'Num between 1' => array('OQL' => "SELECT Server WHERE nb_u >= 0 AND 1 >= nb_u"), ); } }