/// <summary> /// /// </summary> /// <param name="snapshot"></param> /// <param name="ruleExplorer"></param> /// <param name="businessCriteriasIds"></param> /// <param name="count"></param> /// <returns></returns> public static List<TechnicalCriteriaResultDTO> GetTechnicalCriteriaViolations(Snapshot snapshot, Constants.BusinessCriteria businessCriteriaId, Int32 count) { RuleViolationResultDTO ruleViolationResult = new RuleViolationResultDTO(); if (snapshot.QIBusinessCriterias != null && snapshot.TechnicalCriteriaResults!=null) { IEnumerable<Int32> technicalCriteriaId = snapshot.QIBusinessCriterias.Where(_ => (Int32)businessCriteriaId == _.Key) .SelectMany(_ => _.Contributors).Select( _ => _.Key); return snapshot.TechnicalCriteriaResults.Where(_ => technicalCriteriaId.Contains(_.Reference.Key) && _.Reference !=null && _.DetailResult != null && _.RulesViolation != null) .Select(_ => new TechnicalCriteriaResultDTO { Name = _.Reference.Name, Grade = _.DetailResult.Grade, TotalChecks = _.RulesViolation.Sum(r => (r.DetailResult != null && r.DetailResult.ViolationRatio!=null) ? r.DetailResult.ViolationRatio.TotalChecks : 0), TotalFailed = _.RulesViolation.Sum(r => (r.DetailResult != null && r.DetailResult.ViolationRatio!=null) ? r.DetailResult.ViolationRatio.FailedChecks : 0) }) .OrderByDescending(_ => _.TotalFailed) .Take(count) .ToList(); } return null; }
/// <summary> /// /// </summary> /// <param name="snapshot"></param> /// <param name="ruleExplorer"></param> /// <param name="businessCriteriasIds"></param> /// <param name="count"></param> /// <returns></returns> public static List<RuleViolationResultDTO> GetNbViolationByRule(Snapshot snapshot, IRuleExplorer ruleExplorer, List<int> businessCriteriasIds, Int32 count) { if (snapshot == null || snapshot.TechnicalCriteriaResults == null) return null; //Get rules List<RuleDetails> rules = new List<RuleDetails>(); foreach (var metricId in businessCriteriasIds) { var bcRules = ruleExplorer.GetRulesDetails(snapshot.DomainId, metricId.ToString(), snapshot.Id.ToString()); rules.AddRange(bcRules); } rules = rules.GroupBy(_ => new { _.Key, _.Href, _.Name }) .Select(_ => new RuleDetails { Key = _.Key.Key, Href = _.Key.Href, Name = _.Key.Name, CompoundedWeight = _.Sum(x => x.CompoundedWeight), Critical = _.Max(x => x.Critical) }) .ToList(); //Get result by technical criterias List<RuleViolationResultDTO> reslutByTechnicalCriterias = new List<RuleViolationResultDTO>(); foreach (var rule in rules) { RuleViolationResultDTO ruleViolationResult = new RuleViolationResultDTO(); var technicalCriterias = snapshot.TechnicalCriteriaResults .Where(_ => _.RulesViolation!=null && _.RulesViolation.Where(p => p.Reference.Key.ToString() == rule.Key).Any()) .FirstOrDefault(); if (technicalCriterias != null) { ruleViolationResult.Rule = new RuleDetailsDTO { Name = rule.Name, Critical = rule.Critical, CompoundedWeight = rule.CompoundedWeight }; ruleViolationResult.Grade = technicalCriterias.DetailResult.Grade; ruleViolationResult.TechnicalCriteraiName = technicalCriterias.Reference.Name; var violationRatio = technicalCriterias.RulesViolation.Where(_ => _.Reference.Key.ToString() == rule.Key) .Select(_ => _.DetailResult.ViolationRatio) .FirstOrDefault(); if (violationRatio != null) { ruleViolationResult.TotalFailed = violationRatio.FailedChecks; ruleViolationResult.TotalChecks = violationRatio.TotalChecks; } reslutByTechnicalCriterias.Add(ruleViolationResult); } } return reslutByTechnicalCriterias.OrderBy(_ => _.Rule.Name).Take(count).ToList(); }
public override TableDefinition Content(ReportData reportData, Dictionary <string, string> options) { int rowCount = 0; List <string> rowData = new List <string>(); List <RuleViolationsVariationResultDTO> variationRules = new List <RuleViolationsVariationResultDTO>(); rowData.AddRange(new[] { Labels.Weight, Labels.Variation, Labels.RuleName }); List <string> bcIdsStr = options.GetOption("BCID", "60017").Split('|').ToList(); List <int> bcIds = bcIdsStr.Select(int.Parse).ToList(); // to get decrease by default bool increase = options.GetOption("VARIATION", "DECREASE").ToLower().Equals("increase"); // to get number by default bool percent = options.GetOption("DATA", "NUMBER").ToLower().Equals("percent"); int nbLimitTop = options.GetIntOption("COUNT", 50); if (reportData?.CurrentSnapshot != null) { List <RuleViolationResultDTO> currentCriticalRulesViolation = RulesViolationUtility.GetNbViolationByRule(reportData.CurrentSnapshot, reportData.RuleExplorer, bcIds, -1); List <RuleViolationResultDTO> previousCriticalRulesViolation = (reportData.PreviousSnapshot != null) ? RulesViolationUtility.GetNbViolationByRule(reportData.PreviousSnapshot, reportData.RuleExplorer, bcIds, -1) : null; if (currentCriticalRulesViolation != null && previousCriticalRulesViolation != null) { if (increase) { foreach (RuleViolationResultDTO item in currentCriticalRulesViolation) { RuleViolationResultDTO previousitem = previousCriticalRulesViolation.FirstOrDefault(_ => _.Rule.Key == item.Rule.Key); double?variation; if (previousitem != null) { if (item.TotalChecks != null && previousitem.TotalChecks != null) { variation = percent ? item.TotalFailed / (double)item.TotalChecks - previousitem.TotalFailed / (double)previousitem.TotalChecks : item.TotalFailed - previousitem.TotalFailed; if (variation <= 0) { continue; } } else { continue; } } else { if (item.TotalChecks != null) { variation = percent ? item.TotalFailed / (double)item.TotalChecks : item.TotalFailed; if (variation <= 0) { continue; } } else { continue; } } variationRules.Add(new RuleViolationsVariationResultDTO { Rule = new RuleDetailsDTO { Name = item.Rule.Name, Key = item.Rule.Key, CompoundedWeight = item.Rule.CompoundedWeight }, CurrentNbViolations = item.TotalFailed ?? -1, PreviousNbViolations = previousitem?.TotalFailed ?? -1, Variation = variation ?? double.NaN }); } } else { foreach (RuleViolationResultDTO previousitem in previousCriticalRulesViolation) { RuleViolationResultDTO item = currentCriticalRulesViolation.FirstOrDefault(_ => _.Rule.Key == previousitem.Rule.Key); double?variation; if (item != null) { if (previousitem.TotalChecks != null && item.TotalChecks != null) { variation = percent ? previousitem.TotalFailed / (double)previousitem.TotalChecks - item.TotalFailed / (double)item.TotalChecks : previousitem.TotalFailed - item.TotalFailed; if (variation <= 0) { continue; } } else { continue; } } else { if (previousitem.TotalChecks != null) { variation = percent ? previousitem.TotalFailed / (double)previousitem.TotalChecks : previousitem.TotalFailed; if (variation <= 0) { continue; } } else { continue; } } variationRules.Add(new RuleViolationsVariationResultDTO { Rule = new RuleDetailsDTO { Name = previousitem.Rule.Name, Key = previousitem.Rule.Key, CompoundedWeight = previousitem.Rule.CompoundedWeight }, CurrentNbViolations = item?.TotalFailed ?? -1, PreviousNbViolations = previousitem.TotalFailed ?? -1, Variation = variation ?? double.NaN }); } } List <RuleViolationsVariationResultDTO> selected_elements = nbLimitTop != -1 ? variationRules.OrderByDescending(_ => _.Variation).Take(nbLimitTop).ToList() : variationRules.OrderByDescending(_ => _.Variation).ToList(); if (selected_elements.Count <= 0) { rowData.AddRange(new[] { Labels.NoItem, string.Empty, string.Empty }); rowCount = 1; } else { foreach (RuleViolationsVariationResultDTO varRule in selected_elements) { rowData.AddRange(new[] { varRule.Rule.CompoundedWeight.ToString(), percent ? FormatPercent(varRule.Variation) : varRule.Variation.ToString(), varRule.Rule.Name } ); rowCount++; } } } else { rowData.AddRange(new[] { Labels.NoItem, string.Empty, string.Empty }); rowCount = 1; } } var resultTable = new TableDefinition { HasRowHeaders = false, HasColumnHeaders = true, NbRows = rowCount + 1, NbColumns = 3, Data = rowData }; return(resultTable); }