Cache card to board id relation

Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
Julius Härtl
2021-11-23 23:34:08 +01:00
parent f861f9e5fc
commit 80388d1a88

View File

@@ -30,6 +30,8 @@ use OCA\Deck\Search\Query\SearchQuery;
use OCP\AppFramework\Db\Entity; use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\Db\QBMapper; use OCP\AppFramework\Db\QBMapper;
use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\ICache;
use OCP\ICacheFactory;
use OCP\IDBConnection; use OCP\IDBConnection;
use OCP\IGroupManager; use OCP\IGroupManager;
use OCP\IUser; use OCP\IUser;
@@ -46,6 +48,8 @@ class CardMapper extends QBMapper implements IPermissionMapper {
private $groupManager; private $groupManager;
/** @var IManager */ /** @var IManager */
private $notificationManager; private $notificationManager;
/** @var ICache */
private $cache;
private $databaseType; private $databaseType;
private $database4ByteSupport; private $database4ByteSupport;
@@ -55,6 +59,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
IUserManager $userManager, IUserManager $userManager,
IGroupManager $groupManager, IGroupManager $groupManager,
IManager $notificationManager, IManager $notificationManager,
ICacheFactory $cacheFactory,
$databaseType = 'sqlite3', $databaseType = 'sqlite3',
$database4ByteSupport = true $database4ByteSupport = true
) { ) {
@@ -63,6 +68,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
$this->userManager = $userManager; $this->userManager = $userManager;
$this->groupManager = $groupManager; $this->groupManager = $groupManager;
$this->notificationManager = $notificationManager; $this->notificationManager = $notificationManager;
$this->cache = $cacheFactory->createDistributed('deck-cardMapper');
$this->databaseType = $databaseType; $this->databaseType = $databaseType;
$this->database4ByteSupport = $database4ByteSupport; $this->database4ByteSupport = $database4ByteSupport;
} }
@@ -75,7 +81,9 @@ class CardMapper extends QBMapper implements IPermissionMapper {
$description = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $entity->getDescription()); $description = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $entity->getDescription());
$entity->setDescription($description); $entity->setDescription($description);
} }
return parent::insert($entity); $entity = parent::insert($entity);
$this->cache->remove('findBoardId:' . $entity->getId());
return $entity;
} }
public function update(Entity $entity, $updateModified = true): Entity { public function update(Entity $entity, $updateModified = true): Entity {
@@ -107,6 +115,10 @@ class CardMapper extends QBMapper implements IPermissionMapper {
} catch (Exception $e) { } catch (Exception $e) {
} }
} }
// Invalidate cache when the card may be moved to a different board
if (isset($updatedFields['stackId'])) {
$this->cache->remove('findBoardId:' . $entity->getId());
}
return parent::update($entity); return parent::update($entity);
} }
@@ -479,8 +491,8 @@ class CardMapper extends QBMapper implements IPermissionMapper {
} }
return $qb->createNamedParameter($dateTime, IQueryBuilder::PARAM_DATE); return $qb->createNamedParameter($dateTime, IQueryBuilder::PARAM_DATE);
} }
public function searchRaw($boardIds, $term, $limit = null, $offset = null) { public function searchRaw($boardIds, $term, $limit = null, $offset = null) {
$qb = $this->queryCardsByBoards($boardIds) $qb = $this->queryCardsByBoards($boardIds)
@@ -506,9 +518,8 @@ class CardMapper extends QBMapper implements IPermissionMapper {
} }
public function delete(Entity $entity): Entity { public function delete(Entity $entity): Entity {
// delete assigned labels
$this->labelMapper->deleteLabelAssignmentsForCard($entity->getId()); $this->labelMapper->deleteLabelAssignmentsForCard($entity->getId());
// delete card $this->cache->remove('findBoardId:' . $entity->getId());
return parent::delete($entity); return parent::delete($entity);
} }
@@ -547,11 +558,22 @@ class CardMapper extends QBMapper implements IPermissionMapper {
} }
public function findBoardId($id): ?int { public function findBoardId($id): ?int {
$sql = 'SELECT id FROM `*PREFIX*deck_boards` WHERE `id` IN (SELECT board_id FROM `*PREFIX*deck_stacks` WHERE id IN (SELECT stack_id FROM `*PREFIX*deck_cards` WHERE id = ?))'; $result = $this->cache->get('findBoardId:' . $id);
$stmt = $this->db->prepare($sql); if ($result === null) {
$stmt->bindParam(1, $id, \PDO::PARAM_INT); try {
$stmt->execute(); $qb = $this->db->getQueryBuilder();
return $stmt->fetchColumn() ?? null; $qb->select('board_id')
->from('deck_stacks', 's')
->innerJoin('s', 'deck_cards', 'c', 'c.stack_id = s.id')
->where($qb->expr()->eq('c.id', $qb->createNamedParameter($id)));
$queryResult = $qb->executeQuery();
$result = $queryResult->fetchOne();
} catch (\Exception $e) {
$result = false;
}
$this->cache->set('findBoardId:' . $id, $result);
}
return $result !== false ? $result : null;
} }
public function mapOwner(Card &$card) { public function mapOwner(Card &$card) {