Просмотр исходного кода

Optimizations: when displaying a "short" list, made of objects having the same status, three additional queries were made (now just one Group By query is made)

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@2977 a333f486-631f-4898-b8df-5754b55c2be0
romainq 11 лет назад
Родитель
Сommit
b290e09851
1 измененных файлов с 16 добавлено и 9 удалено
  1. 16 9
      application/displayblock.class.inc.php

+ 16 - 9
application/displayblock.class.inc.php

@@ -1435,17 +1435,21 @@ class MenuBlock extends DisplayBlock
 				if ((count($aStates) > 0) && (($iLimit == 0) || ($oSet->Count() < $iLimit)))
 				{
 					// Life cycle actions may be available... if all objects are in the same state
-					$oSet->Rewind();
-					$aStates = array();
-					while($oObj = $oSet->Fetch())
+					//
+					// Group by <state>
+					$oGroupByExp = new FieldExpression(MetaModel::GetStateAttributeCode($sClass), $this->m_oFilter->GetClassAlias());
+					$aGroupBy = array('__state__' => $oGroupByExp);
+					$aQueryParams = array();
+					if (isset($aExtraParams['query_params']))
 					{
-						$aStates[$oObj->GetState()] = $oObj->GetState();
+						$aQueryParams = $aExtraParams['query_params'];
 					}
-					$oSet->Rewind();
-					if (count($aStates) == 1)
+					$sSql = MetaModel::MakeGroupByQuery($this->m_oFilter, $aQueryParams, $aGroupBy);
+					$aRes = CMDBSource::QueryToArray($sSql);
+					if (count($aRes) == 1)
 					{
 						// All objects are in the same state...
-						$sState = array_pop($aStates);
+						$sState = $aRes[0]['__state__'];
 						$aTransitions = Metamodel::EnumTransitions($sClass, $sState);
 						if (count($aTransitions))
 						{
@@ -1453,8 +1457,11 @@ class MenuBlock extends DisplayBlock
 							$aStimuli = Metamodel::EnumStimuli($sClass);
 							foreach($aTransitions as $sStimulusCode => $aTransitionDef)
 							{
-								$oChecker = new StimulusChecker($this->m_oFilter, $sState, $sStimulusCode);
-								$iActionAllowed = (get_class($aStimuli[$sStimulusCode]) == 'StimulusUserAction') ? $oChecker->IsAllowed() : UR_ALLOWED_NO;
+								$oSet->Rewind();
+								// As soon as the user rights implementation will browse the object set,
+								// then we might consider using OptimizeColumnLoad() here
+								$iActionAllowed = UserRights::IsStimulusAllowed($sClass, $sStimulusCode, $oSet);
+								$iActionAllowed = (get_class($aStimuli[$sStimulusCode]) == 'StimulusUserAction') ? $iActionAllowed : UR_ALLOWED_NO;
 								switch($iActionAllowed)
 								{
 									case UR_ALLOWED_YES: