Bladeren bron

#675 Error when drilling down on graph/pie/table with group by on a field that can be null (this case has been excluded)

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@2624 a333f486-631f-4898-b8df-5754b55c2be0
romainq 12 jaren geleden
bovenliggende
commit
5aec4ed4c5
2 gewijzigde bestanden met toevoegingen van 24 en 6 verwijderingen
  1. 5 4
      application/displayblock.class.inc.php
  2. 19 2
      core/metamodel.class.php

+ 5 - 4
application/displayblock.class.inc.php

@@ -395,7 +395,7 @@ class DisplayBlock
 
 				$aGroupBy = array();
 				$aGroupBy['grouped_by_1'] = $oGroupByExp;
-				$sSql = MetaModel::MakeGroupByQuery($this->m_oFilter, $aQueryParams, $aGroupBy);
+				$sSql = MetaModel::MakeGroupByQuery($this->m_oFilter, $aQueryParams, $aGroupBy, true);
 				$aRes = CMDBSource::QueryToArray($sSql);
 
 				$aGroupBy = array();
@@ -893,7 +893,7 @@ EOF
 
 				$aGroupBy = array();
 				$aGroupBy['grouped_by_1'] = $oGroupByExp;
-				$sSql = MetaModel::MakeGroupByQuery($this->m_oFilter, $aQueryParams, $aGroupBy);
+				$sSql = MetaModel::MakeGroupByQuery($this->m_oFilter, $aQueryParams, $aGroupBy, true);
 				$aRes = CMDBSource::QueryToArray($sSql);
 
 				$aGroupBy = array();
@@ -968,7 +968,7 @@ EOF
 	
 					$aGroupBy = array();
 					$aGroupBy['grouped_by_1'] = $oGroupByExp;
-					$sSql = MetaModel::MakeGroupByQuery($this->m_oFilter, $aQueryParams, $aGroupBy);
+					$sSql = MetaModel::MakeGroupByQuery($this->m_oFilter, $aQueryParams, $aGroupBy, true);
 					$aRes = CMDBSource::QueryToArray($sSql);
 	
 					$aGroupBy = array();
@@ -1049,7 +1049,8 @@ EOF
 	
 					$aGroupBy = array();
 					$aGroupBy['grouped_by_1'] = $oGroupByExp;
-					$sSql = MetaModel::MakeGroupByQuery($this->m_oFilter, $aQueryParams, $aGroupBy);
+
+					$sSql = MetaModel::MakeGroupByQuery($this->m_oFilter, $aQueryParams, $aGroupBy, true);
 					$aRes = CMDBSource::QueryToArray($sSql);
 	
 					$aGroupBy = array();

+ 19 - 2
core/metamodel.class.php

@@ -2076,10 +2076,27 @@ abstract class MetaModel
 		return $aScalarArgs;
 	}
 
-	public static function MakeGroupByQuery(DBObjectSearch $oFilter, $aArgs, $aGroupByExpr)
+	public static function MakeGroupByQuery(DBObjectSearch $oFilter, $aArgs, $aGroupByExpr, $bExcludeNullValues = false)
 	{
 		$aAttToLoad = array();
-		$oSelect = self::MakeSelectStructure($oFilter, array(), $aArgs, $aAttToLoad, null, 0, 0, false, $aGroupByExpr);
+
+		if ($bExcludeNullValues)
+		{
+			// Null values are not handled (though external keys set to 0 are allowed)
+			$oQueryFilter = $oFilter->DeepClone();
+			foreach ($aGroupByExpr as $oGroupByExp)
+			{
+				$oNull = new FunctionExpression('ISNULL', array($oGroupByExp));
+				$oNotNull = new BinaryExpression($oNull, '!=', new TrueExpression());
+				$oQueryFilter->AddConditionExpression($oNotNull);
+			}
+		}
+		else
+		{
+			$oQueryFilter = $oFilter;
+		}
+
+		$oSelect = self::MakeSelectStructure($oQueryFilter, array(), $aArgs, $aAttToLoad, null, 0, 0, false, $aGroupByExpr);
 
 		$aScalarArgs = array_merge(self::PrepareQueryArguments($aArgs), $oFilter->GetInternalParams());
 		try