From 324cb5eb6c6519644c528e6b401486f2498eb751 Mon Sep 17 00:00:00 2001 From: Anne-Catherine <57360138+accognet@users.noreply.github.com> Date: Mon, 9 Dec 2024 15:15:33 +0100 Subject: [PATCH] =?UTF-8?q?N=C2=B07636=20-=20Too=20many=20OQL=20requests?= =?UTF-8?q?=20executed=20in=20order=20to=20display=20a=20lnk=20(#661)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/cmdbabstract.class.inc.php | 14 +++++----- application/displayblock.class.inc.php | 8 +++++- core/metamodel.class.php | 2 +- .../Links/AbstractBlockLinkSetViewTable.php | 10 +++++-- sources/Controller/AjaxRenderController.php | 8 +++++- .../unitary-tests/core/DBObjectTest.php | 26 +++++++++++++++++++ 6 files changed, 56 insertions(+), 12 deletions(-) diff --git a/application/cmdbabstract.class.inc.php b/application/cmdbabstract.class.inc.php index cc6122a11..0213896a1 100644 --- a/application/cmdbabstract.class.inc.php +++ b/application/cmdbabstract.class.inc.php @@ -698,10 +698,10 @@ HTML $sLinkedClass = $oAttDef->GetLinkedClass(); // Filter out links pointing to obsolete objects (if relevant) - $oOrmLinkSet = $this->Get($sAttCode); - $oLinkSet = $oOrmLinkSet->ToDBObjectSet(utils::ShowObsoleteData()); + $oOrmLinkSet = $this->Get($sAttCode); + $oLinkSet = $oOrmLinkSet->ToDBObjectSet(utils::ShowObsoleteData()); + $iCount = $oLinkSet->Count(); - $iCount = $oLinkSet->Count(); if ($this->IsNew()) { $iFlags = $this->GetInitialStateAttributeFlags($sAttCode); } else { @@ -766,9 +766,9 @@ HTML $oPage->add($sHTMLValue); } else { if ($oAttDef->IsIndirect()) { - $oBlockLinkSetViewTable = new BlockIndirectLinkSetViewTable($oPage, $this, $sClass, $sAttCode, $oAttDef, $bReadOnly); + $oBlockLinkSetViewTable = new BlockIndirectLinkSetViewTable($oPage, $this, $sClass, $sAttCode, $oAttDef, $bReadOnly, $iCount); } else { - $oBlockLinkSetViewTable = new BlockDirectLinkSetViewTable($oPage, $this, $sClass, $sAttCode, $oAttDef, $bReadOnly); + $oBlockLinkSetViewTable = new BlockDirectLinkSetViewTable($oPage, $this, $sClass, $sAttCode, $oAttDef, $bReadOnly, $iCount); } $oPage->AddUiBlock($oBlockLinkSetViewTable); } @@ -5190,7 +5190,7 @@ HTML $aKeys = array_keys($aValues[$sAttCode]); $currValue = $aKeys[0]; // The only value is the first key if ($oAttDef->GetEditClass() == 'LinkedSet') { - $oOrmLinkSet = $oDummyObj->Get($sAttCode); + $oOrmLinkSet = $oDummyObj->Get($sAttCode); LinkSetDataTransformer::StringToOrmLinkSet($aValues[$sAttCode][$currValue]['edit_value'], $oOrmLinkSet); } else { @@ -5244,7 +5244,7 @@ HTML } $oDummyObj->Set($sAttCode, $oTagSet); } else if ($oAttDef->GetEditClass() == 'LinkedSet') { - $oOrmLinkSet = $oDummyObj->Get($sAttCode); + $oOrmLinkSet = $oDummyObj->Get($sAttCode); foreach ($aMultiValues as $key => $sValue) { LinkSetDataTransformer::StringToOrmLinkSet($sValue['edit_value'], $oOrmLinkSet); } diff --git a/application/displayblock.class.inc.php b/application/displayblock.class.inc.php index 2bdc4ed09..68b2ce516 100644 --- a/application/displayblock.class.inc.php +++ b/application/displayblock.class.inc.php @@ -263,6 +263,8 @@ class DisplayBlock /** param for export.php */ 'refresh_action', /**to add refresh button in datatable*/ + 'object_count', + /** int number of objects in list */ ], DataTableUIBlockFactory::GetAllowedParams()), static::ENUM_STYLE_LIST_SEARCH => array_merge([ 'update_history', @@ -1860,7 +1862,11 @@ class MenuBlock extends DisplayBlock $aSelectedClasses = $this->GetFilter()->GetSelectedClasses(); $bIsForLinkset = isset($aExtraParams['target_attr']); $oSet = new CMDBObjectSet($this->GetFilter()); - $iSetCount = $oSet->Count(); + if(isset($aExtraParams['object_count'])){ + $iSetCount = $aExtraParams['object_count']; + } else { + $iSetCount = $oSet->Count(); + } /** @var string $sRefreshAction JS snippet to run when clicking on the refresh button of the menu */ $sRefreshAction = $aExtraParams['refresh_action'] ?? ''; $bIsCreationInModal = isset($aExtraParams['creation_in_modal']) && $aExtraParams['creation_in_modal'] === true; diff --git a/core/metamodel.class.php b/core/metamodel.class.php index 08a503065..f1ad9ac33 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -7112,7 +7112,7 @@ abstract class MetaModel if ($iKey < 0) { return "$sTargetClass: $iKey (invalid value)"; } - $oObj = self::GetObject($sTargetClass, $iKey, false); + $oObj = self::GetObject($sTargetClass, $iKey, false); if (is_null($oObj)) { // Whatever we are looking for, the root class is the key to search for $sRootClass = self::GetRootClass($sTargetClass); diff --git a/sources/Application/UI/Links/AbstractBlockLinkSetViewTable.php b/sources/Application/UI/Links/AbstractBlockLinkSetViewTable.php index 85264dc21..c3460a79f 100644 --- a/sources/Application/UI/Links/AbstractBlockLinkSetViewTable.php +++ b/sources/Application/UI/Links/AbstractBlockLinkSetViewTable.php @@ -82,6 +82,7 @@ abstract class AbstractBlockLinkSetViewTable extends UIContentBlock protected bool $bIsAllowCreate; protected bool $bIsAllowModify; protected bool $bIsAllowDelete; + protected int $iCount; /** * Constructor. @@ -95,7 +96,7 @@ abstract class AbstractBlockLinkSetViewTable extends UIContentBlock * * @throws \CoreException */ - public function __construct(WebPage $oPage, DBObject $oDbObject, string $sObjectClass, string $sAttCode, AttributeLinkedSet $oAttDef, bool $bIsReadOnly = false) + public function __construct(WebPage $oPage, DBObject $oDbObject, string $sObjectClass, string $sAttCode, AttributeLinkedSet $oAttDef, bool $bIsReadOnly = false, ?int $iCount = null) { parent::__construct("links_view_table_$sAttCode", ["ibo-block-links-table"]); @@ -106,6 +107,7 @@ abstract class AbstractBlockLinkSetViewTable extends UIContentBlock $this->oDbObject = $oDbObject; $this->sTableId = 'rel_'.$this->sAttCode; $this->bIsAttEditable = !$bIsReadOnly; + $this->iCount = $iCount; $this->SetDataAttributes(['role' => 'ibo-block-links-table', 'link-attcode' => $sAttCode, 'link-class' => $this->oAttDef->GetLinkedClass()]); // Initialization $this->Init(); @@ -195,9 +197,13 @@ abstract class AbstractBlockLinkSetViewTable extends UIContentBlock $oOrmLinkSet = $this->oDbObject->Get($this->sAttCode); $oLinkSet = $oOrmLinkSet->ToDBObjectSet(utils::ShowObsoleteData()); + $aExtraParams = $this->GetExtraParam(); + if (is_null($this->iCount) === false) { + $aExtraParams['object_count' ] = $this->iCount; + } // add list block $oBlock = new DisplayBlock($oLinkSet->GetFilter(), DisplayBlock::ENUM_STYLE_LIST_IN_OBJECT, false); - $this->AddSubBlock($oBlock->GetRenderContent($oPage, $this->GetExtraParam(), $this->sTableId)); + $this->AddSubBlock($oBlock->GetRenderContent($oPage, $aExtraParams, $this->sTableId)); } diff --git a/sources/Controller/AjaxRenderController.php b/sources/Controller/AjaxRenderController.php index b32e1ff57..9632bcc9b 100644 --- a/sources/Controller/AjaxRenderController.php +++ b/sources/Controller/AjaxRenderController.php @@ -70,8 +70,14 @@ class AjaxRenderController $bShowObsoleteData = utils::ShowObsoleteData(); } $oSet->SetShowObsoleteData($bShowObsoleteData); + $iCount = 0; + if (isset($aExtraParams['object_count'])) { + $iCount = $aExtraParams['object_count']; + } else { + $iCount = $oSet->Count(); + } $aResult["draw"] = $iDrawNumber; - $aResult["recordsTotal"] = $oSet->Count(); + $aResult["recordsTotal"] = $iCount; $aResult["recordsFiltered"] = $aResult["recordsTotal"] ; $aResult["data"] = []; while ($aObject = $oSet->FetchAssoc()) { diff --git a/tests/php-unit-tests/unitary-tests/core/DBObjectTest.php b/tests/php-unit-tests/unitary-tests/core/DBObjectTest.php index 7c97e4044..14e5b34b1 100644 --- a/tests/php-unit-tests/unitary-tests/core/DBObjectTest.php +++ b/tests/php-unit-tests/unitary-tests/core/DBObjectTest.php @@ -21,6 +21,8 @@ namespace Combodo\iTop\Test\UnitTest\Core; use Attachment; use AttributeDateTime; +use Combodo\iTop\Application\WebPage\iTopWebPage; +use Combodo\iTop\Application\WebPage\WebPage; use Combodo\iTop\Service\Events\EventData; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; use CoreException; @@ -1415,4 +1417,28 @@ class DBObjectTest extends ItopDataTestCase $this->assertEquals("2024-01-15 09:45:00", $oObject->Get('end_date'), 'SetComputedDate +2 weeks on a WorkOrder DateTimeAttribute'); } + /** + * @covers DBObject::Get + */ + public function testGetLinkSet() + { + $iServer = $this->GivenObjectInDB('Server', [ + 'name' => 'The Boss', + ]); + + $iUserRequest = $this->GivenObjectInDB('UserRequest', [ + 'ref' => 'UR1', 'title' => 'UR1', 'description' => 'UR1', 'caller_id' => 3, 'org_id' => 3, 'service_id' => 1, + 'functionalcis_list' => [ + "functionalci_id:$iServer" + ], + ]); + $oUserRequest = MetaModel::GetObject('UserRequest', $iUserRequest); + + $this->assertDBQueryCount(2, function () use (&$oUserRequest) { + $oUserRequest->Get('functionalcis_list'); + }); + $this->assertDBQueryCount(0, function () use (&$oUserRequest) { + $oUserRequest->Get('functionalcis_list'); + }); + } }