Пример #1
0
        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()}");
        }
Пример #2
0
        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);
        }