Skip to content

Commit 6bec93f

Browse files
committed
Fix Oracle query limit compliance in Comments
Signed-off-by: Simounet <contact@simounet.net>
1 parent 54f8d48 commit 6bec93f

File tree

1 file changed

+21
-19
lines changed

1 file changed

+21
-19
lines changed

lib/private/Comments/Manager.php

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -634,27 +634,29 @@ public function getNumberOfCommentsForObject($objectType, $objectId, \DateTime $
634634
* @since 21.0.0
635635
*/
636636
public function getNumberOfUnreadCommentsForObjects(string $objectType, array $objectIds, IUser $user, $verb = ''): array {
637-
$query = $this->dbConn->getQueryBuilder();
638-
$query->select('c.object_id', $query->func()->count('c.id', 'num_comments'))
639-
->from('comments', 'c')
640-
->leftJoin('c', 'comments_read_markers', 'm', $query->expr()->andX(
641-
$query->expr()->eq('m.user_id', $query->createNamedParameter($user->getUID())),
642-
$query->expr()->eq('c.object_type', 'm.object_type'),
643-
$query->expr()->eq('c.object_id', 'm.object_id')
644-
))
645-
->where($query->expr()->eq('c.object_type', $query->createNamedParameter($objectType)))
646-
->andWhere($query->expr()->in('c.object_id', $query->createNamedParameter($objectIds, IQueryBuilder::PARAM_STR_ARRAY)))
647-
->andWhere($query->expr()->orX(
648-
$query->expr()->gt('c.creation_timestamp', 'm.marker_datetime'),
649-
$query->expr()->isNull('m.marker_datetime')
650-
))
651-
->groupBy('c.object_id');
637+
foreach (array_chunk($objectIds, 1000) as $chunk) {
638+
$query = $this->dbConn->getQueryBuilder();
639+
$query->select('c.object_id', $query->func()->count('c.id', 'num_comments'))
640+
->from('comments', 'c')
641+
->leftJoin('c', 'comments_read_markers', 'm', $query->expr()->andX(
642+
$query->expr()->eq('m.user_id', $query->createNamedParameter($user->getUID())),
643+
$query->expr()->eq('c.object_type', 'm.object_type'),
644+
$query->expr()->eq('c.object_id', 'm.object_id')
645+
))
646+
->where($query->expr()->eq('c.object_type', $query->createNamedParameter($objectType)))
647+
->andWhere($query->expr()->in('c.object_id', $query->createNamedParameter($chunk, IQueryBuilder::PARAM_STR_ARRAY)))
648+
->andWhere($query->expr()->orX(
649+
$query->expr()->gt('c.creation_timestamp', 'm.marker_datetime'),
650+
$query->expr()->isNull('m.marker_datetime')
651+
))
652+
->groupBy('c.object_id');
653+
654+
if ($verb !== '') {
655+
$query->andWhere($query->expr()->eq('c.verb', $query->createNamedParameter($verb)));
656+
}
652657

653-
if ($verb !== '') {
654-
$query->andWhere($query->expr()->eq('c.verb', $query->createNamedParameter($verb)));
658+
$result = $query->execute();
655659
}
656-
657-
$result = $query->execute();
658660
$unreadComments = array_fill_keys($objectIds, 0);
659661
while ($row = $result->fetch()) {
660662
$unreadComments[$row['object_id']] = (int) $row['num_comments'];

0 commit comments

Comments
 (0)