protected override void SetSpecificAggregateRepositoriesForTest() { var signals = Db.Signals; foreach (var signal in signals) { foreach (var approach in signal.Approaches) { PopulateApproachData(approach); } } ApproachPcdAggregationRepositoryFactory.SetApplicationEventRepository( new InMemoryApproachPcdAggregationRepository(Db)); ApproachEventCountAggregationRepositoryFactory.SetRepository(new InMemoryApproachEventCountAggregationRepository(Db)); }
protected override void LoadBins(Approach approach, ApproachAggregationMetricOptions options, bool getProtectedPhase, AggregatedDataType dataType) { var approachPcdAggregationRepository = ApproachPcdAggregationRepositoryFactory.Create(); var pcdAggregations = approachPcdAggregationRepository.GetApproachPcdsAggregationByApproachIdAndDateRange( approach.ApproachID, options.StartDate, options.EndDate, getProtectedPhase); if (pcdAggregations != null) { var concurrentBinContainers = new ConcurrentBag <BinsContainer>(); //foreach (var binsContainer in binsContainers) Parallel.ForEach(BinsContainers, binsContainer => { var tempBinsContainer = new BinsContainer(binsContainer.Start, binsContainer.End); var concurrentBins = new ConcurrentBag <Bin>(); var cycleAggregationRepository = Models.Repositories.ApproachCycleAggregationRepositoryFactory.Create(); var cycleAggregtaions = cycleAggregationRepository.GetApproachCyclesAggregationByApproachIdAndDateRange( approach.ApproachID, options.StartDate, options.EndDate, getProtectedPhase); //foreach (var bin in binsContainer.Bins) Parallel.ForEach(binsContainer.Bins, bin => { if (pcdAggregations.Any(s => s.BinStartTime >= bin.Start && s.BinStartTime < bin.End)) { double pcdCount = 0; switch (dataType.DataName) { case "ArrivalsOnGreen": pcdCount = pcdAggregations.Where(s => s.BinStartTime >= bin.Start && s.BinStartTime < bin.End) .Sum(s => s.ArrivalsOnGreen); break; case "ArrivalsOnRed": pcdCount = pcdAggregations.Where(s => s.BinStartTime >= bin.Start && s.BinStartTime < bin.End) .Sum(s => s.ArrivalsOnRed); break; case "ArrivalsOnYellow": pcdCount = pcdAggregations.Where(s => s.BinStartTime >= bin.Start && s.BinStartTime < bin.End) .Sum(s => s.ArrivalsOnYellow); break; case "PercentArrivalsOnGreen": pcdCount = Convert.ToInt32(Math.Round(GetPercentArrivalOnGreen(bin, pcdAggregations) * 100)); break; case "PlatoonRatio": double percentArrivalOnGreen = GetPercentArrivalOnGreen(bin, pcdAggregations); var aggregations = cycleAggregtaions.Where(s => s.BinStartTime >= bin.Start && s.BinStartTime < bin.End).ToList(); double greenTime = aggregations.Sum(s => s.GreenTime); double totalTime = greenTime + aggregations.Sum(s => s.YellowTime) + aggregations.Sum(s => s.RedTime); if (greenTime > 0) { pcdCount = percentArrivalOnGreen / (greenTime / totalTime); } break; case "ApproachVolume": pcdCount = pcdAggregations.Where(s => s.BinStartTime >= bin.Start && s.BinStartTime < bin.End).Sum(s => s.ArrivalsOnYellow) + pcdAggregations.Where(s => s.BinStartTime >= bin.Start && s.BinStartTime < bin.End).Sum(s => s.ArrivalsOnGreen) + pcdAggregations.Where(s => s.BinStartTime >= bin.Start && s.BinStartTime < bin.End).Sum(s => s.ArrivalsOnRed); break; default: throw new Exception("Unknown Aggregate Data Type for Split Failure"); } concurrentBins.Add(new Bin { Start = bin.Start, End = bin.End, Sum = pcdCount, Average = pcdCount }); } else { concurrentBins.Add(new Bin { Start = bin.Start, End = bin.End, Sum = 0, Average = 0 }); } }); tempBinsContainer.Bins = concurrentBins.OrderBy(c => c.Start).ToList(); concurrentBinContainers.Add(tempBinsContainer); }); BinsContainers = concurrentBinContainers.OrderBy(b => b.Start).ToList(); } }