public override void Collect(int doc) { int slot = ordSet.Find(groupFieldTermIndex.GetOrd(doc)); if (slot < 0) { return; } GroupCount gc = groupCounts[slot]; int countOrd = countFieldTermIndex.GetOrd(doc); if (DoesNotContainOrd(countOrd, gc.ords)) { if (countOrd == -1) { ((ISet <BytesRef>)gc.UniqueValues).Add(null); } else { BytesRef br = new BytesRef(); countFieldTermIndex.LookupOrd(countOrd, br); ((ISet <BytesRef>)gc.UniqueValues).Add(br); } gc.ords = Arrays.CopyOf(gc.ords, gc.ords.Length + 1); gc.ords[gc.ords.Length - 1] = countOrd; if (gc.ords.Length > 1) { Array.Sort(gc.ords); } } }
/// <summary> /// Return a dictionary of Crashes per group grouped by week. /// </summary> /// <param name="Crashes">A set of Crashes to interrogate.</param> /// <param name="UserGroupId">The id of the user group to interrogate.</param> /// <returns>A dictionary of week vs. Crash count.</returns> public Dictionary <DateTime, int> GetWeeklyCountsByGroup(List <FCrashMinimal> Crashes, int UserGroupId) { using (FAutoScopedLogTimer LogTimer = new FAutoScopedLogTimer(this.GetType().ToString() + "(UserGroupId=" + UserGroupId + ")")) { Dictionary <DateTime, int> Results = new Dictionary <DateTime, int>(); var UsersIds = new HashSet <int>(_entities.Users.Distinct().Select(data => data.Id)); // Trim Crashes to user group. if (UserGroupId != DashboardController.AllUserGroupId) { Crashes = Crashes.Where(Crash => UsersIds.Contains(Crash.UserId)).ToList(); } try { Results = ( from CrashDetail in Crashes group CrashDetail by CrashDetail.TimeOfCrash.AddDays(-(int)CrashDetail.TimeOfCrash.DayOfWeek).Date into GroupCount orderby GroupCount.Key select new { Count = GroupCount.Count(), Date = GroupCount.Key } ).ToDictionary(x => x.Date, y => y.Count); } catch (Exception Ex) { Debug.WriteLine("Exception in GetWeeklyCountsByGroup: " + Ex.ToString()); } return(Results); } }
public override void Collect(int doc) { int slot = this.ordSet.Find(this.groupFieldTermIndex.GetOrd(doc)); if ((slot < 0)) { return; } GroupCount gc = groupCounts[slot]; int countOrd = this.countFieldTermIndex.GetOrd(doc); if (this.doesNotContainOrd(countOrd, gc.ords)) { if ((countOrd == -1)) { gc.uniqueValues.Add(null); } else { BytesRef br = new BytesRef(); countFieldTermIndex.LookupOrd(countOrd, br); gc.uniqueValues.Add(br); } gc.ords = Arrays.CopyOf(gc.ords, (gc.ords.Length + 1)); gc.ords[(gc.ords.Length - 1)] = countOrd; if ((gc.ords.Length > 1)) { Arrays.Sort(gc.ords); } } }
/// <summary> /// Return a dictionary of crashes per group grouped by day. /// </summary> /// <param name="Crashes">A set of crashes to interrogate.</param> /// <param name="UserGroupId">The id of the user group to interrogate.</param> /// <returns>A dictionary of day vs. crash count.</returns> public Dictionary <DateTime, int> GetDailyCountsByGroup(List <FCrashMinimal> Crashes, int UserGroupId) { using (FAutoScopedLogTimer LogTimer = new FAutoScopedLogTimer(this.GetType().ToString() + "(UserGroupId=" + UserGroupId + ")")) { Dictionary <DateTime, int> Results = new Dictionary <DateTime, int>(); var UsersIds = FRepository.Get(_Crashes).GetUserIdsFromUserGroupId(UserGroupId); // Trim crashes to user group. if (UserGroupId != DashboardController.AllUserGroupId) { Crashes = Crashes.Where(Crash => UsersIds.Contains(Crash.UserId)).ToList(); } try { Results = ( from CrashDetail in Crashes group CrashDetail by CrashDetail.TimeOfCrash.Date into GroupCount orderby GroupCount.Key select new { Count = GroupCount.Count(), Date = GroupCount.Key } ).ToDictionary(x => x.Date, y => y.Count); } catch (Exception Ex) { Debug.WriteLine("Exception in GetDailyCountsByGroup: " + Ex.ToString()); } return(Results); } }
/// <summary> /// Gets a container of crash counts per user group for the set of crashes passed in. /// </summary> /// <param name="Crashes">The set of crashes to tabulate by user group.</param> /// <returns>A dictionary of user group names, and the count of Buggs for each group.</returns> public Dictionary <string, int> GetCountsByGroup(IQueryable <Crash> Crashes) { Dictionary <string, int> Results = new Dictionary <string, int>(); try { Results = ( from CrashDetail in Crashes from UserDetail in CrashRepositoryDataContext.Users join UserGroupDetail in CrashRepositoryDataContext.UserGroups on UserDetail.UserGroupId equals UserGroupDetail.Id where CrashDetail.UserNameId == UserDetail.Id || CrashDetail.UserName == UserDetail.UserName group CrashDetail by UserGroupDetail.Name into GroupCount select new { Key = GroupCount.Key, Count = GroupCount.Count() } ).ToDictionary(x => x.Key, y => y.Count); // Add in all groups, even though there are no crashes associated IEnumerable <string> UserGroups = (from UserGroupDetail in CrashRepositoryDataContext.UserGroups select UserGroupDetail.Name); foreach (string UserGroupName in UserGroups) { if (!Results.Keys.Contains(UserGroupName)) { Results[UserGroupName] = 0; } } } catch (Exception Ex) { Debug.WriteLine("Exception in GetCountsByGroup: " + Ex.ToString()); } return(Results); }
/// <summary> /// Return a dictionary of crashes per group grouped by day. /// </summary> /// <param name="Crashes">A set of crashes to interrogate.</param> /// <param name="UserGroupId">The id of the user group to interrogate.</param> /// <param name="UndefinedUserGroupId">Id of the undefined user group.</param> /// <returns>A dictionary of day vs. crash count.</returns> public Dictionary <DateTime, int> GetDailyCountsByGroup(IQueryable <Crash> Crashes, int UserGroupId, int UndefinedUserGroupId) { using (FAutoScopedLogTimer LogTimer = new FAutoScopedLogTimer(this.GetType().ToString() + "(UserGroupId=" + UserGroupId + ")")) { Dictionary <DateTime, int> Results = new Dictionary <DateTime, int>(); try { Results = ( from CrashDetail in Crashes join UserDetail in CrashRepositoryDataContext.Users on CrashDetail.UserNameId equals UserDetail.Id where (UserGroupId < 0 && UserDetail.UserGroupId != UndefinedUserGroupId) || UserDetail.UserGroupId == UserGroupId group CrashDetail by CrashDetail.TimeOfCrash.Value.Date into GroupCount orderby GroupCount.Key select new { Count = GroupCount.Count(), Date = GroupCount.Key } ).ToDictionary(x => x.Date, y => y.Count); } catch (Exception Ex) { Debug.WriteLine("Exception in GetDailyCountsByGroup: " + Ex.ToString()); } return(Results); } }
/// <summary> /// Gets a container of crash counts per user group for all crashes. /// </summary> /// <returns>A dictionary of user group names, and the count of crashes for each group.</returns> public Dictionary <string, int> GetCountsByGroup() { // @TODO 2014-11-06 Optimize? using (FAutoScopedLogTimer LogTimer = new FAutoScopedLogTimer(this.GetType().ToString() + " SQL OPT")) { Dictionary <string, int> Results = new Dictionary <string, int>(); try { var GroupCounts = ( from UserDetail in Context.Users join UserGroupDetail in Context.UserGroups on UserDetail.UserGroupId equals UserGroupDetail.Id group UserDetail by UserGroupDetail.Name into GroupCount select new { Key = GroupCount.Key, Count = GroupCount.Count() } ); foreach (var GroupCount in GroupCounts) { Results.Add(GroupCount.Key, GroupCount.Count); } // Add in all groups, even though there are no crashes associated IEnumerable <string> UserGroups = (from UserGroupDetail in Context.UserGroups select UserGroupDetail.Name); foreach (string UserGroupName in UserGroups) { if (!Results.Keys.Contains(UserGroupName)) { Results[UserGroupName] = 0; } } } catch (Exception Ex) { Debug.WriteLine("Exception in GetCountsByGroup: " + Ex.ToString()); } return(Results); } }
private List <AbstractDistinctValuesCollector.IGroupCount <IComparable> > CreateExpectedResult(IndexContext context, string term, Sort groupSort, int topN) { List <AbstractDistinctValuesCollector.IGroupCount <IComparable> > result = new List <AbstractDistinctValuesCollector.IGroupCount <IComparable> >(); IDictionary <string, ISet <string> > groupCounts = context.searchTermToGroupCounts[term]; int i = 0; foreach (string group in groupCounts.Keys) { if (topN <= i++) { break; } ISet <BytesRef> uniqueValues = new HashSet <BytesRef>(); foreach (string val in groupCounts[group]) { uniqueValues.Add(val != null ? new BytesRef(val) : null); } var gc = new GroupCount(group != null ? new BytesRef(group) : (BytesRef)null, uniqueValues); result.Add(gc); } return(result); }
/// <summary> /// Bucket the Buggs by user group. /// </summary> /// <param name="Buggs">A list of Buggs to bucket.</param> /// <returns>A dictionary of user group names, and the count of Buggs for each group.</returns> public SortedDictionary <string, int> GetCountsByGroup(IEnumerable <Bugg> Buggs) { // @TODO yrx 2014-11-06 Optimize using (FAutoScopedLogTimer LogTimer = new FAutoScopedLogTimer(this.GetType().ToString() + " SQL OPT")) { Dictionary <string, int> Results = new Dictionary <string, int>(); try { Results = ( from BuggDetail in Buggs join BuggsUserGroupDetail in Context.Buggs_UserGroups on BuggDetail.Id equals BuggsUserGroupDetail.BuggId join UserGroupDetail in Context.UserGroups on BuggsUserGroupDetail.UserGroupId equals UserGroupDetail.Id group 0 by UserGroupDetail.Name into GroupCount select new { Key = GroupCount.Key, Count = GroupCount.Count() } ).ToDictionary(x => x.Key, y => y.Count); // Add in all groups, even though there are no crashes associated IEnumerable <string> UserGroups = (from UserGroupDetail in Context.UserGroups select UserGroupDetail.Name); foreach (string UserGroupName in UserGroups) { if (!Results.Keys.Contains(UserGroupName)) { Results[UserGroupName] = 0; } } } catch (Exception Ex) { Debug.WriteLine("Exception in GetCountsByGroup: " + Ex.ToString()); } SortedDictionary <string, int> SortedResults = new SortedDictionary <string, int>(Results); return(SortedResults); } }
/// <summary> /// The main view of the dash board. /// </summary> /// <returns>A view showing two charts of Crashes over time.</returns> public ActionResult Index() { using (FAutoScopedLogTimer LogTimer = new FAutoScopedLogTimer(this.GetType().ToString(), bCreateNewLog: true)) { DateTime Today = DateTime.UtcNow; DateTime AfewMonthsAgo = Today.AddMonths(-6); FAutoScopedLogTimer LogTimerSQL = new FAutoScopedLogTimer("CrashesFilterByDate", "", ""); // Get engine versions from the last 6 months. var TempVersions = _Crashes.GetVersions(); List <string> EngineUE4Versions = new List <string>(); foreach (var Version in TempVersions) { if (Version.StartsWith("4.")) { EngineUE4Versions.Add(Version); } } // Only 4 latest version. EngineUE4Versions = EngineUE4Versions.OrderByDescending(item => item).Take(5).ToList(); var endDate = Today.AddDays(1); IQueryable <Crash> CrashesInTimeFrame = _Crashes.ListAll() .Where(MyCrash => MyCrash.TimeOfCrash >= AfewMonthsAgo && MyCrash.TimeOfCrash <= endDate); //IEnumerable<Crash> Crashes = FRepository.Get().Crashes.FilterByDate( FRepository.Get().Crashes.ListAll(), AfewMonthsAgo, Today ); var VMinimalCrashes = CrashesInTimeFrame.Select(Crash => new { TimeOfCrash = Crash.TimeOfCrash, UserID = Crash.UserId, EngineVersion = Crash.BuildVersion, }) .ToList(); List <FCrashMinimal> MinimalCrashes = new List <FCrashMinimal>(VMinimalCrashes.Count); foreach (var Anotype in VMinimalCrashes) { MinimalCrashes.Add(new FCrashMinimal(Anotype.TimeOfCrash, Anotype.UserID, Anotype.EngineVersion)); } LogTimerSQL.Dispose(); HashSet <int> AnonumousIDs = new HashSet <int>(_entities.UserGroups.First(data => data.Name == "Anonymous").Users.Select(data => data.Id)); int AnonymousID = AnonumousIDs.First(); int GeneralUserGroupId = 1; //FRepository.Get( _Crashes ).FindOrAddGroup( "General" ); int CoderUserGroupId = 3; //FRepository.Get( _Crashes ).FindOrAddGroup( "Coder" ); int EngineQAUserGroupId = 22; //FRepository.Get( _Crashes ).FindOrAddGroup( "EngineQA" ); int GameQAUserGroupId = 21; //FRepository.Get( _Crashes ).FindOrAddGroup( "GameQA" ); // Weekly Dictionary <DateTime, int> WeeklyGeneralResults = GetWeeklyCountsByGroup(MinimalCrashes, GeneralUserGroupId); Dictionary <DateTime, int> WeeklyCoderResults = GetWeeklyCountsByGroup(MinimalCrashes, CoderUserGroupId); Dictionary <DateTime, int> WeeklyEngineQAResults = GetWeeklyCountsByGroup(MinimalCrashes, EngineQAUserGroupId); Dictionary <DateTime, int> WeeklyGameQAResults = GetWeeklyCountsByGroup(MinimalCrashes, GameQAUserGroupId); Dictionary <string, Dictionary <DateTime, int> > WeeklyEngineVersionResults = new Dictionary <string, Dictionary <DateTime, int> >(); foreach (string UE4Version in EngineUE4Versions) { Dictionary <DateTime, int> Results = GetWeeklyCountsByVersion(MinimalCrashes, UE4Version, AnonymousID); WeeklyEngineVersionResults.Add(UE4Version, Results); } Dictionary <DateTime, int> WeeklyAllResults = GetWeeklyCountsByGroup(MinimalCrashes, AllUserGroupId); // Daily Dictionary <DateTime, int> DailyGeneralResults = GetDailyCountsByGroup(MinimalCrashes, GeneralUserGroupId); Dictionary <DateTime, int> DailyCoderResults = GetDailyCountsByGroup(MinimalCrashes, CoderUserGroupId); Dictionary <DateTime, int> DailyEngineQAResults = GetDailyCountsByGroup(MinimalCrashes, EngineQAUserGroupId); Dictionary <DateTime, int> DailyGameQAResults = GetDailyCountsByGroup(MinimalCrashes, GameQAUserGroupId); Dictionary <string, Dictionary <DateTime, int> > DailyEngineVersionResults = new Dictionary <string, Dictionary <DateTime, int> >(); foreach (string UE4Version in EngineUE4Versions) { Dictionary <DateTime, int> Results = GetDailyCountsByVersion(MinimalCrashes, UE4Version, AnonymousID); DailyEngineVersionResults.Add(UE4Version, Results); } Dictionary <DateTime, int> DailyAllResults = GetDailyCountsByGroup(MinimalCrashes, AllUserGroupId); // Get daily buggs stats. List <Bugg> Buggs = _Buggs.ListAll().Where(Bugg => Bugg.TimeOfFirstCrash >= AfewMonthsAgo).ToList(); Dictionary <DateTime, int> BuggDailyAllResults = ( from Bugg in Buggs group Bugg by Bugg.TimeOfFirstCrash.Value.Date into GroupCount orderby GroupCount.Key select new { Count = GroupCount.Count(), Date = GroupCount.Key } ).ToDictionary(x => x.Date, y => y.Count); string CrashesByWeek = ""; foreach (KeyValuePair <DateTime, int> WeeklyResult in WeeklyAllResults) { int GeneralCrashes = 0; WeeklyGeneralResults.TryGetValue(WeeklyResult.Key, out GeneralCrashes); int CoderCrashes = 0; WeeklyCoderResults.TryGetValue(WeeklyResult.Key, out CoderCrashes); int EngineQACrashes = 0; WeeklyEngineQAResults.TryGetValue(WeeklyResult.Key, out EngineQACrashes); int GameQACrashes = 0; WeeklyGameQAResults.TryGetValue(WeeklyResult.Key, out GameQACrashes); string AnonymousLine = ""; foreach (var VersionCrashes in WeeklyEngineVersionResults) { int EngineVersionCrashes = 0; VersionCrashes.Value.TryGetValue(WeeklyResult.Key, out EngineVersionCrashes); AnonymousLine += EngineVersionCrashes; AnonymousLine += ", "; } int Year = WeeklyResult.Key.Year; int Month = WeeklyResult.Key.AddMonths(-1).Month; if (WeeklyResult.Key.Month == 13 || WeeklyResult.Key.Month == 1) { Month = 0; } int Day = WeeklyResult.Key.Day + 6; string Line = "[new Date(" + Year + ", " + Month + ", " + Day + "), " + GeneralCrashes + ", " + CoderCrashes + ", " + EngineQACrashes + ", " + GameQACrashes + ", " + AnonymousLine + WeeklyResult.Value + "], "; CrashesByWeek += Line; } CrashesByWeek = CrashesByWeek.TrimEnd(", ".ToCharArray()); string CrashesByDay = ""; foreach (KeyValuePair <DateTime, int> DailyResult in DailyAllResults) { int GeneralCrashes = 0; DailyGeneralResults.TryGetValue(DailyResult.Key, out GeneralCrashes); int CoderCrashes = 0; DailyCoderResults.TryGetValue(DailyResult.Key, out CoderCrashes); int EngineQACrashes = 0; DailyEngineQAResults.TryGetValue(DailyResult.Key, out EngineQACrashes); int GameQACrashes = 0; DailyGameQAResults.TryGetValue(DailyResult.Key, out GameQACrashes); string AnonymousLine = ""; foreach (var VersionCrashes in DailyEngineVersionResults) { int EngineVersionCrashes = 0; VersionCrashes.Value.TryGetValue(DailyResult.Key, out EngineVersionCrashes); AnonymousLine += EngineVersionCrashes; AnonymousLine += ", "; } int Year = DailyResult.Key.Year; int Month = DailyResult.Key.AddMonths(-1).Month; if (DailyResult.Key.Month == 13 || DailyResult.Key.Month == 1) { Month = 0; } int Day = DailyResult.Key.Day; string Line = "[new Date(" + Year + ", " + Month + ", " + Day + "), " + GeneralCrashes + ", " + CoderCrashes + ", " + EngineQACrashes + ", " + GameQACrashes + ", " + AnonymousLine + DailyResult.Value + "], "; CrashesByDay += Line; } CrashesByDay = CrashesByDay.TrimEnd(", ".ToCharArray()); string BuggsByDay = ""; foreach (KeyValuePair <DateTime, int> DailyResult in BuggDailyAllResults) { int Year = DailyResult.Key.Year; int Month = DailyResult.Key.AddMonths(-1).Month; if (DailyResult.Key.Month == 13 || DailyResult.Key.Month == 1) { Month = 0; } int Day = DailyResult.Key.Day; string Line = "[new Date(" + Year + ", " + Month + ", " + Day + "), " + DailyResult.Value + "], "; BuggsByDay += Line; } BuggsByDay = BuggsByDay.TrimEnd(", ".ToCharArray()); var ResultDashboard = new DashboardViewModel { CrashesByWeek = CrashesByWeek, CrashesByDay = CrashesByDay, BuggsByDay = BuggsByDay, EngineVersions = EngineUE4Versions, }; ResultDashboard.GenerationTime = LogTimer.GetElapsedSeconds().ToString("F2"); return(View("Index", ResultDashboard)); } }
/// <summary> /// The main view of the dash board. /// </summary> /// <returns>A view showing two charts of crashes over time.</returns> public ActionResult Index() { using (FAutoScopedLogTimer LogTimer = new FAutoScopedLogTimer(this.GetType().ToString())) { /* * //Temporary code to update pattern in crashes and buggs. * DateTime Today11 = DateTime.UtcNow.AddDays(11); * DateTime AYear = Today11.AddMonths( -12 ); * * var CrashList = CrashRepository.Context.Crashes.Where( X => X.TimeOfCrash >= AYear ).Select( X => X ); * var BuggList = CrashRepository.Context.Buggs.Select( X => X ); * * int Current = 0; * foreach(Crash Crash in CrashList) * { * if( string.IsNullOrEmpty(Crash.Pattern) ) * { * continue; * } * if( Crash.Pattern[0] != '+' ) * { * Crash.Pattern = "+" + Crash.Pattern + "+"; * } * Current++; * if( Current % 16384 == 0 ) * { * CrashRepository.SubmitChanges(); * } * } * * * foreach(Bugg Bugg in BuggList) * { * if( string.IsNullOrEmpty( Bugg.Pattern ) ) * { * continue; * } * * if( Bugg.Pattern[0] != '+' ) * { * Bugg.Pattern = "+" + Bugg.Pattern + "+"; * } * Current++; * if( Current % 16384 == 0 ) * { * CrashRepository.SubmitChanges(); * } * } */ DateTime Today = DateTime.UtcNow; DateTime AfewMonthsAgo = Today.AddMonths(-6); FAutoScopedLogTimer LogTimerSQL = new FAutoScopedLogTimer("CrashesFilterByDate", "", ""); IQueryable <Crash> Crashes = CrashRepository.FilterByDate(CrashRepository.ListAll(), AfewMonthsAgo, Today); var VMinimalCrashes = Crashes.Select(Crash => new { TimeOfCrash = Crash.TimeOfCrash.Value, UserID = Crash.UserNameId.Value }).ToList(); List <FCrashMinimal> MinimalCrashes = new List <FCrashMinimal>(VMinimalCrashes.Count); foreach (var Anotype in VMinimalCrashes) { MinimalCrashes.Add(new FCrashMinimal(Anotype.TimeOfCrash, Anotype.UserID)); } LogTimerSQL.Dispose(); int GeneralUserGroupId = CrashRepository.FindOrAddUserGroup("General"); int CoderUserGroupId = CrashRepository.FindOrAddUserGroup("Coder"); int EngineQAUserGroupId = CrashRepository.FindOrAddUserGroup("EngineQA"); int GameQAUserGroupId = CrashRepository.FindOrAddUserGroup("GameQA"); int AnonymousUserGroupId = CrashRepository.FindOrAddUserGroup("Anonymous"); Dictionary <DateTime, int> GeneralResults = GetWeeklyCountsByGroup(MinimalCrashes, GeneralUserGroupId); Dictionary <DateTime, int> CoderResults = GetWeeklyCountsByGroup(MinimalCrashes, CoderUserGroupId); Dictionary <DateTime, int> EngineQAResults = GetWeeklyCountsByGroup(MinimalCrashes, EngineQAUserGroupId); Dictionary <DateTime, int> GameQAResults = GetWeeklyCountsByGroup(MinimalCrashes, GameQAUserGroupId); Dictionary <DateTime, int> AnonymousResults = GetWeeklyCountsByGroup(MinimalCrashes, AnonymousUserGroupId); Dictionary <DateTime, int> AllResults = GetWeeklyCountsByGroup(MinimalCrashes, AllUserGroupId); Dictionary <DateTime, int> DailyGeneralResults = GetDailyCountsByGroup(MinimalCrashes, GeneralUserGroupId); Dictionary <DateTime, int> DailyCoderResults = GetDailyCountsByGroup(MinimalCrashes, CoderUserGroupId); Dictionary <DateTime, int> DailyEngineQAResults = GetDailyCountsByGroup(MinimalCrashes, EngineQAUserGroupId); Dictionary <DateTime, int> DailyGameQAResults = GetDailyCountsByGroup(MinimalCrashes, GameQAUserGroupId); Dictionary <DateTime, int> DailyAnonymousResults = GetDailyCountsByGroup(MinimalCrashes, AnonymousUserGroupId); Dictionary <DateTime, int> DailyAllResults = GetDailyCountsByGroup(MinimalCrashes, AllUserGroupId); // Get daily buggs stats. List <Bugg> Buggs = BuggRepository.ListAll().Where(Bugg => Bugg.TimeOfFirstCrash >= AfewMonthsAgo).ToList(); Dictionary <DateTime, int> BuggDailyAllResults = ( from Bugg in Buggs group Bugg by Bugg.TimeOfFirstCrash.Value.Date into GroupCount orderby GroupCount.Key select new { Count = GroupCount.Count(), Date = GroupCount.Key } ).ToDictionary(x => x.Date, y => y.Count); string CrashesByWeek = ""; foreach (KeyValuePair <DateTime, int> Result in AllResults) { int GeneralCrashes = 0; GeneralResults.TryGetValue(Result.Key, out GeneralCrashes); int CoderCrashes = 0; CoderResults.TryGetValue(Result.Key, out CoderCrashes); int EngineQACrashes = 0; EngineQAResults.TryGetValue(Result.Key, out EngineQACrashes); int GameQACrashes = 0; GameQAResults.TryGetValue(Result.Key, out GameQACrashes); int AnonymousCrashes = 0; AnonymousResults.TryGetValue(Result.Key, out AnonymousCrashes); int Year = Result.Key.Year; int Month = Result.Key.AddMonths(-1).Month; if (Result.Key.Month == 13 || Result.Key.Month == 1) { Month = 0; } int Day = Result.Key.Day + 6; string Line = "[new Date(" + Year + ", " + Month + ", " + Day + "), " + GeneralCrashes + ", " + CoderCrashes + ", " + EngineQACrashes + ", " + GameQACrashes + ", " + AnonymousCrashes + ", " + Result.Value + "], "; CrashesByWeek += Line; } CrashesByWeek = CrashesByWeek.TrimEnd(", ".ToCharArray()); string CrashesByDay = ""; foreach (KeyValuePair <DateTime, int> DailyResult in DailyAllResults) { int GeneralCrashes = 0; DailyGeneralResults.TryGetValue(DailyResult.Key, out GeneralCrashes); int CoderCrashes = 0; DailyCoderResults.TryGetValue(DailyResult.Key, out CoderCrashes); int EngineQACrashes = 0; DailyEngineQAResults.TryGetValue(DailyResult.Key, out EngineQACrashes); int GameQACrashes = 0; DailyGameQAResults.TryGetValue(DailyResult.Key, out GameQACrashes); int AnonymousCrashes = 0; DailyAnonymousResults.TryGetValue(DailyResult.Key, out AnonymousCrashes); int Year = DailyResult.Key.Year; int Month = DailyResult.Key.AddMonths(-1).Month; if (DailyResult.Key.Month == 13 || DailyResult.Key.Month == 1) { Month = 0; } int Day = DailyResult.Key.Day; string Line = "[new Date(" + Year + ", " + Month + ", " + Day + "), " + GeneralCrashes + ", " + CoderCrashes + ", " + EngineQACrashes + ", " + GameQACrashes + ", " + AnonymousCrashes + ", " + DailyResult.Value + "], "; CrashesByDay += Line; } CrashesByDay = CrashesByDay.TrimEnd(", ".ToCharArray()); string BuggsByDay = ""; foreach (KeyValuePair <DateTime, int> DailyResult in BuggDailyAllResults) { int Year = DailyResult.Key.Year; int Month = DailyResult.Key.AddMonths(-1).Month; if (DailyResult.Key.Month == 13 || DailyResult.Key.Month == 1) { Month = 0; } int Day = DailyResult.Key.Day; string Line = "[new Date(" + Year + ", " + Month + ", " + Day + "), " + DailyResult.Value + "], "; BuggsByDay += Line; } BuggsByDay = BuggsByDay.TrimEnd(", ".ToCharArray()); return(View("Index", new DashboardViewModel { CrashesByWeek = CrashesByWeek, CrashesByDay = CrashesByDay, BuggsByDay = BuggsByDay })); } }
/// <summary> /// Bucket the Buggs by user group. /// </summary> /// <param name="Buggs">A list of Buggs to bucket.</param> /// <returns>A dictionary of user group names, and the count of Buggs for each group.</returns> public SortedDictionary <string, int> GetCountsByGroup(IEnumerable <Bugg> Buggs) { using (FAutoScopedLogTimer LogTimer = new FAutoScopedLogTimer(this.GetType().ToString() + " SQL OPT")) { Dictionary <string, int> Results = new Dictionary <string, int>(); try { Results = ( from BuggDetail in Buggs join BuggsUserGroupDetail in Context.Buggs_UserGroups on BuggDetail.Id equals BuggsUserGroupDetail.BuggId join UserGroupDetail in Context.UserGroups on BuggsUserGroupDetail.UserGroupId equals UserGroupDetail.Id group 0 by UserGroupDetail.Name into GroupCount select new { Key = GroupCount.Key, Count = GroupCount.Count() } ).ToDictionary(x => x.Key, y => y.Count); // Add in all groups, even though there are no crashes associated IEnumerable <string> UserGroups = (from UserGroupDetail in Context.UserGroups select UserGroupDetail.Name); foreach (string UserGroupName in UserGroups) { if (!Results.Keys.Contains(UserGroupName)) { Results[UserGroupName] = 0; } } /* * // * var UsersIDsAndGroupIDs = Context.Users.Select( User => new { UserId = User.Id, UserGroupId = User.UserGroupId } ).ToList(); * var UserGroupArray = Context.UserGroups.ToList(); * UserGroupArray.Sort( ( UG1, UG2 ) => UG1.Name.CompareTo( UG2.Name ) ); * * // Initialize all groups to 0. * foreach( var UserGroup in UserGroupArray ) * { * Results.Add( UserGroup.Name, 0 ); * } * * Dictionary<int, string> UserIdToGroupName = new Dictionary<int, string>(); * foreach( var UserIds in UsersIDsAndGroupIDs ) * { * // Find group name for the user id. * string UserGroupName = UserGroupArray.Where( UG => UG.Id == UserIds.UserGroupId ).First().Name; * UserIdToGroupName.Add( UserIds.UserId, UserGroupName ); * } * * HashSet<int> UserNameIds = new HashSet<int>(); * foreach( Bugg Bugg in Buggs ) * { * var CrashList = * ( * from BuggCrash in Context.Buggs_Crashes * where BuggCrash.BuggId == Bugg.Id * select BuggCrash.Crash.UserNameId.GetValueOrDefault() * ).ToList(); * * UserNameIds.UnionWith( CrashList ); * } * * foreach( int UserId in UserNameIds ) * { * string UserGroupName = UserIdToGroupName[UserId]; * Results[UserGroupName]++; * }*/ } catch (Exception Ex) { Debug.WriteLine("Exception in GetCountsByGroup: " + Ex.ToString()); } SortedDictionary <string, int> SortedResults = new SortedDictionary <string, int>(Results); return(SortedResults); } }
public int MinVal() { return(GroupCount.Min()); }
// calculators public int MaxVal() { return(GroupCount.Max()); }
/// <summary> /// The main view of the dash board. /// </summary> /// <returns>A view showing two charts of crashes over time.</returns> public ActionResult Index() { using (FAutoScopedLogTimer LogTimer = new FAutoScopedLogTimer(this.GetType().ToString(), bCreateNewLog: true)) { DateTime Today = DateTime.UtcNow; DateTime AfewMonthsAgo = Today.AddMonths(-6); FAutoScopedLogTimer LogTimerSQL = new FAutoScopedLogTimer("CrashesFilterByDate", "", ""); IQueryable <Crash> CrashesInTimeFrame = _Crashes.ListAll() .Where(MyCrash => MyCrash.TimeOfCrash >= AfewMonthsAgo && MyCrash.TimeOfCrash <= Today.AddDays(1)); //IEnumerable<Crash> Crashes = FRepository.Get().Crashes.FilterByDate( FRepository.Get().Crashes.ListAll(), AfewMonthsAgo, Today ); var VMinimalCrashes = CrashesInTimeFrame.Select(Crash => new { TimeOfCrash = Crash.TimeOfCrash.Value, UserID = Crash.UserNameId.Value }).ToList(); List <FCrashMinimal> MinimalCrashes = new List <FCrashMinimal>(VMinimalCrashes.Count); foreach (var Anotype in VMinimalCrashes) { MinimalCrashes.Add(new FCrashMinimal(Anotype.TimeOfCrash, Anotype.UserID)); } LogTimerSQL.Dispose(); int GeneralUserGroupId = FRepository.Get(_Crashes).FindOrAddGroup("General"); int CoderUserGroupId = FRepository.Get(_Crashes).FindOrAddGroup("Coder"); int EngineQAUserGroupId = FRepository.Get(_Crashes).FindOrAddGroup("EngineQA"); int GameQAUserGroupId = FRepository.Get(_Crashes).FindOrAddGroup("GameQA"); int AnonymousUserGroupId = FRepository.Get(_Crashes).FindOrAddGroup("Anonymous"); Dictionary <DateTime, int> GeneralResults = GetWeeklyCountsByGroup(MinimalCrashes, GeneralUserGroupId); Dictionary <DateTime, int> CoderResults = GetWeeklyCountsByGroup(MinimalCrashes, CoderUserGroupId); Dictionary <DateTime, int> EngineQAResults = GetWeeklyCountsByGroup(MinimalCrashes, EngineQAUserGroupId); Dictionary <DateTime, int> GameQAResults = GetWeeklyCountsByGroup(MinimalCrashes, GameQAUserGroupId); Dictionary <DateTime, int> AnonymousResults = GetWeeklyCountsByGroup(MinimalCrashes, AnonymousUserGroupId); Dictionary <DateTime, int> AllResults = GetWeeklyCountsByGroup(MinimalCrashes, AllUserGroupId); Dictionary <DateTime, int> DailyGeneralResults = GetDailyCountsByGroup(MinimalCrashes, GeneralUserGroupId); Dictionary <DateTime, int> DailyCoderResults = GetDailyCountsByGroup(MinimalCrashes, CoderUserGroupId); Dictionary <DateTime, int> DailyEngineQAResults = GetDailyCountsByGroup(MinimalCrashes, EngineQAUserGroupId); Dictionary <DateTime, int> DailyGameQAResults = GetDailyCountsByGroup(MinimalCrashes, GameQAUserGroupId); Dictionary <DateTime, int> DailyAnonymousResults = GetDailyCountsByGroup(MinimalCrashes, AnonymousUserGroupId); Dictionary <DateTime, int> DailyAllResults = GetDailyCountsByGroup(MinimalCrashes, AllUserGroupId); // Get daily buggs stats. List <Bugg> Buggs = _Buggs.ListAll().Where(Bugg => Bugg.TimeOfFirstCrash >= AfewMonthsAgo).ToList(); Dictionary <DateTime, int> BuggDailyAllResults = ( from Bugg in Buggs group Bugg by Bugg.TimeOfFirstCrash.Value.Date into GroupCount orderby GroupCount.Key select new { Count = GroupCount.Count(), Date = GroupCount.Key } ).ToDictionary(x => x.Date, y => y.Count); string CrashesByWeek = ""; foreach (KeyValuePair <DateTime, int> Result in AllResults) { int GeneralCrashes = 0; GeneralResults.TryGetValue(Result.Key, out GeneralCrashes); int CoderCrashes = 0; CoderResults.TryGetValue(Result.Key, out CoderCrashes); int EngineQACrashes = 0; EngineQAResults.TryGetValue(Result.Key, out EngineQACrashes); int GameQACrashes = 0; GameQAResults.TryGetValue(Result.Key, out GameQACrashes); int AnonymousCrashes = 0; AnonymousResults.TryGetValue(Result.Key, out AnonymousCrashes); int Year = Result.Key.Year; int Month = Result.Key.AddMonths(-1).Month; if (Result.Key.Month == 13 || Result.Key.Month == 1) { Month = 0; } int Day = Result.Key.Day + 6; string Line = "[new Date(" + Year + ", " + Month + ", " + Day + "), " + GeneralCrashes + ", " + CoderCrashes + ", " + EngineQACrashes + ", " + GameQACrashes + ", " + AnonymousCrashes + ", " + Result.Value + "], "; CrashesByWeek += Line; } CrashesByWeek = CrashesByWeek.TrimEnd(", ".ToCharArray()); string CrashesByDay = ""; foreach (KeyValuePair <DateTime, int> DailyResult in DailyAllResults) { int GeneralCrashes = 0; DailyGeneralResults.TryGetValue(DailyResult.Key, out GeneralCrashes); int CoderCrashes = 0; DailyCoderResults.TryGetValue(DailyResult.Key, out CoderCrashes); int EngineQACrashes = 0; DailyEngineQAResults.TryGetValue(DailyResult.Key, out EngineQACrashes); int GameQACrashes = 0; DailyGameQAResults.TryGetValue(DailyResult.Key, out GameQACrashes); int AnonymousCrashes = 0; DailyAnonymousResults.TryGetValue(DailyResult.Key, out AnonymousCrashes); int Year = DailyResult.Key.Year; int Month = DailyResult.Key.AddMonths(-1).Month; if (DailyResult.Key.Month == 13 || DailyResult.Key.Month == 1) { Month = 0; } int Day = DailyResult.Key.Day; string Line = "[new Date(" + Year + ", " + Month + ", " + Day + "), " + GeneralCrashes + ", " + CoderCrashes + ", " + EngineQACrashes + ", " + GameQACrashes + ", " + AnonymousCrashes + ", " + DailyResult.Value + "], "; CrashesByDay += Line; } CrashesByDay = CrashesByDay.TrimEnd(", ".ToCharArray()); string BuggsByDay = ""; foreach (KeyValuePair <DateTime, int> DailyResult in BuggDailyAllResults) { int Year = DailyResult.Key.Year; int Month = DailyResult.Key.AddMonths(-1).Month; if (DailyResult.Key.Month == 13 || DailyResult.Key.Month == 1) { Month = 0; } int Day = DailyResult.Key.Day; string Line = "[new Date(" + Year + ", " + Month + ", " + Day + "), " + DailyResult.Value + "], "; BuggsByDay += Line; } BuggsByDay = BuggsByDay.TrimEnd(", ".ToCharArray()); var ResultDashboard = new DashboardViewModel { CrashesByWeek = CrashesByWeek, CrashesByDay = CrashesByDay, BuggsByDay = BuggsByDay }; ResultDashboard.GenerationTime = LogTimer.GetElapsedSeconds().ToString("F2"); return(View("Index", ResultDashboard)); } }
int FillObjects(string Table, TreeIter root, TableInfo.Params ParametersIn) { TreeIter DeleteIter, ClearIter, GroupIter, ItemIter; int Totalcount = 0; int DelCount = 0; int ClearCount = 0; int GroupCount; DbCommand cmd; DbDataReader rdr; QSMain.CheckConnectionAlive(); logger.Debug("Поиск зависимостей для таблицы {0}", Table); if (!QSMain.ProjectTables.ContainsKey(Table)) { ErrorString = "Нет описания для таблицы " + Table; logger.Error(ErrorString); ErrorHappens = true; return(0); } if (QSMain.ProjectTables[Table].DeleteItems.Count > 0) { if (!ObjectsTreeStore.IterIsValid(root)) { DeleteIter = ObjectsTreeStore.AppendNode(); } else { DeleteIter = ObjectsTreeStore.AppendNode(root); } foreach (KeyValuePair <string, TableInfo.DeleteDependenceItem> pair in QSMain.ProjectTables[Table].DeleteItems) { GroupCount = 0; if (!QSMain.ProjectTables.ContainsKey(pair.Key)) { ErrorString = String.Format("Зависимость удаления у таблицы {1} ссылается на таблицу {0} описания для которой нет.", pair.Key, Table); logger.Error(ErrorString); ErrorHappens = true; return(0); } string sql = QSMain.ProjectTables[pair.Key].SqlSelect + pair.Value.sqlwhere; cmd = QSMain.ConnectionDB.CreateCommand(); cmd.CommandText = sql; AddParameters(cmd, pair.Value.SqlParam, ParametersIn); rdr = cmd.ExecuteReader(); if (!rdr.HasRows) { rdr.Close(); continue; } GroupIter = ObjectsTreeStore.AppendNode(DeleteIter); int IndexIntParam = 0; int IndexStrParam = 0; if (QSMain.ProjectTables[pair.Key].PrimaryKey.ParamInt != "") { IndexIntParam = rdr.GetOrdinal(QSMain.ProjectTables[pair.Key].PrimaryKey.ParamInt); } if (QSMain.ProjectTables[pair.Key].PrimaryKey.ParamStr != "") { IndexStrParam = rdr.GetOrdinal(QSMain.ProjectTables[pair.Key].PrimaryKey.ParamStr); } List <object[]> ReadedData = new List <object[]>(); while (rdr.Read()) { object[] Fields = new object[rdr.FieldCount]; rdr.GetValues(Fields); ReadedData.Add(Fields); } rdr.Close(); foreach (object[] row in ReadedData) { ItemIter = ObjectsTreeStore.AppendValues(GroupIter, String.Format(QSMain.ProjectTables[pair.Key].DisplayString, row)); if (QSMain.ProjectTables[pair.Key].DeleteItems.Count > 0 || QSMain.ProjectTables[pair.Key].ClearItems.Count > 0) { TableInfo.Params OutParam = new TableInfo.Params(); if (QSMain.ProjectTables[pair.Key].PrimaryKey.ParamInt != "") { OutParam.ParamInt = Convert.ToInt32(row[IndexIntParam]); } if (QSMain.ProjectTables[pair.Key].PrimaryKey.ParamStr != "") { OutParam.ParamStr = row[IndexStrParam].ToString(); } Totalcount += FillObjects(pair.Key, ItemIter, OutParam); } GroupCount++; Totalcount++; DelCount++; } ObjectsTreeStore.SetValues(GroupIter, QSMain.ProjectTables[pair.Key].ObjectsName + "(" + GroupCount.ToString() + ")"); } if (DelCount > 0) { ObjectsTreeStore.SetValues(DeleteIter, String.Format("Будет удалено ({0}/{1}) объектов:", DelCount, Totalcount)); } else { ObjectsTreeStore.Remove(ref DeleteIter); } } if (QSMain.ProjectTables[Table].ClearItems.Count > 0) { if (!ObjectsTreeStore.IterIsValid(root)) { ClearIter = ObjectsTreeStore.AppendNode(); } else { ClearIter = ObjectsTreeStore.AppendNode(root); } foreach (KeyValuePair <string, TableInfo.ClearDependenceItem> pair in QSMain.ProjectTables[Table].ClearItems) { GroupCount = 0; if (!QSMain.ProjectTables.ContainsKey(pair.Key)) { ErrorString = String.Format("Зависимость очистки у таблицы {1} ссылается на таблицу {0} описания для которой нет.", pair.Key, Table); logger.Error(ErrorString); ErrorHappens = true; return(0); } string sql = QSMain.ProjectTables[pair.Key].SqlSelect + pair.Value.sqlwhere; cmd = QSMain.ConnectionDB.CreateCommand(); cmd.CommandText = sql; AddParameters(cmd, pair.Value.SqlParam, ParametersIn); rdr = cmd.ExecuteReader(); if (!rdr.HasRows) { rdr.Close(); continue; } GroupIter = ObjectsTreeStore.AppendNode(ClearIter); while (rdr.Read()) { object[] Fields = new object[rdr.FieldCount]; rdr.GetValues(Fields); ItemIter = ObjectsTreeStore.AppendValues(GroupIter, String.Format(QSMain.ProjectTables[pair.Key].DisplayString, Fields)); GroupCount++; Totalcount++; ClearCount++; } ObjectsTreeStore.SetValues(GroupIter, QSMain.ProjectTables[pair.Key].ObjectsName + "(" + GroupCount.ToString() + ")"); rdr.Close(); } if (ClearCount > 0) { ObjectsTreeStore.SetValues(ClearIter, String.Format("Будет очищено ссылок у {0} объектов:", ClearCount)); } else { ObjectsTreeStore.Remove(ref ClearIter); } } return(Totalcount); }