#268 adding method for computing missing poem rhythms

This commit is contained in:
Hamid Reza Mohammadi 2021-12-29 21:39:15 +03:30
parent 2afe20779a
commit 1f55ab69f5
6 changed files with 165 additions and 10 deletions

View File

@ -469,7 +469,6 @@ namespace RMuseum.Controllers
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + SecurableItem.ModifyOperationShortName)]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorPageCompleteViewModel))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.NotFound)]
public async Task<IActionResult> BatchRenameCatPoemTitles(int id, [FromBody]GanjoorBatchNamingModel model)
{
Guid userId =
@ -494,7 +493,6 @@ namespace RMuseum.Controllers
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + SecurableItem.ModifyOperationShortName)]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.NotFound)]
public IActionResult FindCategoryPoemsRhymes(int id, bool retag)
{
@ -506,7 +504,7 @@ namespace RMuseum.Controllers
}
/// <summary>
/// start assigning poem rhuthmes
/// start assigning poem rhythms
/// </summary>
/// <param name="id"></param>
/// <param name="retag"></param>
@ -517,7 +515,6 @@ namespace RMuseum.Controllers
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + SecurableItem.ModifyOperationShortName)]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.NotFound)]
public IActionResult FindCategoryPoemsRhythms(int id, bool retag, string rhythm = "")
{
@ -528,6 +525,26 @@ namespace RMuseum.Controllers
return Ok(res.Result);
}
/// <summary>
/// Start Finding Missing Rhythms
/// </summary>
/// <param name="onlyPoemsWithRhymes"></param>
/// <returns></returns>
[HttpPost]
[Route("startfindingmissingrhythms")]
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + SecurableItem.ModifyOperationShortName)]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public IActionResult StartFindingMissingRhythms(bool onlyPoemsWithRhymes)
{
RServiceResult<bool> res =
_ganjoorService.StartFindingMissingRhythms(onlyPoemsWithRhymes);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
}
/// <summary>
/// generate category toc
/// </summary>
@ -540,7 +557,6 @@ namespace RMuseum.Controllers
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + SecurableItem.ModifyOperationShortName)]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.NotFound)]
public async Task<IActionResult> GenerateTableOfContents(int id, GanjoorTOC options = GanjoorTOC.Analyse)
{
var res = await _ganjoorService.GenerateTableOfContents(id, options);
@ -559,7 +575,6 @@ namespace RMuseum.Controllers
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + SecurableItem.ModifyOperationShortName)]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.NotFound)]
public IActionResult StartGeneratingSubCatsTOC(int id)
{
Guid userId =

View File

@ -414,5 +414,10 @@ namespace RMuseum.DbContext
/// </summary>
public DbSet<RecitationApprovedMistake> RecitationApprovedMistakes { get; set; }
/// <summary>
/// probable metres
/// </summary>
public DbSet<GanjoorPoemProbableMetre> GanjoorPoemProbableMetres { get; set; }
}
}

View File

@ -843,13 +843,20 @@
</member>
<member name="M:RMuseum.Controllers.GanjoorController.FindCategoryPoemsRhythms(System.Int32,System.Boolean,System.String)">
<summary>
start assigning poem rhuthmes
start assigning poem rhythms
</summary>
<param name="id"></param>
<param name="retag"></param>
<param name="rhythm"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.GanjoorController.StartFindingMissingRhythms(System.Boolean)">
<summary>
Start Finding Missing Rhythms
</summary>
<param name="onlyPoemsWithRhymes"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.GanjoorController.GenerateTableOfContents(System.Int32,RMuseum.Models.Ganjoor.GanjoorTOC)">
<summary>
generate category toc
@ -2348,6 +2355,11 @@
recitation approved mistakes
</summary>
</member>
<member name="P:RMuseum.DbContext.RMuseumDbContext.GanjoorPoemProbableMetres">
<summary>
probable metres
</summary>
</member>
<member name="T:RMuseum.Models.Accounting.DonationExpenditure">
<summary>
donation expenditures
@ -5958,6 +5970,31 @@
had any effect on poem after moderation? effective in history
</summary>
</member>
<member name="T:RMuseum.Models.Ganjoor.GanjoorPoemProbableMetre">
<summary>
Probable Prosody Information for a poem
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorPoemProbableMetre.Id">
<summary>
Id
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorPoemProbableMetre.PoemId">
<summary>
poem id
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorPoemProbableMetre.Poem">
<summary>
poem
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorPoemProbableMetre.Metre">
<summary>
metre
</summary>
</member>
<member name="T:RMuseum.Models.Ganjoor.GanjoorPoemTranslation">
<summary>
poem translation
@ -9892,6 +9929,13 @@
<param name="retag"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorService.StartFindingMissingRhythms(System.Boolean)">
<summary>
Start finding missing rhthms
</summary>
<param name="onlyPoemsWithRhymes"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorService.FindPoemRhythm(System.Int32)">
<summary>
find poem rhythm
@ -11303,6 +11347,13 @@
<param name="rhythm"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.StartFindingMissingRhythms(System.Boolean)">
<summary>
Start finding missing rhthms
</summary>
<param name="onlyPoemsWithRhymes"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.StartGeneratingSubCatsTOC(System.Guid,System.Int32)">
<summary>
start generating sub cats TOC

View File

@ -557,6 +557,13 @@ namespace RMuseum.Services
/// <returns></returns>
RServiceResult<bool> FindCategoryPoemsRhymes(int catId, bool retag);
/// <summary>
/// Start finding missing rhthms
/// </summary>
/// <param name="onlyPoemsWithRhymes"></param>
/// <returns></returns>
RServiceResult<bool> StartFindingMissingRhythms(bool onlyPoemsWithRhymes);
/// <summary>
/// find poem rhythm
/// </summary>

View File

@ -96,6 +96,64 @@ namespace RMuseum.Services.Implementation
return new RServiceResult<bool>(true);
}
/// <summary>
/// Start finding missing rhthms
/// </summary>
/// <param name="onlyPoemsWithRhymes"></param>
/// <returns></returns>
public RServiceResult<bool> StartFindingMissingRhythms(bool onlyPoemsWithRhymes)
{
_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($"StartFindingMissingRhythms", "Query data")).Result;
try
{
var poemIds = await context.GanjoorPoems.AsNoTracking().Where(p => p.GanjoorMetreId == null && (onlyPoemsWithRhymes == false || !string.IsNullOrEmpty(p.RhymeLetters))).Select(p => p.Id).ToArrayAsync();
await jobProgressServiceEF.UpdateJob(job.Id, 0, $"Total: {poemIds.Length}");
var metres = (await GetGanjoorMetres()).Result.Select(m => m.Rhythm).ToArray();
using (HttpClient httpClient = new HttpClient())
{
for (int i = 0; i < poemIds.Length; i++)
{
var id = poemIds[i];
if ((await context.GanjoorPoemProbableMetres.Where(p => p.PoemId == id).AnyAsync()) == true)
continue;
var res = await _FindPoemRhythm(id, _context, httpClient, metres, true );
if (res.Result == null)
res.Result = "";
GanjoorPoemProbableMetre prometre = new GanjoorPoemProbableMetre()
{
PoemId = id,
Metre = res.Result
};
context.GanjoorPoemProbableMetres.Add(prometre);
await jobProgressServiceEF.UpdateJob(job.Id, i);
}
}
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", true);
}
catch (Exception exp)
{
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, exp.ToString());
}
}
});
return new RServiceResult<bool>(true);
}
private async Task _GeneratingSubCatsTOC(Guid userId, RMuseumDbContext context, LongRunningJobProgressServiceEF jobProgressServiceEF, RLongRunningJobStatus job, int catId)
{
foreach (var cat in await context.GanjoorCategories.AsNoTracking().Where(c => c.ParentId == catId).ToListAsync())

View File

@ -3643,16 +3643,18 @@ namespace RMuseum.Services.Implementation
var metres = (await GetGanjoorMetres()).Result.Select(m => m.Rhythm).ToArray();
return await _FindPoemRhythm(id, _context, _httpClient, metres);
}
private async Task<RServiceResult<string>> _FindPoemRhythm(int id, RMuseumDbContext context, HttpClient httpClient, string[] metres)
private async Task<RServiceResult<string>> _FindPoemRhythm(int id, RMuseumDbContext context, HttpClient httpClient, string[] metres, bool alwaysReturnaAResult = false)
{
try
{
var verses = await context.GanjoorVerses.Where(v => v.PoemId == id).OrderBy(v => v.VOrder).ToListAsync();
var verses = await context.GanjoorVerses.AsNoTracking().Where(v => v.PoemId == id).OrderBy(v => v.VOrder).ToListAsync();
Dictionary<string, int> rhytmCounter = new Dictionary<string, int>();
foreach (var verse in verses)
for (int i = 0; i < Math.Max(verses.Count, 20); i++)
{
var verse = verses[i];
try
{
var response = await httpClient.GetAsync($"http://sorud.info/?Text={HttpUtility.UrlEncode(LanguageUtils.MakeTextSearchable(verse.Text))}");
@ -3726,6 +3728,23 @@ namespace RMuseum.Services.Implementation
}
}
if(alwaysReturnaAResult)
{
int maxCount = -1;
string rhytm = "";
foreach (var r in rhytmCounter)
{
if(r.Value > maxCount)
{
maxCount = r.Value;
rhytm = r.Key;
}
}
if (!string.IsNullOrEmpty(rhytm))
return new RServiceResult<string>(rhytm);
}
return new RServiceResult<string>("");
}
catch (Exception exp)