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)

SVN:trunk[2977]
This commit is contained in:
Romain Quetiez
2013-11-21 16:15:37 +00:00
parent 8c702a42e9
commit e48716753d

View File

@@ -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: