コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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
                })
            });
        }
コード例 #3
0
        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}");
            }
        }
コード例 #4
0
        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);
        }
コード例 #6
0
        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());
        }
コード例 #7
0
        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));
 }
コード例 #14
0
        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
            });
        }