Esempio n. 1
0
        public async Task <GraphGetRp> GetGraphExperience(int productId, DatePeriodValue period)
        {
            GraphGetRp result  = new GraphGetRp();
            var        product = await this._dbContext.FullLoadProductWithSourceItems(productId, period.Start, period.End);

            result.Name   = product.Name;
            result.Id     = product.Id.Value;
            result.Avatar = product.Avatar;
            foreach (var journey in product.Journeys)
            {
                var measure = journey.Measure();
                var snode   = new GraphNode
                {
                    Id     = string.Format("journey_{0}", journey.Id),
                    Avatar = journey.Avatar,
                    Name   = string.Format("{0} [ {1} | {2} ]", journey.Name,
                                           Math.Round(journey.ExperienceSlo, 2),
                                           Math.Round(measure.Experience, 2)),
                    Value  = measure.Experience,
                    Group  = "journeys",
                    Slo    = journey.ExperienceSlo,
                    Budget = measure.ExperienceErrorBudget
                };

                result.Nodes.Add(snode);

                foreach (var map in journey.FeatureMap)
                {
                    var featureMeasure = map.Feature.Measure();
                    var Id             = string.Format("feature_{0}", map.Feature.Id);
                    var fnode          = result.Nodes.SingleOrDefault(c => c.Id == Id);
                    if (fnode == null)
                    {
                        fnode = new GraphNode
                        {
                            Id     = Id,
                            Avatar = map.Feature.Avatar,
                            Name   = map.Feature.Name,
                            Value  = featureMeasure.Experience,
                            Group  = "features"
                        };
                        result.Nodes.Add(fnode);
                    }
                    var fedge = new GraphEdge()
                    {
                        From  = snode.Id,
                        To    = fnode.Id,
                        Value = QualityUtils.MeasureBudget(fnode.Value, journey.ExperienceSlo),
                        Tags  = new Dictionary <string, object>()
                        {
                            { "Latency", fnode.Value }
                        }
                    };
                    result.Edges.Add(fedge);
                }
            }
            return(result);
        }
Esempio n. 2
0
        public async Task <IActionResult> GetSquadGraph(int id, DateTime?start, DateTime?end)
        {
            if (start.HasValue && end.HasValue)
            {
                GraphGetRp result = await this._customerQueryComponent.GetSquadsGraph(id, new DatePeriodValue(start.Value, end.Value));

                return(this.Ok(result));
            }
            else
            {
                return(this.BadRequest());
            }
        }
Esempio n. 3
0
        public async Task <IActionResult> GetGraphExperience(int id, DateTime?start, DateTime?end)
        {
            DatePeriodValue period = new DatePeriodValue(start.Value, end.Value);

            if (period.IsValid())
            {
                GraphGetRp result = await this._productQueryComponent.GetGraphExperience(id, period);

                return(this.Ok(result));
            }
            else
            {
                return(this.BadRequest());
            }
        }
        public async Task <GraphGetRp> GetSquadsGraph(int customerId, DatePeriodValue period)
        {
            GraphGetRp result = new GraphGetRp();
            var        root   = await this._dbContext.Customers.Include(c => c.Products).Where(c => c.Id == customerId).SingleOrDefaultAsync();

            var temp = new List <ProductEntity>();

            foreach (var item in root.Products)
            {
                var p = await this._dbContext.FullLoadProductWithSourceItems(item.Id.Value, period.Start, period.End);

                temp.Add(p);
            }
            root.Products = temp;

            result.Name   = root.Name;
            result.Id     = root.Id.Value;
            result.Avatar = root.Avatar;

            var squads = await this._dbContext.Squads.Where(c => c.Customer.Id.Equals(customerId)).ToListAsync();

            var squadsDetail = new List <SquadQualityGetRp>();

            foreach (var item in squads)
            {
                var detail = await this._squadQueryComponent.GetSquadByIdWithQuality(item.Id.Value,
                                                                                     period);

                squadsDetail.Add(detail);
            }

            foreach (var node in squadsDetail)
            {
                var snode = new GraphNode
                {
                    Id     = string.Format("squad_{0}", node.Id),
                    Avatar = node.Avatar,
                    Name   = node.Name,
                    Value  = node.Debt.Availability,
                    Group  = "squads",
                };
                result.Nodes.Add(snode);

                foreach (var feature in node.Features)
                {
                    var feature_id = string.Format("feature_{0}", feature.Id);
                    var fnode      = result.Nodes.SingleOrDefault(c => c.Id == feature_id);
                    if (fnode == null)
                    {
                        fnode = new GraphNode
                        {
                            Id     = feature_id,
                            Avatar = feature.Avatar,
                            Name   = feature.Name,
                            Value  = feature.Debt.Availability,
                            Group  = string.Format("features_{0}", feature.Product),
                        };
                        result.Nodes.Add(fnode);
                    }
                    var edge_squad_feature = result.Edges.Where(c => c.From == snode.Id && c.To == fnode.Id).SingleOrDefault();
                    if (edge_squad_feature == null)
                    {
                        var fedge = new GraphEdge()
                        {
                            From  = snode.Id,
                            To    = fnode.Id,
                            Value = feature.Debt.Availability
                        };
                        result.Edges.Add(fedge);
                    }
                }
            }
            return(result);
        }
Esempio n. 5
0
        public async Task <GraphGetRp> GetGraph(int id, DatePeriodValue period)
        {
            GraphGetRp result = new GraphGetRp();

            var rootJourney = await this._dbContext.Journeys
                              .Include(c => c.FeatureMap)
                              .SingleAsync(c => c.Id == id);

            var rootFeatures = rootJourney.FeatureMap.Select(c => c.FeatureId).Distinct().ToList();

            var extendedJourneysIds = await this._dbContext.JourneyMaps
                                      .Where(c => rootFeatures.Contains(c.FeatureId)).Select(c => c.JourneyId)
                                      .ToListAsync();

            var extendedJourneys = await this._dbContext.Journeys
                                   .Include(c => c.FeatureMap)
                                   .Where(c => extendedJourneysIds.Contains(c.Id.Value))
                                   .ToListAsync();

            var featuresExtended = extendedJourneys.SelectMany(c => c.FeatureMap.Select(d => d.FeatureId));
            var featuresRoot     = rootJourney.FeatureMap.Select(c => c.FeatureId);
            var featuresIds      = featuresExtended.Union(featuresRoot).ToList();

            var features = await this._dbContext.Features
                           .Include(c => c.Indicators)
                           .ThenInclude(c => c.Source)
                           .Where(c => featuresIds.Contains(c.Id.Value))
                           .ToListAsync();

            var sources = features.SelectMany(c => c.Indicators.Select(d => d.SourceId));

            var sourceItems = await this._dbContext.GetSourceItems(sources, period.Start, period.End);

            var journeys = new List <JourneyEntity>(extendedJourneys);

            journeys.Add(rootJourney);


            foreach (var feature in features)
            {
                foreach (var indicator in feature.Indicators)
                {
                    indicator.Source.SourceItems = sourceItems.Where(c => c.SourceId == indicator.Source.Id).ToList();
                }
                feature.Measure();
            }

            foreach (var journey in journeys)
            {
                foreach (var map in journey.FeatureMap)
                {
                    map.Feature = features.Where(c => c.Id == map.FeatureId).Single();

                    if (map.Feature.JourneyMaps.Where(
                            c => c.FeatureId == map.Feature.Id.Value &&
                            c.JourneyId == journey.Id.Value
                            ).Count() == 0)
                    {
                        map.Feature.JourneyMaps.Add(new JourneyMapEntity()
                        {
                            FeatureId = map.Feature.Id.Value,
                            JourneyId = journey.Id.Value,
                            Feature   = map.Feature,
                            Journey   = journey
                        });
                    }
                }
            }

            var rootMeasure = rootJourney.Measure();

            var snode = new GraphNode("journeys", "journey",
                                      rootJourney.Id.Value,
                                      rootJourney.Avatar,
                                      string.Format("{0} [ {1} | {2} ]", rootJourney.Name,
                                                    Math.Round(rootJourney.AvailabilitySlo, 2),
                                                    Math.Round(rootMeasure.Availability, 2))
                                      , rootMeasure.Availability, rootJourney.AvailabilitySlo);

            result.Nodes.Add(snode);

            foreach (var map in rootJourney.FeatureMap)
            {
                var feature = map.Feature;
                var Id      = string.Format("feature_{0}", feature.Id);
                var fnode   = result.Nodes.SingleOrDefault(c => c.Id == Id);
                if (fnode == null)
                {
                    fnode = new GraphNode("features", "feature", feature.Id.Value,
                                          feature.Avatar,
                                          feature.Name,
                                          feature.Measure().Availability, 0);

                    result.Nodes.Add(fnode);
                }

                var fedge = new GraphEdge(snode.Id, fnode.Id,
                                          fnode.Value - rootJourney.AvailabilitySlo,
                                          new Dictionary <string, object>()
                {
                    { "Availability", fnode.Value }
                });

                result.Edges.Add(fedge);

                foreach (var extended in extendedJourneys)
                {
                    var temporal = extended.FeatureMap.Where(c => c.FeatureId == feature.Id).SingleOrDefault();
                    if (temporal != null && temporal.Feature.JourneyMaps.Count <= 10)
                    {
                        var extendedMeasure = extended.Measure();

                        var temp_node = new GraphNode("journeys",
                                                      "journey",
                                                      extended.Id.Value,
                                                      extended.Avatar,
                                                      string.Format("{0} [ {1} | {2} ]", extended.Name,
                                                                    Math.Round(extended.AvailabilitySlo, 2),
                                                                    Math.Round(extendedMeasure.Availability, 2))
                                                      , extendedMeasure.Availability, extended.AvailabilitySlo);

                        if (result.Nodes.Count(c => c.Id == temp_node.Id) == 0)
                        {
                            result.Nodes.Add(temp_node);

                            var tmp_edge = new GraphEdge(
                                temp_node.Id,
                                fnode.Id,
                                fnode.Value - extended.AvailabilitySlo,
                                new Dictionary <string, object>()
                            {
                                { "Availability", fnode.Value }
                            });
                            result.Edges.Add(tmp_edge);
                        }
                    }
                }
            }

            return(result);
        }