mirror of
https://github.com/Bubuni-Team/telegram-bot.git
synced 2026-07-31 00:29:24 +03:00
increase speed of mysql when searching posts
This commit is contained in:
@@ -0,0 +1,21 @@
|
|||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Kruzya.TelegramBot.Core.Service
|
||||||
|
{
|
||||||
|
public class Hash
|
||||||
|
{
|
||||||
|
public string GenerateHash(string input)
|
||||||
|
{
|
||||||
|
var output = string.Empty;
|
||||||
|
var hashedBytes = SHA256.HashData(Encoding.UTF8.GetBytes(input));
|
||||||
|
|
||||||
|
foreach (var b in hashedBytes)
|
||||||
|
{
|
||||||
|
output += string.Format("{0,2:x2}", b);
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -59,6 +59,8 @@ public class Startup
|
|||||||
services.AddScoped<IOptionProvider, DbOptionProvider>();
|
services.AddScoped<IOptionProvider, DbOptionProvider>();
|
||||||
services.AddHttpClient();
|
services.AddHttpClient();
|
||||||
|
|
||||||
|
services.AddSingleton<Hash>();
|
||||||
|
|
||||||
// Trigger module handlers.
|
// Trigger module handlers.
|
||||||
_core.Modules.ConfigureServices(services);
|
_core.Modules.ConfigureServices(services);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ public class Post : RepresentableEntity
|
|||||||
/// The URI where this post is located in web.
|
/// The URI where this post is located in web.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Required]
|
[Required]
|
||||||
[MaxLength(256)]
|
[MaxLength(1024)]
|
||||||
public string Url { get; set; }
|
public string Url { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -83,6 +83,13 @@ public class Post : RepresentableEntity
|
|||||||
[Required]
|
[Required]
|
||||||
public DateTime ReceivedAt { get; set; }
|
public DateTime ReceivedAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
[Required]
|
||||||
|
[MaxLength(64)]
|
||||||
|
public string UrlHash { get; set; }
|
||||||
|
|
||||||
public Post()
|
public Post()
|
||||||
{
|
{
|
||||||
PostId = new Guid();
|
PostId = new Guid();
|
||||||
|
|||||||
@@ -61,11 +61,15 @@ internal static class RichSiteSummaryRepositoryExtension
|
|||||||
await repository.ForFetching(period, 25);
|
await repository.ForFetching(period, 25);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Post
|
#region Post
|
||||||
|
|
||||||
|
[Obsolete("Use ByFeedAndUrlHash()")]
|
||||||
public static async Task<Post> ByFeedAndUrl(this DbSet<Post> repository, string url, Feed feed = null) =>
|
public static async Task<Post> ByFeedAndUrl(this DbSet<Post> repository, string url, Feed feed = null) =>
|
||||||
await repository.FirstOrDefaultAsync(post => post.Url == url && (feed == null || post.Feed == feed));
|
await repository.FirstOrDefaultAsync(post => post.Url == url && (feed == null || post.Feed == feed));
|
||||||
|
|
||||||
|
public static async Task<Post> ByFeedAndUrlHash(this DbSet<Post> repository, string urlHash, Feed feed = null) =>
|
||||||
|
await repository.FirstOrDefaultAsync(post => post.UrlHash == urlHash && (feed == null || post.Feed == feed));
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
@@ -19,6 +19,7 @@ using Telegram.Bot.Types.Enums;
|
|||||||
using Feed = Kruzya.TelegramBot.RichSiteSummary.Data.Feed;
|
using Feed = Kruzya.TelegramBot.RichSiteSummary.Data.Feed;
|
||||||
|
|
||||||
using CodeHollow.FeedReader.Feeds;
|
using CodeHollow.FeedReader.Feeds;
|
||||||
|
using Kruzya.TelegramBot.Core.Service;
|
||||||
|
|
||||||
namespace Kruzya.TelegramBot.RichSiteSummary.Service;
|
namespace Kruzya.TelegramBot.RichSiteSummary.Service;
|
||||||
|
|
||||||
@@ -35,14 +36,16 @@ public class RssFetch : IHostedService, IDisposable
|
|||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
private readonly IServiceScopeFactory _scopeFactory;
|
private readonly IServiceScopeFactory _scopeFactory;
|
||||||
private readonly ConcurrentQueue<UserMessage> _queue;
|
private readonly ConcurrentQueue<UserMessage> _queue;
|
||||||
|
private readonly Hash _hash;
|
||||||
|
|
||||||
private static TimeSpan TimerPeriod => TimeSpan.FromSeconds(45);
|
private static TimeSpan TimerPeriod => TimeSpan.FromSeconds(45);
|
||||||
|
|
||||||
public RssFetch(ILogger<RssFetch> logger, ConcurrentQueue<UserMessage> queue, IServiceScopeFactory scopeFactory)
|
public RssFetch(ILogger<RssFetch> logger, ConcurrentQueue<UserMessage> queue, IServiceScopeFactory scopeFactory, Hash hash)
|
||||||
{
|
{
|
||||||
_scopeFactory = scopeFactory;
|
_scopeFactory = scopeFactory;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_queue = queue;
|
_queue = queue;
|
||||||
|
_hash = hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
#region IHostedService
|
#region IHostedService
|
||||||
@@ -132,7 +135,7 @@ public class RssFetch : IHostedService, IDisposable
|
|||||||
var postsImages = new Dictionary<Post, string>();
|
var postsImages = new Dictionary<Post, string>();
|
||||||
foreach (var post in parsedFeed.Items)
|
foreach (var post in parsedFeed.Items)
|
||||||
{
|
{
|
||||||
feedPost = await dbContext.Posts.ByFeedAndUrl(post.Link, feed);
|
feedPost = await dbContext.Posts.ByFeedAndUrlHash(_hash.GenerateHash(post.Link), feed);
|
||||||
if (feedPost != null)
|
if (feedPost != null)
|
||||||
{
|
{
|
||||||
// skip. This post already exists.
|
// skip. This post already exists.
|
||||||
@@ -144,6 +147,7 @@ public class RssFetch : IHostedService, IDisposable
|
|||||||
feedPost.Title = post.Title;
|
feedPost.Title = post.Title;
|
||||||
feedPost.Url = post.Link;
|
feedPost.Url = post.Link;
|
||||||
feedPost.PostedAt = post.PublishingDate.GetValueOrDefault(DateTime.Now);
|
feedPost.PostedAt = post.PublishingDate.GetValueOrDefault(DateTime.Now);
|
||||||
|
feedPost.UrlHash = _hash.GenerateHash(feedPost.Url);
|
||||||
|
|
||||||
postsImages.Add(feedPost, await FetchImageUrl(post));
|
postsImages.Add(feedPost, await FetchImageUrl(post));
|
||||||
newPosts.Add(feedPost);
|
newPosts.Add(feedPost);
|
||||||
|
|||||||
Reference in New Issue
Block a user