From de7726d0a866042d311e9ca0cf43b0ebc1c46f43 Mon Sep 17 00:00:00 2001
From: Patrick Barroca <pbarroca@afi-sa.fr>
Date: Thu, 6 Feb 2020 10:35:55 +0100
Subject: [PATCH] hotline#105091 : Performance : Issue fixed in dynamic library
 groups management

---
 VERSIONS_HOTLINE/105091     |  1 +
 library/Class/UserGroup.php | 28 ++++++++++++++++++++++++++++
 library/Class/Users.php     |  3 +--
 3 files changed, 30 insertions(+), 2 deletions(-)
 create mode 100644 VERSIONS_HOTLINE/105091

diff --git a/VERSIONS_HOTLINE/105091 b/VERSIONS_HOTLINE/105091
new file mode 100644
index 00000000000..e15a2d398cd
--- /dev/null
+++ b/VERSIONS_HOTLINE/105091
@@ -0,0 +1 @@
+ - ticket #105091 : Performance : Correction de la perte de performance suite à la livraison des nouveaux groupes dynamiques
\ No newline at end of file
diff --git a/library/Class/UserGroup.php b/library/Class/UserGroup.php
index 5c2ede4bb45..77f6f19ec96 100644
--- a/library/Class/UserGroup.php
+++ b/library/Class/UserGroup.php
@@ -22,6 +22,17 @@
 class UserGroupLoader extends Storm_Model_Loader {
   use Trait_MemoryCleaner;
 
+  protected static $_dynamics_of_user_cache = [];
+
+
+  public function save($model) {
+    $result = parent::save($model);
+    if ($model->isDynamic())
+      static::$_dynamics_of_user_cache = [];
+
+    return $result;
+  }
+
 
   public function getUsersIdsOf($group) {
     $ids = [];
@@ -99,6 +110,23 @@ class UserGroupLoader extends Storm_Model_Loader {
   public function findAllDynamics() {
     return Class_UserGroup::findAllBy(['group_type' => Class_UserGroup::TYPE_DYNAMIC]);
   }
+
+
+  public function findAllDynamicsOf($user) {
+    if ($user->isNew())
+      return $this->_realFindAllDynamicsOf($user);
+
+    $key = $user->getId();
+    return array_key_exists($key, static::$_dynamics_of_user_cache)
+      ? static::$_dynamics_of_user_cache[$key]
+      : (static::$_dynamics_of_user_cache[$key] = $this->_realFindAllDynamicsOf($user));
+  }
+
+
+  protected function _realFindAllDynamicsOf($user) {
+    return array_filter(Class_UserGroup::findAllDynamics(),
+                        function($group) use($user) { return $group->hasUser($user); });
+  }
 }
 
 
diff --git a/library/Class/Users.php b/library/Class/Users.php
index 705a8e3410c..8f6a8558eb0 100644
--- a/library/Class/Users.php
+++ b/library/Class/Users.php
@@ -827,8 +827,7 @@ class Class_Users extends Storm_Model_Abstract {
 
 
   public function getDynamicUserGroups() {
-    return array_filter(Class_UserGroup::findAllDynamics(),
-                        function($group) { return $group->hasUser($this); });
+    return Class_UserGroup::findAllDynamicsOf($this);
   }
 
 
-- 
GitLab