public async Task GetCalculationResultSummariesDelegatesToCosmosUsingCustomSqlQuery() { string specificationId = NewRandomString(); string providerId = NewRandomString(); ProviderCalculationResult resultOne = NewProviderResultSummary(); ProviderCalculationResult resultTwo = NewProviderResultSummary(); ProviderCalculationResult resultThree = NewProviderResultSummary(); resultOne.ProviderId = providerId; string[] keys = new string[] { resultOne.ProviderId, resultTwo.ProviderId, resultThree.ProviderId }; GivenTheSqlQueryResultsForSpecificationResults(specificationId, resultOne, resultTwo, resultThree); IEnumerable <ProviderCalculationResult> result = await WhenTheCalculationResultsAreQueriedBySpecificationIdAndProviderId(specificationId, providerId); result .Should() .BeOfType <IEnumerable <ProviderCalculationResult> >() .And .NotBeNull() .And .HaveCount(1); ProviderCalculationResult providerCalculationResult = result.FirstOrDefault(); providerCalculationResult .Should() .BeEquivalentTo(resultOne); }
/// <summary> /// Generate Funding Lines, Calculations and Reference Data for a funding stream for all in scope providers /// </summary> /// <param name="templateMetadata">Template Metadata</param> /// <param name="templateMapping">Template Mapping</param> /// <param name="scopedProviders">Scoped providers for a specification</param> /// <param name="calculationResults">Calculation Results</param> /// <returns>Dictionary of Generated Provider Results, keyed on ProviderId</returns> public IDictionary <string, GeneratedProviderResult> Generate(TemplateMetadataContents templateMetadata, Common.ApiClient.Calcs.Models.TemplateMapping templateMapping, IEnumerable <Provider> scopedProviders, IDictionary <string, ProviderCalculationResult> calculationResults) { Guard.ArgumentNotNull(templateMetadata, nameof(templateMetadata)); Guard.ArgumentNotNull(templateMapping, nameof(templateMapping)); Guard.ArgumentNotNull(calculationResults, nameof(calculationResults)); ConcurrentDictionary <string, GeneratedProviderResult> results = new ConcurrentDictionary <string, GeneratedProviderResult>(); TimeSpan loggingPeriod = TimeSpan.FromMinutes(5); using (new Timer( _ => _logger.Information($"{results.Count}: Published Providers processed."), null, loggingPeriod, loggingPeriod)) Parallel.ForEach(scopedProviders, new ParallelOptions { MaxDegreeOfParallelism = 15 }, (provider) => { GeneratedProviderResult generatedProviderResult = new GeneratedProviderResult(); ProviderCalculationResult calculationResultsForProvider = null; calculationResults.TryGetValue(provider.ProviderId, out calculationResultsForProvider); if (calculationResultsForProvider != null) { GeneratorModels.FundingValue fundingValue = _fundingLineTotalAggregator.GenerateTotals(templateMetadata, templateMapping.TemplateMappingItems.ToDictionary(_ => _.TemplateId), calculationResultsForProvider.Results.ToDictionary(_ => _.Id)); // Get funding lines IEnumerable <GeneratorModels.FundingLine> fundingLines = fundingValue.FundingLines?.Flatten(_ => _.FundingLines) ?? new GeneratorModels.FundingLine[0]; Dictionary <uint, GeneratorModels.FundingLine> uniqueFundingLine = new Dictionary <uint, GeneratorModels.FundingLine>(); generatedProviderResult.FundingLines = fundingLines.Where(_ => uniqueFundingLine.TryAdd(_.TemplateLineId, _)).Select(_ => { return(_mapper.Map <FundingLine>(_)); }).ToList(); // Set total funding generatedProviderResult.TotalFunding = generatedProviderResult.FundingLines .Sum(p => { return(p.Type == FundingLineType.Payment ? p.Value : 0); }); Dictionary <uint, GeneratorModels.Calculation> uniqueCalculations = new Dictionary <uint, GeneratorModels.Calculation>(); // Get calculations IEnumerable <GeneratorModels.Calculation> fundingCalculations = uniqueFundingLine.Values?.SelectMany(_ => _.Calculations.Flatten(calc => calc.Calculations)) ?? new GeneratorModels.Calculation[0]; generatedProviderResult.Calculations = fundingCalculations.Where(_ => uniqueCalculations.TryAdd(_.TemplateCalculationId, _)).Select(_ => { return(_mapper.Map <FundingCalculation>(_)); }).ToList(); // Set Provider information generatedProviderResult.Provider = _mapper.Map <Provider>(provider); results.TryAdd(provider.ProviderId, generatedProviderResult); } }); return(results); }