From 96660ec9ea43dc47ea9e5857bee4a0f10c83c4ae Mon Sep 17 00:00:00 2001 From: Git'Fellow <12234510+solracsf@users.noreply.github.com> Date: Sat, 13 Jun 2026 23:03:37 +0200 Subject: [PATCH] perf(files): compute move/rename activity settings once Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com> --- lib/FilesHooks.php | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/lib/FilesHooks.php b/lib/FilesHooks.php index c56edd7f2..9f1172e26 100644 --- a/lib/FilesHooks.php +++ b/lib/FilesHooks.php @@ -413,14 +413,23 @@ protected function fileMoving($oldPath, $newPath) { $beforeUsers = array_keys($oldUsers); $afterUsers = array_keys($affectedUsers); + // Resolve notification/email settings (and favorites) once for every user involved + // in the move, instead of recomputing them for each delete/add/move subset of the + // same file. The maps are keyed by user and each subset only reads its own keys. + $allUsers = array_values(array_unique(array_merge($beforeUsers, $afterUsers))); + $filteredEmailUsers = $filteredNotificationUsers = []; + if (!empty($allUsers)) { + [$filteredEmailUsers, $filteredNotificationUsers] = $this->getFileChangeActivitySettings($fileId, $allUsers); + } + $deleteUsers = array_diff($beforeUsers, $afterUsers); - $this->generateDeleteActivities($deleteUsers, $oldUsers, $fileId, $oldFileName); + $this->generateDeleteActivities($deleteUsers, $oldUsers, $fileId, $oldFileName, $filteredEmailUsers, $filteredNotificationUsers); $addUsers = array_diff($afterUsers, $beforeUsers); - $this->generateAddActivities($addUsers, $affectedUsers, $fileId, $fileName); + $this->generateAddActivities($addUsers, $affectedUsers, $fileId, $fileName, $filteredEmailUsers, $filteredNotificationUsers); $moveUsers = array_intersect($beforeUsers, $afterUsers); - $this->generateMoveActivities($moveUsers, $oldUsers, $affectedUsers, $fileId, $oldFileName, $parentId, $fileName); + $this->generateMoveActivities($moveUsers, $oldUsers, $affectedUsers, $fileId, $oldFileName, $parentId, $fileName, $filteredEmailUsers, $filteredNotificationUsers); $beforeRemotes = $this->oldAccessList['remotes']; $afterRemotes = $accessList['remotes']; @@ -455,14 +464,14 @@ protected function fileMoving($oldPath, $newPath) { * @param string[] $pathMap * @param int $fileId * @param string $oldFileName + * @param array $filteredEmailUsers + * @param array $filteredNotificationUsers */ - protected function generateDeleteActivities($users, $pathMap, $fileId, $oldFileName) { + protected function generateDeleteActivities($users, $pathMap, $fileId, $oldFileName, array $filteredEmailUsers, array $filteredNotificationUsers) { if (empty($users)) { return; } - [$filteredEmailUsers, $filteredNotificationUsers] = $this->getFileChangeActivitySettings($fileId, $users); - $shouldFlush = $this->startActivityTransaction(); foreach ($users as $user) { $path = $pathMap[$user]; @@ -491,14 +500,14 @@ protected function generateDeleteActivities($users, $pathMap, $fileId, $oldFileN * @param string[] $pathMap * @param int $fileId * @param string $fileName + * @param array $filteredEmailUsers + * @param array $filteredNotificationUsers */ - protected function generateAddActivities($users, $pathMap, $fileId, $fileName) { + protected function generateAddActivities($users, $pathMap, $fileId, $fileName, array $filteredEmailUsers, array $filteredNotificationUsers) { if (empty($users)) { return; } - [$filteredEmailUsers, $filteredNotificationUsers] = $this->getFileChangeActivitySettings($fileId, $users); - $shouldFlush = $this->startActivityTransaction(); foreach ($users as $user) { $path = $pathMap[$user]; @@ -530,14 +539,14 @@ protected function generateAddActivities($users, $pathMap, $fileId, $fileName) { * @param string $oldFileName * @param int $newParentId * @param string $fileName + * @param array $filteredEmailUsers + * @param array $filteredNotificationUsers */ - protected function generateMoveActivities($users, $beforePathMap, $afterPathMap, $fileId, $oldFileName, $newParentId, $fileName) { + protected function generateMoveActivities($users, $beforePathMap, $afterPathMap, $fileId, $oldFileName, $newParentId, $fileName, array $filteredEmailUsers, array $filteredNotificationUsers) { if (empty($users)) { return; } - [$filteredEmailUsers, $filteredNotificationUsers] = $this->getFileChangeActivitySettings($fileId, $users); - $shouldFlush = $this->startActivityTransaction(); foreach ($users as $user) { if ($oldFileName === $fileName) {