From 5ebb53593c88966454879ce4aedbe4c337efaf40 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Fri, 1 May 2020 20:02:16 +0200 Subject: [PATCH] Improve group queries Before we'd also get the diplayname for each group in the backend. In a separate query. This is of course not ideal as this information is obtained on each and every query. Now this is queried once and properly cached. Also added more caching to the manager. Signed-off-by: Roeland Jago Douma --- lib/private/Group/Database.php | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/private/Group/Database.php b/lib/private/Group/Database.php index 1202ba09b13b7..ec8f7ea6f5352 100644 --- a/lib/private/Group/Database.php +++ b/lib/private/Group/Database.php @@ -118,7 +118,10 @@ public function createGroup(string $gid): bool { } // Add to cache - $this->groupCache[$gid] = $gid; + $this->groupCache[$gid] = [ + 'gid' => $gid, + 'displayname' => $gid + ]; return $result === 1; } @@ -244,15 +247,19 @@ public function getUserGroups($uid) { // No magic! $qb = $this->dbConn->getQueryBuilder(); - $cursor = $qb->select('gid') - ->from('group_user') + $cursor = $qb->select('gu.gid', 'g.displayname') + ->from('group_user', 'gu') + ->leftJoin('gu', 'groups', 'g', $qb->expr()->eq('gu.gid', 'g.gid')) ->where($qb->expr()->eq('uid', $qb->createNamedParameter($uid))) ->execute(); $groups = []; while ($row = $cursor->fetch()) { $groups[] = $row['gid']; - $this->groupCache[$row['gid']] = $row['gid']; + $this->groupCache[$row['gid']] = [ + 'gid' => $row['gid'], + 'displayname' => $row['displayname'], + ]; } $cursor->closeCursor(); @@ -309,7 +316,7 @@ public function groupExists($gid) { } $qb = $this->dbConn->getQueryBuilder(); - $cursor = $qb->select('gid') + $cursor = $qb->select('gid', 'displayname') ->from('groups') ->where($qb->expr()->eq('gid', $qb->createNamedParameter($gid))) ->execute(); @@ -317,7 +324,10 @@ public function groupExists($gid) { $cursor->closeCursor(); if ($result !== false) { - $this->groupCache[$gid] = $gid; + $this->groupCache[$gid] = [ + 'gid' => $gid, + 'displayname' => $result['displayname'], + ]; return true; } return false; @@ -430,6 +440,10 @@ public function countDisabledInGroup(string $gid): int { } public function getDisplayName(string $gid): string { + if (isset($this->groupCache[$gid])) { + return $this->groupCache[$gid]['displayname']; + } + $this->fixDI(); $query = $this->dbConn->getQueryBuilder();