From 8a8355af930e1ebce390934a78f4509cc5760ec8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Tue, 2 May 2023 16:59:42 +0200 Subject: [PATCH] Use a Generator for users in searchInGroups, type it as iterable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- apps/user_ldap/lib/Group_Proxy.php | 2 +- lib/private/Group/Database.php | 13 ++++++++----- lib/private/Group/Group.php | 7 ++++++- .../Group/Backend/ISearchableGroupBackend.php | 4 ++-- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/apps/user_ldap/lib/Group_Proxy.php b/apps/user_ldap/lib/Group_Proxy.php index 5f8d0562fd918..4f2cdb0897926 100644 --- a/apps/user_ldap/lib/Group_Proxy.php +++ b/apps/user_ldap/lib/Group_Proxy.php @@ -335,7 +335,7 @@ public function getBackendName(): string { return 'LDAP'; } - public function searchInGroup(string $gid, string $search = '', int $limit = -1, int $offset = 0): array { + public function searchInGroup(string $gid, string $search = '', int $limit = -1, int $offset = 0): iterable { return $this->handleRequest($gid, 'searchInGroup', [$gid, $search, $limit, $offset]); } } diff --git a/lib/private/Group/Database.php b/lib/private/Group/Database.php index 569cfa5007f34..777fc64be9e99 100644 --- a/lib/private/Group/Database.php +++ b/lib/private/Group/Database.php @@ -336,10 +336,15 @@ public function groupExists($gid) { * @return array an array of user ids */ public function usersInGroup($gid, $search = '', $limit = -1, $offset = 0): array { - return array_values(array_map(fn ($user) => $user->getUid(), $this->searchInGroup($gid, $search, $limit, $offset))); + $userIds = []; + $users = $this->searchInGroup($gid, $search, $limit, $offset); + foreach ($users as $userId => $user) { + $userIds[] = $userId; + } + return $userIds; } - public function searchInGroup(string $gid, string $search = '', int $limit = -1, int $offset = 0): array { + public function searchInGroup(string $gid, string $search = '', int $limit = -1, int $offset = 0): iterable { $this->fixDI(); $query = $this->dbConn->getQueryBuilder(); @@ -380,11 +385,9 @@ public function searchInGroup(string $gid, string $search = '', int $limit = -1, $users = []; $userManager = \OCP\Server::get(IUserManager::class); while ($row = $result->fetch()) { - $users[$row['uid']] = new LazyUser($row['uid'], $userManager, $row['displayname'] ?? null); + yield $row['uid'] => new LazyUser($row['uid'], $userManager, $row['displayname'] ?? null); } $result->closeCursor(); - - return $users; } /** diff --git a/lib/private/Group/Group.php b/lib/private/Group/Group.php index efc21ad7c0dc0..e5fb2a16a3042 100644 --- a/lib/private/Group/Group.php +++ b/lib/private/Group/Group.php @@ -251,7 +251,12 @@ public function searchUsers(string $search, ?int $limit = null, ?int $offset = n $users = []; foreach ($this->backends as $backend) { if ($backend instanceof ISearchableGroupBackend) { - $users += $backend->searchInGroup($this->gid, $search, $limit ?? -1, $offset ?? 0); + $backendUsers = $backend->searchInGroup($this->gid, $search, $limit ?? -1, $offset ?? 0); + foreach ($backendUsers as $userId => $user) { + if (!isset($users[$userId])) { + $users[$userId] = $user; + } + } } else { $userIds = $backend->usersInGroup($this->gid, $search, $limit ?? -1, $offset ?? 0); $userManager = \OCP\Server::get(IUserManager::class); diff --git a/lib/public/Group/Backend/ISearchableGroupBackend.php b/lib/public/Group/Backend/ISearchableGroupBackend.php index 20753822258e4..08eb63865aeaf 100644 --- a/lib/public/Group/Backend/ISearchableGroupBackend.php +++ b/lib/public/Group/Backend/ISearchableGroupBackend.php @@ -44,8 +44,8 @@ interface ISearchableGroupBackend { * want to search. This can be empty to get all the users. * @param int $limit The limit of results * @param int $offset The offset of the results - * @return array Users indexed by uid + * @return iterable Users indexed by uid * @since 27.0.0 */ - public function searchInGroup(string $gid, string $search = '', int $limit = -1, int $offset = 0): array; + public function searchInGroup(string $gid, string $search = '', int $limit = -1, int $offset = 0): iterable; }