diff options
| author | zyoshoka <107108195+zyoshoka@users.noreply.github.com> | 2024-05-31 15:32:42 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-31 15:32:42 +0900 |
| commit | 514a65e45330f09ad58cac3cab16bd888be80866 (patch) | |
| tree | 07e18b8462b1ad96651bba8d5633cdea6a8cd3a3 /packages/backend/src/server/api/endpoints/users | |
| parent | Update 1717117195275-inquiryUrl.js (diff) | |
| download | sharkey-514a65e45330f09ad58cac3cab16bd888be80866.tar.gz sharkey-514a65e45330f09ad58cac3cab16bd888be80866.tar.bz2 sharkey-514a65e45330f09ad58cac3cab16bd888be80866.zip | |
perf(backend): avoid N+1 selects from `user` table when packing many entities (#13911)
* perf(backend): avoid N+1 selects from `user` table when packing many entities
* perf(backend): use `packMany` instead of mapping to `pack`
Diffstat (limited to 'packages/backend/src/server/api/endpoints/users')
| -rw-r--r-- | packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts | 10 | ||||
| -rw-r--r-- | packages/backend/src/server/api/endpoints/users/show.ts | 6 |
2 files changed, 9 insertions, 7 deletions
diff --git a/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts b/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts index 02aa037466..9248a2fa68 100644 --- a/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts +++ b/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts @@ -118,12 +118,14 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint- const repliedUsersSorted = Object.keys(repliedUsers).sort((a, b) => repliedUsers[b] - repliedUsers[a]); // Extract top replied users - const topRepliedUsers = repliedUsersSorted.slice(0, ps.limit); + const topRepliedUserIds = repliedUsersSorted.slice(0, ps.limit); // Make replies object (includes weights) - const repliesObj = await Promise.all(topRepliedUsers.map(async (user) => ({ - user: await this.userEntityService.pack(user, me, { schema: 'UserDetailed' }), - weight: repliedUsers[user] / peak, + const _userMap = await this.userEntityService.packMany(topRepliedUserIds, me, { schema: 'UserDetailed' }) + .then(users => new Map(users.map(u => [u.id, u]))); + const repliesObj = await Promise.all(topRepliedUserIds.map(async (userId) => ({ + user: _userMap.get(userId) ?? await this.userEntityService.pack(userId, me, { schema: 'UserDetailed' }), + weight: repliedUsers[userId] / peak, }))); return repliesObj; diff --git a/packages/backend/src/server/api/endpoints/users/show.ts b/packages/backend/src/server/api/endpoints/users/show.ts index 26cfa921c5..062326e28d 100644 --- a/packages/backend/src/server/api/endpoints/users/show.ts +++ b/packages/backend/src/server/api/endpoints/users/show.ts @@ -117,9 +117,9 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint- if (user != null) _users.push(user); } - return await Promise.all(_users.map(u => this.userEntityService.pack(u, me, { - schema: 'UserDetailed', - }))); + const _userMap = await this.userEntityService.packMany(_users, me, { schema: 'UserDetailed' }) + .then(users => new Map(users.map(u => [u.id, u]))); + return _users.map(u => _userMap.get(u.id)!); } else { // Lookup user if (typeof ps.host === 'string' && typeof ps.username === 'string') { |