Skip to content

Commit ce5faf0

Browse files
author
Carl Schwan
committed
perf(stack): Optimize fetching all cards from a stack
- Don't fetch stack, if we already know it - fetch all comments at the same time, instead of for each card Signed-off-by: Carl Schwan <carl.schwan@nextclound.com>
1 parent 0ed8b21 commit ce5faf0

2 files changed

Lines changed: 29 additions & 12 deletions

File tree

lib/Service/CardService.php

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use OCA\Deck\Db\ChangeHelper;
2020
use OCA\Deck\Db\Label;
2121
use OCA\Deck\Db\LabelMapper;
22+
use OCA\Deck\Db\Stack;
2223
use OCA\Deck\Db\StackMapper;
2324
use OCA\Deck\Event\CardCreatedEvent;
2425
use OCA\Deck\Event\CardDeletedEvent;
@@ -64,31 +65,47 @@ public function __construct(
6465
) {
6566
}
6667

67-
public function enrichCards($cards) {
68+
/**
69+
* @param Card[] $cards
70+
* @return CardDetails[]
71+
*/
72+
public function enrichCards(array $cards, Stack $stack = null): array {
73+
if (!$cards) {
74+
return [];
75+
}
76+
6877
$user = $this->userManager->get($this->userId);
6978

70-
$cardIds = array_map(function (Card $card) use ($user) {
79+
$cardIds = array_map(function (Card $card) use ($user, $stack) {
7180
// Everything done in here might be heavy as it is executed for every card
7281
$cardId = $card->getId();
7382
$this->cardMapper->mapOwner($card);
7483

7584
$card->setAttachmentCount($this->attachmentService->count($cardId));
7685

77-
// TODO We should find a better way just to get the comment count so we can save 1-3 queries per card here
78-
$countComments = $this->commentsManager->getNumberOfCommentsForObject('deckCard', (string)$card->getId());
79-
$lastRead = $countComments > 0 ? $this->commentsManager->getReadMark('deckCard', (string)$card->getId(), $user) : null;
80-
$countUnreadComments = $lastRead ? $this->commentsManager->getNumberOfCommentsForObject('deckCard', (string)$card->getId(), $lastRead) : 0;
81-
$card->setCommentsUnread($countUnreadComments);
82-
$card->setCommentsCount($countComments);
83-
84-
$stack = $this->stackMapper->find($card->getStackId());
86+
if ($stack === null) {
87+
$stack = $this->stackMapper->find($card->getStackId());
88+
}
8589
$board = $this->boardService->find($stack->getBoardId(), false);
8690
$card->setRelatedStack($stack);
8791
$card->setRelatedBoard($board);
8892

89-
return $card->getId();
93+
return $cardId;
9094
}, $cards);
9195

96+
$commentsCountPerCardId = $this->commentsManager->getNumberOfCommentsForObjects('deckCard', $cardIds);
97+
$unreadCommentsCountPerCardId = $this->commentsManager->getNumberOfUnreadCommentsForObjects('deckCard', $cardIds, $user);
98+
99+
foreach ($commentsCountPerCardId as $cardId => $commentCounts) {
100+
foreach ($cards as $card) {
101+
if ($card->getId() === $cardId) {
102+
$card->setCommentsUnread($unreadCommentsCountPerCardId[$cardId]);
103+
$card->setCommentsCount($commentCounts);
104+
break;
105+
}
106+
}
107+
}
108+
92109
$assignedLabels = $this->labelMapper->findAssignedLabelsForCards($cardIds);
93110
$assignedUsers = $this->assignedUsersMapper->findIn($cardIds);
94111

lib/Service/StackService.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ private function enrichStackWithCards($stack, $since = -1) {
8282
return;
8383
}
8484

85-
$stack->setCards($this->cardService->enrichCards($cards));
85+
$stack->setCards($this->cardService->enrichCards($cards, $stack));
8686
}
8787

8888
private function enrichStacksWithCards($stacks, $since = -1) {

0 commit comments

Comments
 (0)