Rewrite getNumberOfUnreadCommentsForFolder query
Before the joining and filtering removed unkown files. Resulting in manual queries for all the files with no (unread) comments (the 99%). Long story short. This will return a list of all the files in the parent folder with their unread comment count (can be 0). But this makes sure that the result is properly cached. In the dav handling. Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This commit is contained in:
parent
4b0cb0df7f
commit
f394bf356e
|
@ -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(
|
||||||
|
'f.fileid', $qb->expr()->castColumn('c.object_id', IQueryBuilder::PARAM_INT)
|
||||||
|
))
|
||||||
|
->leftJoin('c', 'comments_read_markers', 'm', $qb->expr()->eq(
|
||||||
|
'c.object_id', 'm.object_id'
|
||||||
|
))
|
||||||
|
->where(
|
||||||
|
$qb->expr()->andX(
|
||||||
|
$qb->expr()->eq('f.parent', $qb->createNamedParameter($folderId)),
|
||||||
|
$qb->expr()->orX(
|
||||||
$qb->expr()->eq('c.object_type', $qb->createNamedParameter('files')),
|
$qb->expr()->eq('c.object_type', $qb->createNamedParameter('files')),
|
||||||
$qb->expr()->eq('f.fileid', $qb->expr()->castColumn('c.object_id', IQueryBuilder::PARAM_INT))
|
$qb->expr()->isNull('c.object_type')
|
||||||
))
|
),
|
||||||
->leftJoin('c', 'comments_read_markers', 'm', $qb->expr()->andX(
|
$qb->expr()->orX(
|
||||||
$qb->expr()->eq('m.object_type', $qb->createNamedParameter('files')),
|
$qb->expr()->eq('m.object_type', $qb->createNamedParameter('files')),
|
||||||
$qb->expr()->eq('m.object_id', 'c.object_id'),
|
$qb->expr()->isNull('m.object_type')
|
||||||
$qb->expr()->eq('m.user_id', $qb->createNamedParameter($user->getUID()))
|
),
|
||||||
))
|
$qb->expr()->orX(
|
||||||
->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($folderId)))
|
$qb->expr()->eq('m.user_id', $qb->createNamedParameter($user->getUID())),
|
||||||
->andWhere($qb->expr()->orX(
|
$qb->expr()->isNull('m.user_id')
|
||||||
$qb->expr()->gt('c.creation_timestamp', 'marker_datetime'),
|
),
|
||||||
$qb->expr()->isNull('marker_datetime')
|
$qb->expr()->orX(
|
||||||
))
|
$qb->expr()->gt('c.creation_timestamp', 'm.marker_datetime'),
|
||||||
->groupBy('f.fileid');
|
$qb->expr()->isNull('m.marker_datetime')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)->groupBy('f.fileid');
|
||||||
|
|
||||||
$resultStatement = $query->execute();
|
$resultStatement = $query->execute();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue