#444 FillCategoryWordCountSummaries

This commit is contained in:
Hamid Reza Mohammadi 2024-06-26 12:20:15 +03:30
parent 948553a46b
commit 41e08ce766
6 changed files with 161 additions and 0 deletions

View File

@ -4213,6 +4213,21 @@ namespace RMuseum.Controllers
_ganjoorService.FillCategoryWordCountsRowNmbrInCat();
return Ok();
}
/// <summary>
/// one time fixer for category word count summries
/// </summary>
/// <returns></returns>
[HttpPut("wordcounts/fillwordcountsummeries")]
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + SecurableItem.ModifyOperationShortName)]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public IActionResult FillCategoryWordCountSummaries()
{
_ganjoorService.FillCategoryWordCountSummaries();
return Ok();
}
/// <summary>
/// category word counts

View File

@ -200,6 +200,11 @@ namespace RMuseum.DbContext
.HasIndex(v => new { v.CatId, v.Word })
.IsUnique();
builder.Entity<CategoryWordCountSummary>()
.HasIndex(v => new { v.CatId })
.IsUnique();
}
@ -589,5 +594,10 @@ namespace RMuseum.DbContext
/// </summary>
public DbSet<CategoryWordCount> CategoryWordCounts { get; set; }
/// <summary>
/// Category Word Count Summaries
/// </summary>
public DbSet<CategoryWordCountSummary> CategoryWordCountSummaries { get; set; }
}
}

View File

@ -0,0 +1,28 @@
using System;
namespace RMuseum.Models.Ganjoor
{
public class CategoryWordCountSummary
{
/// <summary>
/// id
/// </summary>
public Guid Id { get; set; }
/// <summary>
/// CatId
/// </summary>
public int CatId { get; set; }
/// <summary>
/// unique word count
/// </summary>
public int UniqueWordCount { get; set; }
/// <summary>
/// total word count
/// </summary>
public int TotalWordCount { get; set; }
}
}

View File

@ -2220,6 +2220,12 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.GanjoorController.FillCategoryWordCountSummaries">
<summary>
one time fixer for category word count summries
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.GanjoorController.GetCategoryWordCountsAsync(System.Int32,System.String,RSecurityBackend.Models.Generic.PagingParameterModel)">
<summary>
category word counts
@ -3585,6 +3591,11 @@
Category Word Counts
</summary>
</member>
<member name="P:RMuseum.DbContext.RMuseumDbContext.CategoryWordCountSummaries">
<summary>
Category Word Count Summaries
</summary>
</member>
<member name="T:RMuseum.Migrations.PictureFileExtUrl">
<inheritdoc />
</member>
@ -7244,6 +7255,26 @@
row number in category
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.CategoryWordCountSummary.Id">
<summary>
id
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.CategoryWordCountSummary.CatId">
<summary>
CatId
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.CategoryWordCountSummary.UniqueWordCount">
<summary>
unique word count
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.CategoryWordCountSummary.TotalWordCount">
<summary>
total word count
</summary>
</member>
<member name="T:RMuseum.Models.Ganjoor.CorrectionReviewResult">
<summary>
correction review result
@ -16581,6 +16612,11 @@
fill CategoryWordCounts.RowNmbrInCat
</summary>
</member>
<member name="M:RMuseum.Services.IGanjoorService.FillCategoryWordCountSummaries">
<summary>
fill CategoryWordCountSummaries
</summary>
</member>
<member name="M:RMuseum.Services.IGanjoorService.GetCategoryWordCountsAsync(System.Int32,System.String,RSecurityBackend.Models.Generic.PagingParameterModel)">
<summary>
category words count
@ -18163,6 +18199,11 @@
fill CategoryWordCounts.RowNmbrInCat
</summary>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.FillCategoryWordCountSummaries">
<summary>
fill CategoryWordCountSummaries
</summary>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.SetCategoryPoemFormatAsync(System.Int32,System.Nullable{RMuseum.Models.Ganjoor.GanjoorPoemFormat})">
<summary>
set category poem format tag for poems consisting of a single whole poem section

View File

@ -1443,6 +1443,11 @@ namespace RMuseum.Services
/// </summary>
void FillCategoryWordCountsRowNmbrInCat();
/// <summary>
/// fill CategoryWordCountSummaries
/// </summary>
void FillCategoryWordCountSummaries();
/// <summary>
/// category words count
/// </summary>

View File

@ -265,6 +265,68 @@ namespace RMuseum.Services.Implementation
}
/// <summary>
/// fill CategoryWordCountSummaries
/// </summary>
public void FillCategoryWordCountSummaries()
{
_backgroundTaskQueue.QueueBackgroundWorkItem
(
async token =>
{
using (RMuseumDbContext context = new RMuseumDbContext(new DbContextOptions<RMuseumDbContext>())) //this is long running job, so _context might be already been freed/collected by GC
{
LongRunningJobProgressServiceEF jobProgressServiceEF = new LongRunningJobProgressServiceEF(context);
var job = (await jobProgressServiceEF.NewJob($"FillCategoryWordCountSummaries", "Query data")).Result;
try
{
var poets = await context.GanjoorPoets.AsNoTracking().Where(p => p.Published).OrderBy(p => p.Id).ToListAsync();
foreach (var poet in poets)
{
var poetCat = await context.GanjoorCategories.AsNoTracking().Where(c => c.PoetId == poet.Id && c.ParentId == null).SingleAsync();
await jobProgressServiceEF.UpdateJob(job.Id, poet.Id, poet.Nickname);
if (true == await context.CategoryWordCounts.Where(c => c.CatId == poetCat.Id).AnyAsync())
{
List<int> catIdList = new List<int>
{
poetCat.Id
};
await _populateCategoryChildren(context, poetCat.Id, catIdList);
foreach (var catId in catIdList)
{
var uniqueCount = await context.CategoryWordCounts.Where(w => w.CatId == catId).CountAsync();
if (uniqueCount > 0)
{
var totalCount = await context.CategoryWordCounts.Where(w => w.CatId == catId).SumAsync(w => w.Count);
context.Add
(
new CategoryWordCountSummary()
{
CatId = catId,
UniqueWordCount = uniqueCount,
TotalWordCount = totalCount
}
);
await jobProgressServiceEF.UpdateJob(job.Id, poet.Id, poet.Nickname + $": Saving {catId}");
}
}
}
}
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", true);
}
catch (Exception exp)
{
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, exp.ToString());
}
}
});
}
}
}