#268 adding method for computing missing poem rhythms
This commit is contained in:
parent
2afe20779a
commit
1f55ab69f5
@ -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 =
|
||||
|
||||
@ -414,5 +414,10 @@ namespace RMuseum.DbContext
|
||||
/// </summary>
|
||||
public DbSet<RecitationApprovedMistake> RecitationApprovedMistakes { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// probable metres
|
||||
/// </summary>
|
||||
public DbSet<GanjoorPoemProbableMetre> GanjoorPoemProbableMetres { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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())
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user