/// <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();
        }
Esempio n. 3
0
        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);
        }