[backend/core] Skip database queries for 0 member collections
This commit is contained in:
parent
715f47cafc
commit
02b80a1a2a
4 changed files with 32 additions and 14 deletions
|
@ -119,8 +119,9 @@ public class NoteRenderer(
|
|||
return res;
|
||||
}
|
||||
|
||||
private async Task<List<MentionEntity>> GetMentions(IEnumerable<Note> notes)
|
||||
private async Task<List<MentionEntity>> GetMentions(List<Note> notes)
|
||||
{
|
||||
if (notes.Count == 0) return [];
|
||||
var ids = notes.SelectMany(n => n.Mentions).Distinct();
|
||||
return await db.Users.IncludeCommonProperties()
|
||||
.Where(p => ids.Contains(p.Id))
|
||||
|
@ -128,8 +129,9 @@ public class NoteRenderer(
|
|||
.ToListAsync();
|
||||
}
|
||||
|
||||
private async Task<List<AttachmentEntity>> GetAttachments(IEnumerable<Note> notes)
|
||||
private async Task<List<AttachmentEntity>> GetAttachments(List<Note> notes)
|
||||
{
|
||||
if (notes.Count == 0) return [];
|
||||
var ids = notes.SelectMany(n => n.FileIds).Distinct();
|
||||
return await db.DriveFiles.Where(p => ids.Contains(p.Id))
|
||||
.Select(f => new AttachmentEntity
|
||||
|
@ -146,14 +148,16 @@ public class NoteRenderer(
|
|||
.ToListAsync();
|
||||
}
|
||||
|
||||
internal async Task<List<AccountEntity>> GetAccounts(IEnumerable<User> users)
|
||||
internal async Task<List<AccountEntity>> GetAccounts(List<User> users)
|
||||
{
|
||||
if (users.Count == 0) return [];
|
||||
return (await userRenderer.RenderManyAsync(users.DistinctBy(p => p.Id))).ToList();
|
||||
}
|
||||
|
||||
private async Task<List<string>> GetLikedNotes(IEnumerable<Note> notes, User? user)
|
||||
private async Task<List<string>> GetLikedNotes(List<Note> notes, User? user)
|
||||
{
|
||||
if (user == null) return [];
|
||||
if (notes.Count == 0) return [];
|
||||
return await db.NoteLikes.Where(p => p.User == user && notes.Contains(p.Note))
|
||||
.Select(p => p.NoteId)
|
||||
.ToListAsync();
|
||||
|
@ -162,6 +166,7 @@ public class NoteRenderer(
|
|||
private async Task<List<ReactionEntity>> GetReactions(List<Note> notes, User? user)
|
||||
{
|
||||
if (user == null) return [];
|
||||
if (notes.Count == 0) return [];
|
||||
var counts = notes.ToDictionary(p => p.Id, p => p.Reactions);
|
||||
var res = await db.NoteReactions
|
||||
.Where(p => notes.Contains(p.Note))
|
||||
|
@ -190,26 +195,29 @@ public class NoteRenderer(
|
|||
return res;
|
||||
}
|
||||
|
||||
private async Task<List<string>> GetBookmarkedNotes(IEnumerable<Note> notes, User? user)
|
||||
private async Task<List<string>> GetBookmarkedNotes(List<Note> notes, User? user)
|
||||
{
|
||||
if (user == null) return [];
|
||||
if (notes.Count == 0) return [];
|
||||
return await db.NoteBookmarks.Where(p => p.User == user && notes.Contains(p.Note))
|
||||
.Select(p => p.NoteId)
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
private async Task<List<string>> GetPinnedNotes(IEnumerable<Note> notes, User? user)
|
||||
private async Task<List<string>> GetPinnedNotes(List<Note> notes, User? user)
|
||||
{
|
||||
if (user == null) return [];
|
||||
if (notes.Count == 0) return [];
|
||||
return await db.UserNotePins.Where(p => p.User == user && notes.Contains(p.Note))
|
||||
.Select(p => p.NoteId)
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
private async Task<List<string>> GetRenotes(IEnumerable<Note> notes, User? user)
|
||||
private async Task<List<string>> GetRenotes(List<Note> notes, User? user)
|
||||
{
|
||||
if (user == null) return [];
|
||||
return await db.Notes.Where(p => p.User == user && p.IsPureRenote && notes.Contains(p.Renote))
|
||||
if (notes.Count == 0) return [];
|
||||
return await db.Notes.Where(p => p.User == user && p.IsPureRenote && notes.Contains(p.Renote!))
|
||||
.Select(p => p.RenoteId)
|
||||
.Where(p => p != null)
|
||||
.Distinct()
|
||||
|
@ -217,8 +225,9 @@ public class NoteRenderer(
|
|||
.ToListAsync();
|
||||
}
|
||||
|
||||
private async Task<List<PollEntity>> GetPolls(IEnumerable<Note> notes, User? user)
|
||||
private async Task<List<PollEntity>> GetPolls(List<Note> notes, User? user)
|
||||
{
|
||||
if (notes.Count == 0) return [];
|
||||
var polls = await db.Polls.Where(p => notes.Contains(p.Note))
|
||||
.ToListAsync();
|
||||
|
||||
|
@ -252,10 +261,12 @@ public class NoteRenderer(
|
|||
.Cast<Note>()
|
||||
.DistinctBy(p => p.Id)
|
||||
.ToList();
|
||||
|
||||
if (noteList.Count == 0) return [];
|
||||
|
||||
var data = new NoteRendererDto
|
||||
{
|
||||
Accounts = accounts ?? await GetAccounts(noteList.Select(p => p.User)),
|
||||
Accounts = accounts ?? await GetAccounts(noteList.Select(p => p.User).ToList()),
|
||||
Mentions = await GetMentions(noteList),
|
||||
Attachments = await GetAttachments(noteList),
|
||||
Polls = await GetPolls(noteList, user),
|
||||
|
|
|
@ -41,6 +41,7 @@ public class NotificationRenderer(NoteRenderer noteRenderer, UserRenderer userRe
|
|||
)
|
||||
{
|
||||
var notificationList = notifications.ToList();
|
||||
if (notificationList.Count == 0) return [];
|
||||
|
||||
var accounts = await noteRenderer.GetAccounts(notificationList.Where(p => p.Notifier != null)
|
||||
.Select(p => p.Notifier)
|
||||
|
@ -49,7 +50,8 @@ public class NotificationRenderer(NoteRenderer noteRenderer, UserRenderer userRe
|
|||
.Select(p => p.Note?.Renote?.User)
|
||||
.Where(p => p != null))
|
||||
.Cast<User>()
|
||||
.DistinctBy(p => p.Id));
|
||||
.DistinctBy(p => p.Id)
|
||||
.ToList());
|
||||
|
||||
var notes = await noteRenderer.RenderManyAsync(notificationList.Where(p => p.Note != null)
|
||||
.Select(p => p.Note)
|
||||
|
|
|
@ -104,6 +104,7 @@ public class UserRenderer(IOptions<Config.InstanceSection> config, MfmConverter
|
|||
public async Task<IEnumerable<AccountEntity>> RenderManyAsync(IEnumerable<User> users)
|
||||
{
|
||||
var userList = users.ToList();
|
||||
if (userList.Count == 0) return [];
|
||||
var emoji = await GetEmoji(userList);
|
||||
return await userList.Select(p => RenderAsync(p, emoji)).AwaitAllAsync();
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
using Iceshrimp.Backend.Controllers.Schemas;
|
||||
using Iceshrimp.Backend.Controllers.Schemas;
|
||||
using Iceshrimp.Backend.Core.Database;
|
||||
using Iceshrimp.Backend.Core.Database.Tables;
|
||||
using Iceshrimp.Backend.Core.Extensions;
|
||||
|
@ -69,14 +69,16 @@ public class NoteRenderer(UserRenderer userRenderer, DatabaseContext db, EmojiSe
|
|||
_ => throw new ArgumentOutOfRangeException(nameof(visibility), visibility, null)
|
||||
};
|
||||
|
||||
private async Task<List<UserResponse>> GetUsers(IEnumerable<Note> notesList)
|
||||
private async Task<List<UserResponse>> GetUsers(List<Note> notesList)
|
||||
{
|
||||
if (notesList.Count == 0) return [];
|
||||
var users = notesList.Select(p => p.User).DistinctBy(p => p.Id);
|
||||
return await userRenderer.RenderMany(users).ToListAsync();
|
||||
}
|
||||
|
||||
private async Task<List<NoteAttachment>> GetAttachments(IEnumerable<Note> notesList)
|
||||
private async Task<List<NoteAttachment>> GetAttachments(List<Note> notesList)
|
||||
{
|
||||
if (notesList.Count == 0) return [];
|
||||
var ids = notesList.SelectMany(p => p.FileIds).Distinct();
|
||||
var files = await db.DriveFiles.Where(p => ids.Contains(p.Id)).ToListAsync();
|
||||
return files.Select(p => new NoteAttachment
|
||||
|
@ -93,6 +95,7 @@ public class NoteRenderer(UserRenderer userRenderer, DatabaseContext db, EmojiSe
|
|||
private async Task<List<NoteReactionSchema>> GetReactions(List<Note> notes, User? user)
|
||||
{
|
||||
if (user == null) return [];
|
||||
if (notes.Count == 0) return [];
|
||||
var counts = notes.ToDictionary(p => p.Id, p => p.Reactions);
|
||||
var res = await db.NoteReactions
|
||||
.Where(p => notes.Contains(p.Note))
|
||||
|
@ -130,6 +133,7 @@ public class NoteRenderer(UserRenderer userRenderer, DatabaseContext db, EmojiSe
|
|||
public async Task<IEnumerable<NoteResponse>> RenderMany(IEnumerable<Note> notes, User? user)
|
||||
{
|
||||
var notesList = notes.ToList();
|
||||
if (notesList.Count == 0) return [];
|
||||
var allNotes = GetAllNotes(notesList);
|
||||
var data = new NoteRendererDto
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue