Merge pull request #13161 from nextcloud/perf/fix_comments_in_folder_function

Rewrite getNumberOfUnreadCommentsForFolder query
This commit is contained in:
blizzz 2019-01-03 17:08:52 +01:00 committed by GitHub
commit aad32771f8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 29 additions and 14 deletions

View File

@ -581,27 +581,42 @@ class Manager implements ICommentsManager {
* @param int $folderId * @param int $folderId
* @param IUser $user * @param IUser $user
* @return array [$fileId => $unreadCount] * @return array [$fileId => $unreadCount]
*
* @suppress SqlInjectionChecker
*/ */
public function getNumberOfUnreadCommentsForFolder($folderId, IUser $user) { public function getNumberOfUnreadCommentsForFolder($folderId, IUser $user) {
$qb = $this->dbConn->getQueryBuilder(); $qb = $this->dbConn->getQueryBuilder();
$query = $qb->select('f.fileid') $query = $qb->select('f.fileid')
->addSelect($qb->func()->count('c.id', 'num_ids')) ->addSelect($qb->func()->count('c.id', 'num_ids'))
->from('comments', 'c') ->from('filecache', 'f')
->innerJoin('c', 'filecache', 'f', $qb->expr()->andX( ->leftJoin('f', 'comments', 'c', $qb->expr()->eq(
$qb->expr()->eq('c.object_type', $qb->createNamedParameter('files')), 'f.fileid', $qb->expr()->castColumn('c.object_id', IQueryBuilder::PARAM_INT)
$qb->expr()->eq('f.fileid', $qb->expr()->castColumn('c.object_id', IQueryBuilder::PARAM_INT))
)) ))
->leftJoin('c', 'comments_read_markers', 'm', $qb->expr()->andX( ->leftJoin('c', 'comments_read_markers', 'm', $qb->expr()->eq(
$qb->expr()->eq('m.object_type', $qb->createNamedParameter('files')), 'c.object_id', 'm.object_id'
$qb->expr()->eq('m.object_id', 'c.object_id'),
$qb->expr()->eq('m.user_id', $qb->createNamedParameter($user->getUID()))
)) ))
->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($folderId))) ->where(
->andWhere($qb->expr()->orX( $qb->expr()->andX(
$qb->expr()->gt('c.creation_timestamp', 'marker_datetime'), $qb->expr()->eq('f.parent', $qb->createNamedParameter($folderId)),
$qb->expr()->isNull('marker_datetime') $qb->expr()->orX(
)) $qb->expr()->eq('c.object_type', $qb->createNamedParameter('files')),
->groupBy('f.fileid'); $qb->expr()->isNull('c.object_type')
),
$qb->expr()->orX(
$qb->expr()->eq('m.object_type', $qb->createNamedParameter('files')),
$qb->expr()->isNull('m.object_type')
),
$qb->expr()->orX(
$qb->expr()->eq('m.user_id', $qb->createNamedParameter($user->getUID())),
$qb->expr()->isNull('m.user_id')
),
$qb->expr()->orX(
$qb->expr()->gt('c.creation_timestamp', 'm.marker_datetime'),
$qb->expr()->isNull('m.marker_datetime')
)
)
)->groupBy('f.fileid');
$resultStatement = $query->execute(); $resultStatement = $query->execute();