Optimise queries when preparing card related notifications

Signed-off-by: Raul Ferreira Fuentes <raul@nextcloud.com>
This commit is contained in:
Raul Ferreira Fuentes
2022-04-05 14:46:37 +02:00
parent eba0d94480
commit ac5524efdf
3 changed files with 32 additions and 15 deletions

View File

@@ -25,6 +25,13 @@ namespace OCA\Deck\Db;
use Sabre\VObject\Component\VCalendar; use Sabre\VObject\Component\VCalendar;
/**
* @method int getId()
* @method int getBoardId()
* @method int getDeletedAt()
* @method int getLastModified()
* @method int getOrder()
*/
class Stack extends RelationalEntity { class Stack extends RelationalEntity {
protected $title; protected $title;
protected $boardId; protected $boardId;

View File

@@ -25,6 +25,7 @@ namespace OCA\Deck\Db;
use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\Entity; use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\Db\IMapperException;
use OCP\AppFramework\Db\MultipleObjectsReturnedException; use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use OCP\IDBConnection; use OCP\IDBConnection;
@@ -48,6 +49,24 @@ class StackMapper extends DeckMapper implements IPermissionMapper {
return $this->findEntity($sql, [$id]); return $this->findEntity($sql, [$id]);
} }
/**
* @param $cardId
* @return Stack|null
*/
public function findStackFromCardId($cardId): ?Stack {
$sql = <<<SQL
SELECT s.*
FROM `*PREFIX*deck_stacks` as `s`
INNER JOIN `*PREFIX*deck_cards` as `c` ON s.id = c.stack_id
WHERE c.id = ?
SQL;
try {
return $this->findEntity($sql, [$cardId]);
} catch (IMapperException $e) {
return null;
}
}
public function findAll($boardId, $limit = null, $offset = null) { public function findAll($boardId, $limit = null, $offset = null) {
$sql = 'SELECT * FROM `*PREFIX*deck_stacks` WHERE `board_id` = ? AND deleted_at = 0 ORDER BY `order`, `id`'; $sql = 'SELECT * FROM `*PREFIX*deck_stacks` WHERE `board_id` = ? AND deleted_at = 0 ORDER BY `order`, `id`';

View File

@@ -101,15 +101,12 @@ class Notifier implements INotifier {
switch ($notification->getSubject()) { switch ($notification->getSubject()) {
case 'card-assigned': case 'card-assigned':
$cardId = $notification->getObjectId(); $cardId = $notification->getObjectId();
$boardId = $this->cardMapper->findBoardId($cardId); $stack = $this->stackMapper->findStackFromCardId($cardId);
$boardId = $stack ? $stack->getBoardId() : null;
if (!$boardId) { if (!$boardId) {
throw new AlreadyProcessedException(); throw new AlreadyProcessedException();
} }
$card = $this->cardMapper->find($cardId);
$stackId = $card->getStackId();
$stack = $this->stackMapper->find($stackId);
$initiator = $this->userManager->get($params[2]); $initiator = $this->userManager->get($params[2]);
if ($initiator !== null) { if ($initiator !== null) {
$dn = $initiator->getDisplayName(); $dn = $initiator->getDisplayName();
@@ -147,15 +144,12 @@ class Notifier implements INotifier {
break; break;
case 'card-overdue': case 'card-overdue':
$cardId = $notification->getObjectId(); $cardId = $notification->getObjectId();
$boardId = $this->cardMapper->findBoardId($cardId); $stack = $this->stackMapper->findStackFromCardId($cardId);
$boardId = $stack ? $stack->getBoardId() : null;
if (!$boardId) { if (!$boardId) {
throw new AlreadyProcessedException(); throw new AlreadyProcessedException();
} }
$card = $this->cardMapper->find($cardId);
$stackId = $card->getStackId();
$stack = $this->stackMapper->find($stackId);
$notification->setParsedSubject( $notification->setParsedSubject(
(string) $l->t('The card "%s" on "%s" has reached its due date.', $params) (string) $l->t('The card "%s" on "%s" has reached its due date.', $params)
); );
@@ -182,15 +176,12 @@ class Notifier implements INotifier {
break; break;
case 'card-comment-mentioned': case 'card-comment-mentioned':
$cardId = $notification->getObjectId(); $cardId = $notification->getObjectId();
$boardId = $this->cardMapper->findBoardId($cardId); $stack = $this->stackMapper->findStackFromCardId($cardId);
$boardId = $stack ? $stack->getBoardId() : null;
if (!$boardId) { if (!$boardId) {
throw new AlreadyProcessedException(); throw new AlreadyProcessedException();
} }
$card = $this->cardMapper->find($cardId);
$stackId = $card->getStackId();
$stack = $this->stackMapper->find($stackId);
$initiator = $this->userManager->get($params[2]); $initiator = $this->userManager->get($params[2]);
if ($initiator !== null) { if ($initiator !== null) {
$dn = $initiator->getDisplayName(); $dn = $initiator->getDisplayName();