From 0b95dbee7f0e4156c31a8590dfeb09afc0f860bd Mon Sep 17 00:00:00 2001 From: acognet Date: Mon, 20 Apr 2020 16:30:48 +0200 Subject: [PATCH] =?UTF-8?q?N=C2=B01588=20-=20Count=20on=20Managed=20Brick?= =?UTF-8?q?=20sometimes=20wrong?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/dbobjectsearch.class.php | 1 - .../src/Controller/ManageBrickController.php | 28 +++++++++++++++++-- .../templates/bricks/manage/layout.html.twig | 2 +- test/core/DBSearchIntersectTest.php | 20 +++++++++++++ 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/core/dbobjectsearch.class.php b/core/dbobjectsearch.class.php index bff609535..8a3d06a82 100644 --- a/core/dbobjectsearch.class.php +++ b/core/dbobjectsearch.class.php @@ -1068,7 +1068,6 @@ class DBObjectSearch extends DBSearch { if (($oSearch->GetFirstJoinedClassAlias() == $sClassAlias)) { - $oSearch->ResetCondition(); $oSearch = $oSearch->IntersectSubClass($oFilter, $aRootClasses); return $oSearch->GetCriteria(); } diff --git a/datamodels/2.x/itop-portal-base/portal/src/Controller/ManageBrickController.php b/datamodels/2.x/itop-portal-base/portal/src/Controller/ManageBrickController.php index 702bb3611..ab8921327 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Controller/ManageBrickController.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Controller/ManageBrickController.php @@ -35,6 +35,7 @@ use Combodo\iTop\Portal\Helper\ApplicationHelper; use DBObject; use DBObjectSet; use DBSearch; +use DBUnionSearch; use Dict; use Exception; use FieldExpression; @@ -343,11 +344,13 @@ class ManageBrickController extends BrickController // Otherwise we create the tabs from the SQL expressions else { + $aConditionQueryGrouping = array(); foreach ($aGroupingTabs['groups'] as $aGroup) { - $oConditionQuery = $oQuery->Intersect(DBSearch::FromOQL($aGroup['condition'])); + $oDBSearch = DBSearch::FromOQL($aGroup['condition']); + $oConditionQuery = $oQuery->Intersect($oDBSearch); // - Restricting query to scope - + array_push($aConditionQueryGrouping,$oDBSearch); $bHasScope = $oScopeValidator->AddScopeToQuery($oConditionQuery, $oConditionQuery->GetClass()); if ($bHasScope) { @@ -368,7 +371,26 @@ class ManageBrickController extends BrickController 'condition' => $oConditionQuery, 'count' => $iGroupCount, ); - $iCount += $iGroupCount; + } + try + { + $oConditionQuery = $oQuery->Intersect(new DBUnionSearch($aConditionQueryGrouping)); + $bHasScope = $oScopeValidator->AddScopeToQuery($oConditionQuery, $oConditionQuery->GetClass()); + if ($bHasScope) + { + // - Building ObjectSet + $oConditionSet = new DBObjectSet($oConditionQuery); + $iCount = $oConditionSet->Count(); + } + else + { + $oConditionSet = null; + $iCount = 0; + } + } + catch (Exception $e){ + $oConditionSet = null; + $iCount = -1; } } } diff --git a/datamodels/2.x/itop-portal-base/portal/templates/bricks/manage/layout.html.twig b/datamodels/2.x/itop-portal-base/portal/templates/bricks/manage/layout.html.twig index 5b39f7ef1..cb36cc05d 100644 --- a/datamodels/2.x/itop-portal-base/portal/templates/bricks/manage/layout.html.twig +++ b/datamodels/2.x/itop-portal-base/portal/templates/bricks/manage/layout.html.twig @@ -1,7 +1,7 @@ {# itop-portal-base/portal/templates/bricks/manage/layout.html.twig #} {% extends 'itop-portal-base/portal/templates/bricks/layout.html.twig' %} -{% block pMainHeaderTitle %}{{ oBrick.GetTitle()|dict_s }} ({{ iCount }}) {% endblock %} +{% block pMainHeaderTitle %}{{ oBrick.GetTitle()|dict_s }} {% if iCount >= 0 %} ({{ iCount }}){% endif %} {% endblock %} {% block pMainHeaderActions %} {% if oBrick.GetAvailablesDisplayModes|length > 1 %} diff --git a/test/core/DBSearchIntersectTest.php b/test/core/DBSearchIntersectTest.php index cd11f97ba..9a5be882d 100644 --- a/test/core/DBSearchIntersectTest.php +++ b/test/core/DBSearchIntersectTest.php @@ -112,6 +112,26 @@ class DBSearchIntersectTest extends ItopDataTestCase 'alias' => "P", 'result' => "SELECT `L` FROM Location AS `L` JOIN Person AS `P` ON `P`.location_id = `L`.id JOIN Location AS `L1` ON `P`.location_id = `L1`.id WHERE (`L1`.`org_id` = 3)"); + $aTests['Test Subclass1'] = array( + 'left' => "SELECT `U` FROM UserRequest AS `U` WHERE `U`.agent_id = 3", + 'right' => "SELECT `Ticket` WHERE org_id = 3", + 'alias' => "U", + 'result' => "SELECT `U` FROM UserRequest AS `U` WHERE (((`U`.`agent_id` = 3) AND (`U`.`org_id` = 3)) AND ((`U`.`agent_id` = 3) AND (`U`.`org_id` = 3)))"); + + $aTests['Test Subclass and join'] = array( + 'left' => "SELECT `UserRequest` FROM UserRequest AS `UserRequest` JOIN Person AS `P` ON `UserRequest`.agent_id = `P`.id WHERE `UserRequest`.agent_id = 3", + 'right' => "SELECT `Ticket` WHERE org_id = 3", + 'alias' => "UserRequest", + 'result' => "SELECT `UserRequest` FROM UserRequest AS `UserRequest` JOIN Person AS `P` ON `UserRequest`.agent_id = `P`.id WHERE (((`UserRequest`.`agent_id` = 3) AND (`UserRequest`.`org_id` = 3)) AND ((`UserRequest`.`agent_id` = 3) AND (`UserRequest`.`org_id` = 3)))"); + + $aTests['Test Subclass and union'] = array( + 'left' => "SELECT `U` FROM UserRequest AS `U` WHERE `U`.agent_id = 3 UNION SELECT `T` FROM Ticket AS `T` WHERE `T`.agent_id = 3 ", + 'right' => "SELECT `Ticket` WHERE org_id = 3", + 'alias' => "U", + 'result' => "SELECT `U` FROM UserRequest AS `U` WHERE (((`U`.`agent_id` = 3) AND (`U`.`org_id` = 3)) AND ((`U`.`agent_id` = 3) AND (`U`.`org_id` = 3))) UNION SELECT `T` FROM Ticket AS `T` WHERE ((`T`.`agent_id` = 3) AND (`T`.`org_id` = 3))"); + + + return $aTests; }