diff --git a/sources/application/search/criterionconversion/criteriontooql.class.inc.php b/sources/application/search/criterionconversion/criteriontooql.class.inc.php index a565f5d3d6..cc8b69fd28 100644 --- a/sources/application/search/criterionconversion/criteriontooql.class.inc.php +++ b/sources/application/search/criterionconversion/criteriontooql.class.inc.php @@ -25,6 +25,7 @@ namespace Combodo\iTop\Application\Search\CriterionConversion; use AttributeDateTime; use AttributeDefinition; +use AttributeExternalKey; use Combodo\iTop\Application\Search\AjaxSearchException; use Combodo\iTop\Application\Search\CriterionConversionAbstract; use Combodo\iTop\Application\Search\SearchForm; @@ -149,6 +150,8 @@ class CriterionToOQL extends CriterionConversionAbstract return "1"; } + $bFilterOnUndefined = false; + $sFilterOnUndefined = ''; try { $aAttributeDefs = \MetaModel::ListAttributeDefs($sClass); @@ -182,6 +185,25 @@ class CriterionToOQL extends CriterionConversionAbstract } } } + // search for "undefined" + for ($i = 0; $i < count($aValues); $i++) + { + $aValue = $aValues[$i]; + if (isset($aValue['value']) && ($aValue['value'] === 'null')) + { + if ($oAttDef instanceof AttributeExternalKey) + { + $sFilterOnUndefined = "({$sRef} = 0)"; + } + else + { + $sFilterOnUndefined = "ISNULL({$sRef})"; + } + $bFilterOnUndefined = true; + unset($aValues[$i]); + break; + } + } } } } catch (\CoreException $e) @@ -195,6 +217,21 @@ class CriterionToOQL extends CriterionConversionAbstract } $sInList = implode("','", $aInValues); + if ($bFilterOnUndefined) + { + if (count($aValues) === 0) + { + return "{$sFilterOnUndefined}"; + } + + if (count($aInValues) == 1) + { + return "(({$sRef} = '$sInList') OR {$sFilterOnUndefined})"; + } + + return "({$sRef} IN ('$sInList') OR {$sFilterOnUndefined})"; + } + if (count($aInValues) == 1) { return "({$sRef} = '$sInList')";