Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Fix Oracle query limit compliance in Comments
Signed-off-by: Simounet <[email protected]>
  • Loading branch information
Simounet committed May 28, 2021
commit a50eba16adbee809ce69806ee5baee30707b8cca
15 changes: 10 additions & 5 deletions lib/private/Comments/Manager.php
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,7 @@ public function getNumberOfCommentsForObject($objectType, $objectId, \DateTime $
* @since 21.0.0
*/
public function getNumberOfUnreadCommentsForObjects(string $objectType, array $objectIds, IUser $user, $verb = ''): array {
$unreadComments = [];
$query = $this->dbConn->getQueryBuilder();
$query->select('c.object_id', $query->func()->count('c.id', 'num_comments'))
->from('comments', 'c')
Expand All @@ -643,7 +644,7 @@ public function getNumberOfUnreadCommentsForObjects(string $objectType, array $o
$query->expr()->eq('c.object_id', 'm.object_id')
))
->where($query->expr()->eq('c.object_type', $query->createNamedParameter($objectType)))
->andWhere($query->expr()->in('c.object_id', $query->createNamedParameter($objectIds, IQueryBuilder::PARAM_STR_ARRAY)))
->andWhere($query->expr()->in('c.object_id', $query->createParameter('ids')))
->andWhere($query->expr()->orX(
$query->expr()->gt('c.creation_timestamp', 'm.marker_datetime'),
$query->expr()->isNull('m.marker_datetime')
Expand All @@ -654,10 +655,14 @@ public function getNumberOfUnreadCommentsForObjects(string $objectType, array $o
$query->andWhere($query->expr()->eq('c.verb', $query->createNamedParameter($verb)));
}

$result = $query->execute();
$unreadComments = array_fill_keys($objectIds, 0);
while ($row = $result->fetch()) {
$unreadComments[$row['object_id']] = (int) $row['num_comments'];
foreach (array_chunk($objectIds, 1000) as $chunk) {
$query->setParameter('ids', $chunk, IQueryBuilder::PARAM_INT_ARRAY);
$result = $query->execute();

$unreadComments += array_fill_keys($objectIds, 0);
while ($row = $result->fetch()) {
$unreadComments[$row['object_id']] = (int) $row['num_comments'];
}
}
$result->closeCursor();

Expand Down