public void Run(StatisticsOperation statisticsOperation, StatisticsSource statisticsSource = StatisticsSource.None) { // sources: all, w/o hg, only one artifact IEnumerable <int> ids = new List <int>(); var postfix = string.Empty; switch (statisticsSource) { case StatisticsSource.All: using (var context = new ExpertiseDBEntities()) { ids = context.ActualReviewers.Select(ar => ar.ActualReviewerId).ToList(); } break; case StatisticsSource.WithoutHg: ids = GetReviewsWithoutHg(); postfix = "_wo_hg"; break; case StatisticsSource.OnlyOneArtifact: ids = GetReviewsWithOnlyOneArtifact(); postfix = "_only_one"; break; } switch (statisticsOperation) { case StatisticsOperation.FindMissingReviewers: ReadUniqueActualReviewers(); ReadUniqueComputedReviewers(); ReadMissingReviewers(); var missing = GetAuthorsFromFile(basepath + "reviewers_missing.txt"); var missingReviewers = GetAuthorsWhoAreNotInDb(missing); File.WriteAllText(basepath + "reviewers_missing_in_db.txt", missingReviewers); break; case StatisticsOperation.AnalyzeActualReviews: ReadUniqueActualReviewers(); ReadUniqueComputedReviewers(); AnalyzeActualReviews(ids); break; case StatisticsOperation.ComputeStatisticsForAllAlgorithmsAndActualReviews: ComputeStatisticsForAllAlgorithmsAndActualReviews(ids, postfix); break; case StatisticsOperation.FindIntersectingEntriesForAllAlgorithms: FindIntersectingEntriesForActualReviewerIds(ids, postfix); break; case StatisticsOperation.FindIntersectingEntriesForAllAlgorithmsPairwise: FindIntersectingEntriesPairwiseForActualReviewerIds(ids, postfix); break; default: throw new ArgumentOutOfRangeException("statisticsOperation"); } }
/// <summary> /// Factory Method for Sources /// </summary> public static AbstractSourceOfBugs createSourceFromParameter(StatisticsSource typeOfSource, int repositoryId, string[] additionalParameters) { switch (typeOfSource) { case StatisticsSource.All: if (additionalParameters != null && additionalParameters.Length > 0) { throw new ArgumentException("No additional parameters expected, but those were present", "additionalParameters"); } return(new SourceOfAllBugs(repositoryId)); case StatisticsSource.WithoutHg: if (additionalParameters != null && additionalParameters.Length > 0) { throw new ArgumentException("No additional parameters expected, but those were present", "additionalParameters"); } return(new SourceOfBugsWithoutSpecificReviewer(repositoryId)); case StatisticsSource.MinimumId: if (additionalParameters.Length != 1) { throw new ArgumentException("Exactly one additional parameters expected, but this was not the case", "additionalParameters"); } return(new SourceOfBugsWithMinID(repositoryId, int.Parse(additionalParameters[0]))); default: throw new NotImplementedException("The type \"" + typeOfSource + "\" is unknown"); } }
/// <inheritdoc/> public async Task <(ulong, int)> GetMostActiveChannelAndMessageCountAsync(StatisticsSource source, TimeSpan span, ulong guildId, ulong userId = 0) { var messages = new List <MessageSummary>(); switch (source) { case StatisticsSource.Guild: { messages = await _hiromiContext .Messages .AsNoTracking() .Where(x => x.GuildId == guildId) .Select(MessageSummary.FromEntityProjection) .ToListAsync(); break; } case StatisticsSource.User: { messages = await _hiromiContext .Messages .AsNoTracking() .Where(x => x.GuildId == guildId) .Where(x => x.UserId == userId) .Select(MessageSummary.FromEntityProjection) .ToListAsync(); break; } } var earliest = DateTime.Now.Subtract(span); var filtered = messages.Where(x => x.TimeSent > earliest); var final = new List <ulong>(); final.AddRange(filtered.Select(x => x.ChannelId)); var(channelId, count) = final .GroupBy(x => x) .ToDictionary(x => x.Key, x => x.Count()) .OrderByDescending(x => x.Value) .FirstOrDefault(); return(channelId, count); }
/// <inheritdoc/> public async Task <int> GetMessageCountAsync(StatisticsSource source, TimeSpan span, ulong guildId, ulong userId = 0) { var messages = new List <MessageSummary>(); switch (source) { case StatisticsSource.Guild: { messages = await _hiromiContext .Messages .AsNoTracking() .Where(x => x.GuildId == guildId) .Select(MessageSummary.FromEntityProjection) .ToListAsync(); break; } case StatisticsSource.User: { messages = await _hiromiContext .Messages .AsNoTracking() .Where(x => x.GuildId == guildId) .Where(x => x.UserId == userId) .Select(MessageSummary.FromEntityProjection) .ToListAsync(); break; } } var earliest = DateTime.Now.Subtract(span); return(messages.Count(x => x.TimeSent >= earliest)); }