From b343438f9eb5195fc9e3a1c8a5c1e2862bcc4b4f Mon Sep 17 00:00:00 2001 From: Mohammad Mahdi Date: Wed, 26 Feb 2025 13:41:43 +0330 Subject: [PATCH] Performance improvements on finding a random post for API and bot '/start' command --- Services/HandleStartMessage.cs | 16 ++++++++++------ Web/ServerStartup.cs | 15 +++++++++++---- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/Services/HandleStartMessage.cs b/Services/HandleStartMessage.cs index e17a3e5..546d331 100755 --- a/Services/HandleStartMessage.cs +++ b/Services/HandleStartMessage.cs @@ -24,15 +24,19 @@ public class HandleStartMessage // .Where(post => post.MediaAttachments.Any(media => media.Approved)) // .ToListAsync(); - var filter = Builders.Filter.ElemMatch(post => post.MediaAttachments, Builders.Filter.Eq(media => media.Approved, true)); - var mediaAttachmentsToSelect = await _db.Find(filter).ToListAsync(); + var filter = Builders.Filter.ElemMatch(post => post.MediaAttachments, + Builders.Filter.Eq(media => media.Approved, true)); + var projection = Builders.Projection + .Include(p => p.Url) + .Include(p => p.Account.DisplayName) + .Include(p => p.MediaAttachments); + + var selectedPost = await _db.Aggregate().Match(filter).Project(projection).Sample(1).FirstOrDefaultAsync(); - // select random approved media attachment - var selectedMediaAttachment = mediaAttachmentsToSelect[new Random().Next(mediaAttachmentsToSelect.Count)]; // send media attachment await _bot.SendPhoto(message.Chat.Id, - selectedMediaAttachment.MediaAttachments.FirstOrDefault(m => m.Approved == true).Url, - $"Here is your cat!🐈\n" + "" + + selectedPost.MediaAttachments.FirstOrDefault(m => m.Approved).RemoteUrl, + $"Here is your cat!🐈\n" + "" + $"View on Mastodon " + " ", ParseMode.Html , replyMarkup: new InlineKeyboardMarkup() .AddButton(InlineKeyboardButton.WithUrl("Join channel 😺", "https://t.me/catsofmastodon")) diff --git a/Web/ServerStartup.cs b/Web/ServerStartup.cs index 33c2558..1922e48 100755 --- a/Web/ServerStartup.cs +++ b/Web/ServerStartup.cs @@ -51,16 +51,23 @@ public class ServerStartup var stopwatch = Stopwatch.StartNew(); // Choose all posts media attachments that are approved - var filter = Builders.Filter.ElemMatch(post => post.MediaAttachments, Builders.Filter.Eq(media => media.Approved, true)); - var mediaAttachmentsToSelect = await _db.Find(filter).ToListAsync(); + var filter = Builders.Filter.ElemMatch(post => post.MediaAttachments, + Builders.Filter.Eq(media => media.Approved, true)); + var projection = Builders.Projection + .Include(p => p.Url) + .Include(p => p.Account.DisplayName) + .Include(p => p.MediaAttachments); + + var selectedPost = await _db.Aggregate().Match(filter).Project(projection).Sample(1).FirstOrDefaultAsync(); // Stop and print execution time stopwatch.Stop(); Console.WriteLine($"Query executed in: {stopwatch.ElapsedMilliseconds} ms"); - // Select random approved media attachment - var selectedPost = mediaAttachmentsToSelect[new Random().Next(mediaAttachmentsToSelect.Count)]; // Send as JSON + selectedPost.MediaAttachments = selectedPost.MediaAttachments + .Where(media => media.Approved) + .ToList(); await context.Response.WriteAsJsonAsync(selectedPost); }); });