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 <roeland@famdouma.nl>
This commit is contained in:
Roeland Jago Douma 2020-05-01 20:02:16 +02:00
parent 24bb4a05c4
commit 5ebb53593c
No known key found for this signature in database
GPG Key ID: F941078878347C0C
1 changed files with 20 additions and 6 deletions

View File

@ -118,7 +118,10 @@ class Database extends ABackend implements
}
// Add to cache
$this->groupCache[$gid] = $gid;
$this->groupCache[$gid] = [
'gid' => $gid,
'displayname' => $gid
];
return $result === 1;
}
@ -244,15 +247,19 @@ class Database extends ABackend implements
// 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 @@ class Database extends ABackend implements
}
$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 @@ class Database extends ABackend implements
$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 @@ class Database extends ABackend implements
}
public function getDisplayName(string $gid): string {
if (isset($this->groupCache[$gid])) {
return $this->groupCache[$gid]['displayname'];
}
$this->fixDI();
$query = $this->dbConn->getQueryBuilder();