private static async Task WriteNewAuthorsCounts(DateTime @from, DateTime to, Guid taskId, AntiPlagiarismDb db, List <SnippetStatistics> snippetsStatistics, Dictionary <int, int> snippet2AuthorsCount) { foreach (var snippetStatistics in snippetsStatistics) { // snippet2AuthorsCount не содержит ключа, если с момента to не было посылок c этим сниппетом snippetStatistics.AuthorsCount = snippet2AuthorsCount.GetValueOrDefault(snippetStatistics.SnippetId); db.Entry(snippetStatistics).State = EntityState.Modified; } await db.SaveChangesAsync(); foreach (var snippetStatistics in snippetsStatistics) { db.Entry(snippetStatistics).State = EntityState.Unchanged; } log.Info($"New authors count are written for {snippetsStatistics.Count} snippets for task {taskId} from {@from.ToSortable()} to {to.ToSortable()}"); }
public async Task <SnippetOccurence> AddSnippetOccurenceAsync(Submission submission, Snippet snippet, int firstTokenIndex) { logger.Information($"Сохраняю в базу информацию о сниппете {snippet} в решении #{submission.Id} в позиции {firstTokenIndex}"); logger.Information($"Ищу сниппет {snippet} в базе (или создаю новый)"); var foundSnippet = await GetOrAddSnippetAsync(snippet); logger.Information($"Сниппет в базе имеет номер {foundSnippet.Id}"); var snippetOccurence = new SnippetOccurence { SubmissionId = submission.Id, Snippet = foundSnippet, FirstTokenIndex = firstTokenIndex, }; logger.Information($"Добавляю в базу объект {snippetOccurence}"); DisableAutoDetectChanges(); /* ...and use non-async Add() here because of perfomance issues with async versions */ db.SnippetsOccurences.Add(snippetOccurence); db.Entry(snippetOccurence).State = EntityState.Added; await db.SaveChangesAsync(); db.Entry(snippetOccurence).State = EntityState.Unchanged; EnableAutoDetectChanges(); logger.Information($"Добавил. Пересчитываю статистику сниппета (количество авторов, у которых он встречается)"); var snippetStatistics = await GetOrAddSnippetStatisticsAsync(foundSnippet, submission.TaskId, submission.ClientId); DisableAutoDetectChanges(); logger.Information($"Старая статистика сниппета {foundSnippet}: {snippetStatistics}"); /* Use non-async Add() here because of perfomance issues with async versions */ snippetStatistics.AuthorsCount = db.SnippetsOccurences.Include(o => o.Submission) .Where(o => o.SnippetId == foundSnippet.Id && o.Submission.ClientId == submission.ClientId && o.Submission.TaskId == submission.TaskId) .Select(o => o.Submission.AuthorId) .Distinct() .Count(); db.Entry(snippetStatistics).State = EntityState.Modified; logger.Information($"Количество авторов, у которых встречается сниппет {foundSnippet} — {snippetStatistics.AuthorsCount}"); await db.SaveChangesAsync(); db.Entry(snippetStatistics).State = EntityState.Unchanged; EnableAutoDetectChanges(); logger.Information($"Закончил сохранение в базу информации о сниппете {foundSnippet} в решении #{submission.Id} в позиции {firstTokenIndex}"); return(snippetOccurence); }