diff --git a/core/oql/expression.class.inc.php b/core/oql/expression.class.inc.php index dd3a73192..2cea667be 100644 --- a/core/oql/expression.class.inc.php +++ b/core/oql/expression.class.inc.php @@ -960,6 +960,7 @@ class FieldExpression extends UnaryExpression */ public function GetCriterion($oSearch, &$aArgs = null, $bRetrofitParams = false, $oAttDef = null) { + $oAttDef = $this->GetAttDef($oSearch->GetJoinedClasses()); if (!is_null($oAttDef)) { $sSearchType = $oAttDef->GetSearchType(); @@ -968,7 +969,6 @@ class FieldExpression extends UnaryExpression { $sSearchType = AttributeDefinition::SEARCH_WIDGET_TYPE; } - return array( 'widget' => $sSearchType, 'ref' => $this->GetParent().'.'.$this->GetName(), @@ -1532,25 +1532,35 @@ class FunctionExpression extends Expression public function GetCriterion($oSearch, &$aArgs = null, $bRetrofitParams = false, $oAttDef = null) { - if ($this->m_sVerb != 'DATE_SUB' && $this->m_sVerb != 'DATE_ADD' && $this->m_sVerb != 'NOW') + $aCriteria = array(); + switch ($this->m_sVerb) { - return parent::GetCriterion($oSearch, $aArgs, $bRetrofitParams, $oAttDef); - } + case 'ISNULL': + $aCriteria['operator'] = $this->m_sVerb; + foreach($this->m_aArgs as $oExpression) + { + $aCriteria = array_merge($oExpression->GetCriterion($oSearch, $aArgs, $bRetrofitParams, $oAttDef), $aCriteria); + } + break; - $aCriteria = array('widget' => 'date_time'); + case 'NOW': + $aCriteria = array('widget' => 'date_time'); + $aCriteria['is_relative'] = true; + $aCriteria['verb'] = $this->m_sVerb; + break; - foreach($this->m_aArgs as $oExpression) - { - $aCriteria = array_merge($oExpression->GetCriterion($oSearch, $aArgs, $bRetrofitParams, $oAttDef), $aCriteria); - } + case 'DATE_ADD': + case 'DATE_SUB': + $aCriteria = array('widget' => 'date_time'); + foreach($this->m_aArgs as $oExpression) + { + $aCriteria = array_merge($oExpression->GetCriterion($oSearch, $aArgs, $bRetrofitParams, $oAttDef), $aCriteria); + } + $aCriteria['verb'] = $this->m_sVerb; + break; - if ($this->m_sVerb == 'NOW') - { - $aCriteria['is_relative'] = true; - } - else - { - $aCriteria['verb'] = $this->m_sVerb; + default: + return parent::GetCriterion($oSearch, $aArgs, $bRetrofitParams, $oAttDef); } return $aCriteria; diff --git a/sources/application/search/criterionconversion/criteriontooql.class.inc.php b/sources/application/search/criterionconversion/criteriontooql.class.inc.php index c4fb75e4c..b341c103d 100644 --- a/sources/application/search/criterionconversion/criteriontooql.class.inc.php +++ b/sources/application/search/criterionconversion/criteriontooql.class.inc.php @@ -122,6 +122,10 @@ class CriterionToOQL extends CriterionConversionAbstract protected static function EmptyToOql($sRef, $aCriteria) { + if ($aCriteria['widget'] == AttributeDefinition::SEARCH_WIDGET_TYPE_NUMERIC) + { + return "ISNULL({$sRef})"; + } return "({$sRef} = '')"; } diff --git a/sources/application/search/criterionconversion/criteriontosearchform.class.inc.php b/sources/application/search/criterionconversion/criteriontosearchform.class.inc.php index 73ff8ffb4..a376eab97 100644 --- a/sources/application/search/criterionconversion/criteriontosearchform.class.inc.php +++ b/sources/application/search/criterionconversion/criteriontosearchform.class.inc.php @@ -59,6 +59,7 @@ class CriterionToSearchForm extends CriterionConversionAbstract AttributeDefinition::SEARCH_WIDGET_TYPE_ENUM => 'EnumToSearchForm', AttributeDefinition::SEARCH_WIDGET_TYPE_DATE => 'DateToSearchForm', AttributeDefinition::SEARCH_WIDGET_TYPE_DATE_TIME => 'DateTimeToSearchForm', + AttributeDefinition::SEARCH_WIDGET_TYPE_NUMERIC => 'NumericToSearchForm', ); foreach($aAndCriterionRaw as $aCriteria) @@ -374,4 +375,16 @@ class CriterionToSearchForm extends CriterionConversionAbstract return $aCriteria; } + + protected static function NumericToSearchForm($aCriteria, $aFields) + { + if ($aCriteria['operator'] == 'ISNULL') + { + $aCriteria['operator'] = CriterionConversionAbstract::OP_EMPTY; + } + + return $aCriteria; + } + + } \ No newline at end of file diff --git a/test/application/search/CriterionConversionTest.php b/test/application/search/CriterionConversionTest.php index e0d20636a..8c77d32c3 100644 --- a/test/application/search/CriterionConversionTest.php +++ b/test/application/search/CriterionConversionTest.php @@ -339,6 +339,7 @@ class CriterionConversionTest extends ItopDataTestCase function OqlProvider() { return array( + array('OQL' => "SELECT Server WHERE ISNULL(nb_u)"), array('OQL' => "SELECT Contact WHERE status = 'active'"), array('OQL' => "SELECT Contact WHERE status = 'active' AND name LIKE 'toto%'"), array('OQL' => "SELECT Contact WHERE status = 'active' AND org_id = 3"), @@ -350,6 +351,7 @@ class CriterionConversionTest extends ItopDataTestCase array('OQL' => "SELECT UserRequest WHERE start_date >= '2017-01-01 00:00:00' AND '2017-01-01 00:00:00' >= start_date"), array('OQL' => "SELECT UserRequest WHERE start_date >= '2017-01-01 00:00:00' AND '2017-01-01 01:00:00' > start_date"), array('OQL' => "SELECT UserRequest WHERE start_date >= '2017-01-01 00:00:00' AND '2017-01-02 00:00:00' > start_date"), + ); } }