Advanced Search

Conversion to search form

SVN:b1162[5397]
This commit is contained in:
Eric Espié
2018-03-09 09:16:00 +00:00
parent 213d591eb0
commit 88b7ef5345
4 changed files with 155 additions and 12 deletions

View File

@@ -931,7 +931,10 @@ class FieldExpression extends UnaryExpression
$sSearchType = AttributeDefinition::SEARCH_WIDGET_TYPE;
}
return array('ref' => $this->GetParent().'.'.$this->GetName(), 'widget' => $sSearchType);
return array(
'widget' => $sSearchType,
'ref' => $this->GetParent().'.'.$this->GetName(),
);
}
}

View File

@@ -58,32 +58,36 @@ class CriterionToSearchForm extends CriterionConversionAbstract
protected static function TextToSearchForm($aCriteria)
{
$sOperator = $aCriteria['operator'];
$aValues = $aCriteria['values'];
$sValue = $aCriteria['values'][0]['value'];
$value = $aValues[0]['value'];
$bStartWithPercent = $value{0} == '%' ? true : false;
$bEndWithPercent = $value{0} == '%' ? true : false;
$bStartWithPercent = substr($sValue, 0, 1) == '%' ? true : false;
$bEndWithPercent = substr($sValue, -1) == '%' ? true : false;
switch (true)
{
case ('' == $value and ($sOperator == '=' or $sOperator == 'LIKE')):
case ('' == $sValue and ($sOperator == '=' or $sOperator == 'LIKE')):
$aCriteria['operator'] = CriterionConversionAbstract::OP_EMPTY;
break;
case ('' == $value and $sOperator == '!='):
case ('' == $sValue and $sOperator == '!='):
$aCriteria['operator'] = CriterionConversionAbstract::OP_NOT_EMPTY;
break;
case ($sOperator == 'LIKE' && $bStartWithPercent && $bEndWithPercent):
$aCriteria['operator'] = CriterionConversionAbstract::OP_CONTAINS;
$aValues[0]['value'] = substr($value, 1, strlen($value) - 2);
$sValue = substr($sValue, 1, -1);
$aCriteria['values'][0]['value'] = $sValue;
$aCriteria['values'][0]['label'] = $sValue;
break;
case ($sOperator == 'LIKE' && $bStartWithPercent):
$aCriteria['operator'] = CriterionConversionAbstract::OP_ENDS_WITH;
$aValues[0]['value'] = substr($value, 1, strlen($value) - 1);
$sValue = substr($sValue, 1);
$aCriteria['values'][0]['value'] = $sValue;
$aCriteria['values'][0]['label'] = $sValue;
break;
case ($sOperator == 'LIKE' && $bEndWithPercent):
$aCriteria['operator'] = CriterionConversionAbstract::OP_STARTS_WITH;
$aValues[0]['value'] = substr($value, 0, strlen($value) - 1);
$sValue = substr($sValue, 0, -1);
$aCriteria['values'][0]['value'] = $sValue;
$aCriteria['values'][0]['label'] = $sValue;
break;
}

View File

@@ -110,7 +110,7 @@ class SearchForm
$oBaseSearch = $oSearch->DeepClone();
$oBaseSearch->ResetCondition();
$sBaseOQL = $sBaseOql = str_replace(' WHERE 1', '', $oBaseSearch->ToOQL());
$sBaseOQL = str_replace(' WHERE 1', '', $oBaseSearch->ToOQL());
if (!isset($aExtraParams['table_id']))

View File

@@ -29,6 +29,7 @@
namespace Combodo\iTop\Test\UnitTest\Application\Search;
use Combodo\iTop\Application\Search\CriterionConversion\CriterionToOQL;
use Combodo\iTop\Application\Search\CriterionConversion\CriterionToSearchForm;
use Combodo\iTop\Test\UnitTest\ItopDataTestCase;
class CriterionConversionTest extends ItopDataTestCase
@@ -145,4 +146,139 @@ class CriterionConversionTest extends ItopDataTestCase
),
);
}
/**
* @dataProvider ToSearchFormProvider
*/
function testToSearchForm($aCriterion, $sExpectedOperator)
{
$aRes = CriterionToSearchForm::Convert($aCriterion);
$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'
),
);
}
}