Beispiel #1
0
        public async Task <SnippetOccurence> AddSnippetOccurenceAsync(Submission submission, Snippet snippet, int firstTokenIndex)
        {
            var foundSnippet = await GetOrAddSnippetAsync(snippet);

            var snippetOccurence = new SnippetOccurence
            {
                SubmissionId    = submission.Id,
                Snippet         = foundSnippet,
                FirstTokenIndex = firstTokenIndex,
            };
            await db.SnippetsOccurences.AddAsync(snippetOccurence);

            await db.SaveChangesAsync();

            var snippetStatistics = await GetOrAddSnippetStatisticsAsync(foundSnippet, submission.TaskId, submission.ClientId);

            snippetStatistics.AuthorsCount = await 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()
                                             .CountAsync();

            await db.SaveChangesAsync();

            return(snippetOccurence);
        }
Beispiel #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);
        }