From ba3cab10364c7bcc3722f40eaa66899241b123a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Wed, 15 Feb 2023 13:12:39 +0100 Subject: [PATCH] perf: Combine fetching acls for boards MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- lib/Db/AclMapper.php | 11 +++++++++++ lib/Db/BoardMapper.php | 30 +++++++++++++++--------------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/lib/Db/AclMapper.php b/lib/Db/AclMapper.php index cac999d4d..234bbae5a 100644 --- a/lib/Db/AclMapper.php +++ b/lib/Db/AclMapper.php @@ -52,6 +52,17 @@ class AclMapper extends DeckMapper implements IPermissionMapper { return $this->findEntities($qb); } + public function findIn(array $boardIds, ?int $limit = null, ?int $offset = null): array { + $qb = $this->db->getQueryBuilder(); + $qb->select('id', 'board_id', 'type', 'participant', 'permission_edit', 'permission_share', 'permission_manage') + ->from('deck_board_acl') + ->where($qb->expr()->in('board_id', $qb->createNamedParameter($boardIds, IQueryBuilder::PARAM_INT_ARRAY))) + ->setMaxResults($limit) + ->setFirstResult($offset); + + return $this->findEntities($qb); + } + /** * @param numeric $userId * @param numeric $id diff --git a/lib/Db/BoardMapper.php b/lib/Db/BoardMapper.php index cb5d2c38d..44837a94e 100644 --- a/lib/Db/BoardMapper.php +++ b/lib/Db/BoardMapper.php @@ -160,6 +160,20 @@ class BoardMapper extends QBMapper implements IPermissionMapper { $groupBoards = $this->findAllByGroups($userId, $groups, null, null, $since, $includeArchived, $before, $term); $circleBoards = $this->findAllByCircles($userId, null, null, $since, $includeArchived, $before, $term); $allBoards = array_unique(array_merge($userBoards, $groupBoards, $circleBoards)); + + // Could be moved outside + $acls = $this->aclMapper->findIn(array_map(function ($board) { + return $board->getId(); + }, $allBoards)); + + /* @var Board $entry */ + foreach ($allBoards as $entry) { + $boardAcls = array_filter($acls, function ($acl) use ($entry) { + return $acl->getBoardId() === $entry->getId(); + }); + $entry->setAcl($boardAcls); + } + foreach ($allBoards as $board) { $this->boardCache[$board->getId()] = $board; } @@ -259,11 +273,7 @@ class BoardMapper extends QBMapper implements IPermissionMapper { $entry->setShared(1); } $entries = array_merge($entries, $sharedEntries); - /* @var Board $entry */ - foreach ($entries as $entry) { - $acl = $this->aclMapper->findAll($entry->id); - $entry->setAcl($acl); - } + return $entries; } @@ -336,11 +346,6 @@ class BoardMapper extends QBMapper implements IPermissionMapper { foreach ($entries as $entry) { $entry->setShared(2); } - /* @var Board $entry */ - foreach ($entries as $entry) { - $acl = $this->aclMapper->findAll($entry->id); - $entry->setAcl($acl); - } return $entries; } @@ -397,11 +402,6 @@ class BoardMapper extends QBMapper implements IPermissionMapper { foreach ($entries as $entry) { $entry->setShared(2); } - /* @var Board $entry */ - foreach ($entries as $entry) { - $acl = $this->aclMapper->findAll($entry->id); - $entry->setAcl($acl); - } return $entries; }