private async Task DeleteSpecificationRelationshipGraph(SpecificationCalculationRelationships specificationCalculationUnusedRelationships) { Specification specification = specificationCalculationUnusedRelationships.Specification; Guard.ArgumentNotNull(specification, nameof(specification)); if (specificationCalculationUnusedRelationships.Calculations != null) { await DeleteSpecificationCalculationRelationships(specification, specificationCalculationUnusedRelationships.Calculations); } if (specificationCalculationUnusedRelationships.FundingLines != null) { await DeleteFundingLines(specificationCalculationUnusedRelationships.FundingLines); } if (specificationCalculationUnusedRelationships.CalculationRelationships != null) { await DeleteCalculationRelationships(specificationCalculationUnusedRelationships.CalculationRelationships); } if (specificationCalculationUnusedRelationships.CalculationDataFieldRelationships != null) { await DeleteDatasetRelationships(specificationCalculationUnusedRelationships.CalculationDataFieldRelationships); } }
public async Task DeterminesCalculationRelationsForAllCalculationsInTheSpecificationWithTheSuppliedId() { string specificationId = NewRandomString(); Calculation calculation = new Calculation(); SpecificationSummary specificationSummary = new SpecificationSummary(); Specification graphSpecification = NewGraphSpecification(); Calculation[] calculations = new[] { calculation, }; GraphCalculation[] graphCalculations = new GraphCalculation[0]; FundingLine[] fundingLines = new FundingLine[0]; CalculationRelationship[] calculationRelationships = new CalculationRelationship[0]; FundingLineCalculationRelationship[] fundingLineCalculationRelationships = new FundingLineCalculationRelationship[0]; List <Models.Calcs.DatasetRelationshipSummary> datasetRelationshipSummaries = new List <Models.Calcs.DatasetRelationshipSummary>(); DatasetReference[] datasetReferences = new[] { new DatasetReference { Calculations = graphCalculations.ToList(), DataField = new DataField(), Dataset = new Models.Graph.Dataset(), DatasetDefinition = new DatasetDefinition() }, }; GivenTheSpecification(specificationId, specificationSummary); AndTheCalculations(specificationId, calculations); AndTheRelationshipsForTheCalculations(calculations, calculationRelationships); AndTheBuildProjectForTheSpecification(specificationId, datasetRelationshipSummaries); AndTheDatasetReferencesForTheCalculations(calculations, datasetRelationshipSummaries, datasetReferences); AndTheMapping(calculations, graphCalculations); AndTheMapping(specificationSummary, graphSpecification); SpecificationCalculationRelationships specificationCalculationRelationships = await WhenTheRelationshipsAreDetermined(specificationId); specificationCalculationRelationships .Should() .BeEquivalentTo(new SpecificationCalculationRelationships { Specification = graphSpecification, FundingLineRelationships = fundingLineCalculationRelationships, FundingLines = fundingLines, Calculations = graphCalculations, CalculationRelationships = calculationRelationships, CalculationDataFieldRelationships = datasetReferences.SelectMany(_ => _.Calculations.Select(calculation => new CalculationDataFieldRelationship { Calculation = calculation, DataField = _.DataField })), DatasetDataFieldRelationships = datasetReferences.Select(_ => new DatasetDataFieldRelationship { Dataset = _.Dataset, DataField = _.DataField }), DatasetDatasetDefinitionRelationships = datasetReferences.Select(_ => new DatasetDatasetDefinitionRelationship { Dataset = _.Dataset, DatasetDefinition = _.DatasetDefinition }) }); }
private async Task InsertSpecificationRelationships(SpecificationCalculationRelationships specificationCalculationRelationships) { string specificationId = specificationCalculationRelationships.Specification.SpecificationId; IEnumerable <string> calculationIds = specificationCalculationRelationships.Calculations.Select(_ => _.CalculationId); foreach (string calculationId in calculationIds) { HttpStatusCode response = await _resilience.ExecuteAsync(() => _graphApiClient.UpsertCalculationSpecificationRelationship(calculationId, specificationId)); EnsureApiCallSucceeded(response, $"Unable to create specification calculation relationship {specificationId}->{calculationId}"); } }
public override async Task Process(Message message) { Guard.ArgumentNotNull(message, nameof(message)); string specificationId = message.GetUserProperty <string>(SpecificationId); Guard.IsNullOrWhiteSpace(specificationId, nameof(specificationId)); SpecificationCalculationRelationships specificationCalculationRelationships = await _analysis .GetSpecificationCalculationRelationships(specificationId); SpecificationCalculationRelationships specificationCalculationUnusedRelationships = await _reIndexGraphs.GetUnusedRelationships(specificationCalculationRelationships); await _reIndexGraphs.RecreateGraph(specificationCalculationRelationships, specificationCalculationUnusedRelationships); }
public async Task UpsertsRelationshipsFoundForSpecificationId() { string specificationId = new RandomString(); string jobId = new RandomString(); SpecificationCalculationRelationships specificationCalculationRelationships = new SpecificationCalculationRelationships(); SpecificationCalculationRelationships specificationCalculationUnusedRelationships = new SpecificationCalculationRelationships(); GivenTheMessageProperties(("specification-id", specificationId)); GivenTheMessageProperties(("jobid", jobId)); AndTheRelationshipsForSpecificationId(specificationId, specificationCalculationRelationships); AndTheUnusedRelationshipsForSpecificationId(specificationCalculationRelationships, specificationCalculationUnusedRelationships); await WhenTheReIndexerIsRun(); _relationships.Verify(_ => _.RecreateGraph(specificationCalculationRelationships, specificationCalculationUnusedRelationships), Times.Once); }
private async Task InsertSpecificationGraph(SpecificationCalculationRelationships specificationCalculationRelationships) { List <Task> tasks = new List <Task>(); tasks.Add(InsertSpecificationNode(specificationCalculationRelationships.Specification)); tasks.Add(InsertCalculationNodes(specificationCalculationRelationships.Calculations)); tasks.Add(InsertSpecificationRelationships(specificationCalculationRelationships)); tasks.Add(InsertCalculationRelationships(specificationCalculationRelationships.CalculationRelationships)); tasks.Add(InsertDataFieldRelationships(specificationCalculationRelationships.CalculationDataFieldRelationships)); tasks.Add(InsertDatasetDataFieldRelationships(specificationCalculationRelationships.DatasetDataFieldRelationships, specificationCalculationRelationships.Specification.SpecificationId)); tasks.Add(InsertDatasetDatasetDefinitionRelationships(specificationCalculationRelationships.DatasetDatasetDefinitionRelationships)); if (Common.Extensions.IEnumerableExtensions.AnyWithNullCheck(specificationCalculationRelationships.FundingLineRelationships)) { tasks.Add(InsertFundingLines(specificationCalculationRelationships.FundingLineRelationships)); } await Core.Helpers.TaskHelper.WhenAllAndThrow(tasks.ToArraySafe()); }
public async Task RecreateGraph(SpecificationCalculationRelationships specificationCalculationRelationships, SpecificationCalculationRelationships specificationCalculationUnusedRelationships) { try { Guard.ArgumentNotNull(specificationCalculationRelationships, nameof(specificationCalculationRelationships)); if (specificationCalculationUnusedRelationships != null) { await DeleteSpecificationRelationshipGraph(specificationCalculationUnusedRelationships); } await InsertSpecificationGraph(specificationCalculationRelationships); } catch (Exception e) { _logger.Error(e, "Unable to complete calculation relationship upserts"); throw; } }
private void AndTheUnusedRelationshipsForSpecificationId(SpecificationCalculationRelationships specificationCalculationRelationships, SpecificationCalculationRelationships specificationUnusedCalculationRelationships) { _relationships.Setup(_ => _.GetUnusedRelationships(specificationCalculationRelationships)) .ReturnsAsync(specificationUnusedCalculationRelationships); }
private void AndTheRelationshipsForSpecificationId(string specificationId, SpecificationCalculationRelationships specificationCalculationRelationships) { _analysis.Setup(_ => _.GetSpecificationCalculationRelationships(specificationId)) .ReturnsAsync(specificationCalculationRelationships); }
public async Task DeletesThenInsertsGraphForSpecification(bool withCallsCalculation, bool withBelongsToSpecification, bool withFundingLineRemoval) { string specificationId = NewRandomString(); string fundingLineIdOne = NewRandomString(); string fundingLineIdTwo = NewRandomString(); string fundingLineIdThree = NewRandomString(); string fundingLineIdFour = NewRandomString(); string fundingLineIdFive = NewRandomString(); string calculationIdOne = NewRandomString(); string calculationIdTwo = NewRandomString(); string calculationIdThree = NewRandomString(); string calculationIdFour = NewRandomString(); string calculationIdFive = NewRandomString(); string datafieldId = NewRandomString(); Specification specification = NewGraphSpecification(_ => _.WithId(specificationId)); IEnumerable <ApiEntitySpecification> existingEntities = new[] { new ApiEntitySpecification { Node = new ApiSpecification { SpecificationId = specificationId }, Relationships = withBelongsToSpecification ? new[] { new ApiRelationship { One = NewGraphCalculation(_ => _.WithId(calculationIdFive)), Type = "BelongsToSpecification", Two = specification } } : null } }; IEnumerable <ApiEntityCalculation> existingCalculationEntities = new[] { new ApiEntityCalculation { Node = new ApiCalculation { CalculationId = calculationIdFive }, Relationships = new[] { new ApiRelationship { One = NewGraphCalculation(_ => _.WithId(calculationIdOne)), Type = "ReferencesDataField", Two = NewDataField(_ => _.WithCalculationId(calculationIdOne).WithDataFieldId(datafieldId)) } } } }; if (withCallsCalculation) { existingCalculationEntities = existingCalculationEntities.Concat(new[] { new ApiEntityCalculation { Node = new ApiCalculation { SpecificationId = specificationId, CalculationId = calculationIdFour }, Relationships = new[] { new ApiRelationship { One = NewGraphCalculation(_ => _.WithId(calculationIdFour)), Type = "CallsCalculation", Two = NewGraphCalculation(_ => _.WithId(calculationIdFive)) } } } }); } IEnumerable <ApiEntityFundingLine> existingFundingLines = (new[] { new ApiEntityFundingLine { Node = new ApiFundingLine { FundingLineId = fundingLineIdFive } } }); FundingLine[] fundingLines = new[] { NewGraphFundingLine(_ => _.WithId(fundingLineIdOne)), NewGraphFundingLine(_ => _.WithId(fundingLineIdTwo)), NewGraphFundingLine(_ => _.WithId(fundingLineIdThree)), NewGraphFundingLine(_ => _.WithId(fundingLineIdFour)), NewGraphFundingLine(_ => _.WithId(fundingLineIdFive)) }; FundingLineCalculationRelationship[] fundingLineRelationships = new[] { NewFundingLineRelationship(_ => _.WithCalculationOneId(calculationIdOne) .WithCalculationTwoId(calculationIdOne) .WithFundingLine(fundingLines[0])), NewFundingLineRelationship(_ => _.WithCalculationOneId(calculationIdOne) .WithCalculationTwoId(calculationIdTwo) .WithFundingLine(fundingLines[1])), NewFundingLineRelationship(_ => _.WithCalculationOneId(calculationIdOne) .WithCalculationTwoId(calculationIdThree) .WithFundingLine(fundingLines[2])), NewFundingLineRelationship(_ => _.WithCalculationOneId(calculationIdOne) .WithCalculationTwoId(calculationIdFour) .WithFundingLine(fundingLines[3])) }; IEnumerable <FundingLine> unusedFundingLines = new FundingLine[0]; unusedFundingLines = unusedFundingLines.Concat(new[] { NewGraphFundingLine(_ => _.WithId(fundingLineIdFive)) }); Calculation[] calculations = new[] { NewGraphCalculation(_ => _.WithId(calculationIdOne)), NewGraphCalculation(_ => _.WithId(calculationIdTwo)), NewGraphCalculation(_ => _.WithId(calculationIdThree)), NewGraphCalculation(_ => _.WithId(calculationIdFour)), }; CalculationRelationship[] calculationRelationships = new[] { NewCalculationRelationship(_ => _.WithCalculationOneId(calculationIdTwo) .WithCalculationTwoId(calculationIdOne)), NewCalculationRelationship(_ => _.WithCalculationOneId(calculationIdThree) .WithCalculationTwoId(calculationIdTwo)), NewCalculationRelationship(_ => _.WithCalculationOneId(calculationIdFour) .WithCalculationTwoId(calculationIdThree)) }; IEnumerable <CalculationRelationship> unusedCalculationRelationships = new CalculationRelationship[0]; if (withCallsCalculation) { unusedCalculationRelationships = unusedCalculationRelationships.Concat(new[] { NewCalculationRelationship(_ => _.WithCalculationOneId(calculationIdFour) .WithCalculationTwoId(calculationIdFive)) }); } CalculationDataFieldRelationship[] dataFieldRelationships = calculations.Select(_ => new CalculationDataFieldRelationship { Calculation = _, DataField = NewDataField(datafieldBuilder => datafieldBuilder.WithCalculationId(_.CalculationId)) }).ToArray(); Dataset newDataset = NewDataset(); DatasetDataFieldRelationship[] datasetDataFieldRelationships = dataFieldRelationships.Select(_ => new DatasetDataFieldRelationship { DataField = _.DataField, Dataset = newDataset }).ToArray(); DatasetDefinition newDatasetDefinition = NewDatasetDefinition(); DatasetDatasetDefinitionRelationship[] datasetDatasetDefinitionRelationships = datasetDataFieldRelationships.Select(_ => new DatasetDatasetDefinitionRelationship { Dataset = _.Dataset, DatasetDefinition = newDatasetDefinition }).ToArray(); CalculationDataFieldRelationship[] unusedDataFieldRelationships = new[] { new CalculationDataFieldRelationship { Calculation = NewGraphCalculation(_ => _.WithId(calculationIdOne)), DataField = NewDataField(datasetBuilder => datasetBuilder.WithCalculationId(calculationIdOne).WithDataFieldId(datafieldId)) } }; SpecificationCalculationRelationships specificationCalculationRelationships = NewSpecificationCalculationRelationships(_ => _.WithSpecification(specification) .WithCalculations(calculations) .WithFundingLines(fundingLines) .WithFundingLineCalculationRelationships(fundingLineRelationships) .WithCalculationRelationships(calculationRelationships) .WithCalculationDataFieldRelationships(dataFieldRelationships) .WithDatasetDataFieldRelationships(datasetDataFieldRelationships) .WithDatasetDatasetDefinitionRelationships(datasetDatasetDefinitionRelationships)); ApiSpecification apiSpecification = NewApiSpecification(); ApiCalculation[] apiCalculations = new[] { NewApiCalculation(), NewApiCalculation(), NewApiCalculation() }; ApiFundingLine[] apiFundingLines = new[] { NewApiFundingLine(_ => _.WithId(fundingLineIdOne)), NewApiFundingLine(_ => _.WithId(fundingLineIdTwo)), NewApiFundingLine(_ => _.WithId(fundingLineIdThree)), NewApiFundingLine(_ => _.WithId(fundingLineIdFour)), NewApiFundingLine(_ => _.WithId(fundingLineIdFive)) }; GivenTheMapping(specification, apiSpecification); foreach (CalculationDataFieldRelationship datFieldRelationship in dataFieldRelationships) { AndTheMapping(datFieldRelationship.DataField, new ApiDataField { CalculationId = datFieldRelationship.DataField.CalculationId, DataFieldId = datFieldRelationship.DataField.DataFieldId, DataFieldName = datFieldRelationship.DataField.DataFieldName }); } AndTheMapping(newDataset, new ApiDataSet { DatasetId = newDataset.DatasetId, Name = newDataset.Name }); AndTheMapping(newDatasetDefinition, new ApiDatasetDefinition { DatasetDefinitionId = newDatasetDefinition.DatasetDefinitionId, Name = newDatasetDefinition.Name }); if (withFundingLineRemoval) { AndTheMapping(existingFundingLines.Select(_ => _.Node).First(), unusedFundingLines.First()); } foreach (FundingLine fundingLine in fundingLines.Where(_ => !unusedFundingLines.Any(uf => uf.FundingLineId == _.FundingLineId))) { AndTheMapping(fundingLine, apiFundingLines.Where(_ => _.FundingLineId == fundingLine.FundingLineId).First()); } AndTheCollectionMapping(calculations, apiCalculations); AndTheSpecificationRelationshipsAreDeleted(calculationIdFive, specificationId, unusedCalculationRelationships, unusedDataFieldRelationships, withBelongsToSpecification); if (withFundingLineRemoval) { AndTheFundingLinesAreDeleted(unusedFundingLines.ToArray()); } AndTheSpecificationIsCreated(apiSpecification); AndTheCalculationsAreCreated(apiCalculations); AndTheFundingLinesAreCreated(apiFundingLines.Where(_ => !unusedFundingLines.Any(uf => uf.FundingLineId == _.FundingLineId)).ToArray()); AndTheSpecificationCalculationRelationshipsWereCreated(specificationId, new [] { calculationIdOne, calculationIdTwo, calculationIdThree, calculationIdFour }); AndTheFundingLineCalculationRelationshipsWereCreated(calculationIdOne, fundingLines.Select(_ => _.FundingLineId).ToArray(), calculations.Select(_ => _.CalculationId).ToArray()); AndTheExistingRelationships(specificationId, existingEntities); AndTheExistingCalculationRelationships(calculationIdOne, existingCalculationEntities); if (withFundingLineRemoval) { AndTheExistingFundingLines(existingFundingLines); } AndTheRelationshipsWereCreated(calculationRelationships); AndTheDataFieldRelationshipsWereCreated(dataFieldRelationships); AndTheDatasetDataFieldRelationshipsWereCreated(datasetDataFieldRelationships, specificationId); AndTheDatasetDatasetDefinitionRelationshipsWereCreated(datasetDatasetDefinitionRelationships); SpecificationCalculationRelationships specificationUnusedCalculationRelationships = await WhenTheUnusedRelationshipsAreReturned(specificationCalculationRelationships); await AndTheGraphIsRecreated(specificationCalculationRelationships, specificationUnusedCalculationRelationships); _graphApiClient.VerifyAll(); }
private async Task WhenTheGraphIsRecreated(SpecificationCalculationRelationships specificationCalculationRelationships, SpecificationCalculationRelationships specificationUnusedCalculationRelationships) { await _repository.RecreateGraph(specificationCalculationRelationships, specificationUnusedCalculationRelationships); }
private async Task AndTheGraphIsRecreated(SpecificationCalculationRelationships specificationCalculationRelationships, SpecificationCalculationRelationships specificationUnusedCalculationRelationships) { await WhenTheGraphIsRecreated(specificationCalculationRelationships, specificationUnusedCalculationRelationships); }
private async Task <SpecificationCalculationRelationships> WhenTheUnusedRelationshipsAreReturned(SpecificationCalculationRelationships specificationCalculationRelationships) { return(await _repository.GetUnusedRelationships(specificationCalculationRelationships)); }
public async Task <SpecificationCalculationRelationships> GetUnusedRelationships(SpecificationCalculationRelationships specificationCalculationRelationships) { ApiResponse <IEnumerable <ApiEntitySpecification> > apiResponse = await _resilience.ExecuteAsync(() => _graphApiClient.GetAllEntitiesRelatedToSpecification(specificationCalculationRelationships.Specification.SpecificationId)); IEnumerable <ApiEntitySpecification> entities = apiResponse?.Content; if (Common.Extensions.IEnumerableExtensions.IsNullOrEmpty(entities)) { return(null); } IEnumerable <ApiEntityCalculation> allCalculations = new ApiEntityCalculation[0]; foreach (Calculation calculation in specificationCalculationRelationships.Calculations) { ApiResponse <IEnumerable <ApiEntityCalculation> > apiCalcResponse = await _resilience.ExecuteAsync(() => _graphApiClient.GetAllEntitiesRelatedToCalculation(calculation.CalculationId)); IEnumerable <ApiEntityCalculation> calcs = apiCalcResponse?.Content; if (Common.Extensions.IEnumerableExtensions.AnyWithNullCheck(calcs)) { allCalculations = allCalculations.Concat(calcs); } } IEnumerable <Calculation> removedSpecificationCalculations = RemoveCalculationSpecificationRelationships(specificationCalculationRelationships.Calculations, entities); IEnumerable <CalculationRelationship> removedCalculationRelationships = RemoveCalculationCalculationRelationships(specificationCalculationRelationships.CalculationRelationships, allCalculations); IEnumerable <CalculationDataFieldRelationship> removedDatasetReferences = await RemoveDataFieldCalculationRelationships(specificationCalculationRelationships.CalculationDataFieldRelationships, specificationCalculationRelationships.Calculations); IEnumerable <FundingLine> removedFundingLines = await RemoveFundingLines(specificationCalculationRelationships.FundingLineRelationships, specificationCalculationRelationships.FundingLines); return(new SpecificationCalculationRelationships { Specification = specificationCalculationRelationships.Specification, Calculations = removedSpecificationCalculations, FundingLines = removedFundingLines, CalculationRelationships = removedCalculationRelationships, CalculationDataFieldRelationships = removedDatasetReferences }); }