CalculationProviderResultSearchResults GenerateSearchResults(int numberOfItems, IEnumerable <Facet> facets = null)
        {
            CalculationProviderResultSearchResults       result = new CalculationProviderResultSearchResults();
            List <CalculationProviderResultSearchResult> items  = new List <CalculationProviderResultSearchResult>();

            for (int i = 0; i < numberOfItems; i++)
            {
                items.Add(new CalculationProviderResultSearchResult
                {
                    Id                = $"{i + 10}",
                    CalculationId     = "calcId",
                    CalculationName   = $"calc-{i + 1}",
                    ProviderName      = $"prov-{i + 1}",
                    CalculationResult = i + 1,
                });
            }

            items.Add(new CalculationProviderResultSearchResult
            {
                Id = $"{numberOfItems + 10}",
                CalculationName             = $"prov-{numberOfItems + 1}",
                CalculationId               = "calcId",
                CalculationResult           = numberOfItems + 1,
                CalculationExceptionType    = "Exception",
                CalculationExceptionMessage = "An exception has occurred"
            });

            result.Results         = items.AsEnumerable();
            result.TotalCount      = numberOfItems + 1;
            result.TotalErrorCount = 1;
            result.Facets          = facets;

            return(result);
        }
        async public Task <IActionResult> SearchCalculationProviderResults(HttpRequest request)
        {
            string json = await request.GetRawBodyStringAsync();

            SearchModel searchModel = JsonConvert.DeserializeObject <SearchModel>(json);

            if (searchModel == null || searchModel.PageNumber < 1 || searchModel.Top < 1)
            {
                _logger.Error("A null or invalid search model was provided for searching calculation provider results");

                return(new BadRequestObjectResult("An invalid search model was provided"));
            }

            try
            {
                CalculationProviderResultSearchResults results = await SearchCalculationProviderResults(searchModel);

                return(new OkObjectResult(results));
            }
            catch (FailedToQuerySearchException exception)
            {
                _logger.Error(exception, $"Failed to query search with term: {searchModel.SearchTerm}");

                return(new StatusCodeResult(500));
            }
        }
        public async Task PerformSearch_GivenFirstSearchResultReturnedCorrectly_EnsuresResult()
        {
            // Arrange
            int numberOfItems = 25;

            CalculationProviderResultSearchResults itemResult = GenerateSearchResults(numberOfItems);

            _resultsClient
            .SearchCalculationProviderResults(Arg.Any <SearchModel>())
            .Returns(new ApiResponse <CalculationProviderResultSearchResults>(HttpStatusCode.OK, itemResult));

            SearchRequestViewModel request = new SearchRequestViewModel();

            AndCalculationExistsForCalcId("calcId");

            // Act
            CalculationProviderResultSearchResultViewModel results = await _resultsSearchService.PerformSearch(request);

            // Assert
            CalculationProviderResultSearchResultItemViewModel first = results.CalculationProviderResults.First();

            first
            .Should()
            .NotBeNull();

            first
            .Id
            .Should()
            .Be("10");

            first
            .ProviderName
            .Should()
            .Be("prov-1");

            first
            .CalculationResult
            .Should()
            .Be(1);

            CalculationProviderResultSearchResultItemViewModel last = results.CalculationProviderResults.Last();

            last
            .CalculationExceptionType
            .Should()
            .Be("Exception");

            last
            .CalculationExceptionMessage
            .Should()
            .Be("An exception has occurred");
        }
        public async Task <CalculationProviderResultSearchResults> SearchCalculationProviderResults(SearchModel searchModel)
        {
            IEnumerable <Task <SearchResults <CalculationProviderResultsIndex> > > searchTasks = BuildSearchTasks(searchModel);

            await TaskHelper.WhenAllAndThrow(searchTasks.ToArraySafe());

            CalculationProviderResultSearchResults results = new CalculationProviderResultSearchResults();

            foreach (Task <SearchResults <CalculationProviderResultsIndex> > searchTask in searchTasks)
            {
                ProcessSearchResults(searchTask.Result, results);
            }

            return(results);
        }
        private async Task <CalculationProviderResultSearchResults> SearchCalculationProviderResultsInternal(SearchModel searchModel, bool useCalculationId)
        {
            string entityFieldName          = useCalculationId ? "calculationId" : "fundingLineId";
            string entityValue              = GetSearchModelFilterValue(searchModel, entityFieldName);
            string entityExceptionFieldName = useCalculationId ? "calculationException" : "fundingLineException";

            IEnumerable <Task <SearchResults <ProviderCalculationResultsIndex> > > searchTasks = BuildSearchTasks(searchModel, entityValue, entityFieldName, entityExceptionFieldName);

            await TaskHelper.WhenAllAndThrow(searchTasks.ToArraySafe());

            CalculationProviderResultSearchResults results = new CalculationProviderResultSearchResults();

            foreach (Task <SearchResults <ProviderCalculationResultsIndex> > searchTask in searchTasks)
            {
                ProcessSearchResults(searchTask.Result, results, entityValue, entityExceptionFieldName, useCalculationId);
            }

            return(results);
        }
Ejemplo n.º 6
0
        public async Task <CalculationProviderResultSearchResults> SearchCalculationProviderResults(SearchModel searchModel)
        {
            string calculationId = (searchModel.Filters != null &&
                                    searchModel.Filters.ContainsKey("calculationId") &&
                                    searchModel.Filters["calculationId"].FirstOrDefault() != null) ? searchModel.Filters["calculationId"].FirstOrDefault() : "";

            IEnumerable <Task <SearchResults <ProviderCalculationResultsIndex> > > searchTasks = BuildSearchTasks(searchModel, calculationId);

            await TaskHelper.WhenAllAndThrow(searchTasks.ToArraySafe());

            CalculationProviderResultSearchResults results = new CalculationProviderResultSearchResults();

            foreach (Task <SearchResults <ProviderCalculationResultsIndex> > searchTask in searchTasks)
            {
                ProcessSearchResults(searchTask.Result, results, calculationId);
            }

            return(results);
        }
        public async Task PerformSearch_GivenFirstSearchResultReturnedCorrectly_EnsuresResults()
        {
            // Arrange
            int numberOfItems = 25;

            CalculationProviderResultSearchResults itemResult = GenerateSearchResults(numberOfItems);

            _resultsClient
            .SearchCalculationProviderResults(Arg.Any <SearchModel>())
            .Returns(new ApiResponse <CalculationProviderResultSearchResults>(HttpStatusCode.OK, itemResult));

            SearchRequestViewModel request = new SearchRequestViewModel();

            AndCalculationExistsForCalcId("calcId");

            // Act
            CalculationProviderResultSearchResultViewModel results = await _resultsSearchService.PerformSearch(request);

            // Assert
            results.TotalResults.Should().Be(numberOfItems + 1);
            results.TotalErrorResults.Should().Be(1);
        }
        public async Task <IActionResult> SearchCalculationProviderResults(SearchModel searchModel, bool useCalculationId = true)
        {
            if (searchModel == null || searchModel.PageNumber < 1 || searchModel.Top < 1)
            {
                _logger.Error("A null or invalid search model was provided for searching calculation provider results");

                return(new BadRequestObjectResult("An invalid search model was provided"));
            }

            try
            {
                CalculationProviderResultSearchResults results = await SearchCalculationProviderResultsInternal(searchModel, useCalculationId);

                return(new OkObjectResult(results));
            }
            catch (FailedToQuerySearchException exception)
            {
                _logger.Error(exception, $"Failed to query search with term: {searchModel.SearchTerm}");

                return(new StatusCodeResult(500));
            }
        }
        public async Task PerformSearch_FirstSearchResultWithFacets_EnsuresFacetsLoadedCorrectly()
        {
            // Arrange
            int numberOfItems = 25;

            IEnumerable <Facet> facets = new[]
            {
                new Facet
                {
                    Name        = "facet 1",
                    FacetValues = new[]
                    {
                        new FacetValue {
                            Name = "f1", Count = 5
                        }
                    }
                },
                new Facet
                {
                    Name        = "facet 2",
                    FacetValues = new[]
                    {
                        new FacetValue {
                            Name = "f2", Count = 11
                        },
                        new FacetValue {
                            Name = "f3", Count = 1
                        }
                    }
                }
            };

            CalculationProviderResultSearchResults itemResult = GenerateSearchResults(numberOfItems, facets);

            _resultsClient
            .SearchCalculationProviderResults(Arg.Any <SearchModel>())
            .Returns(new ApiResponse <CalculationProviderResultSearchResults>(HttpStatusCode.OK, itemResult));

            SearchRequestViewModel request = new SearchRequestViewModel();

            AndCalculationExistsForCalcId("calcId");

            // Act
            CalculationProviderResultSearchResultViewModel results = await _resultsSearchService.PerformSearch(request);

            // Assert
            CalculationProviderResultSearchResultItemViewModel first = results.CalculationProviderResults.First();

            first
            .Should()
            .NotBeNull();

            first
            .Id
            .Should()
            .Be("10");

            first
            .ProviderName
            .Should()
            .Be("prov-1");

            first
            .CalculationResult
            .Should()
            .Be(1);

            results.Facets.Count().Should().Be(2);
            results.Facets.First().Name.Should().Be("facet 1");
            results.Facets.First().FacetValues.Count().Should().Be(1);
            results.Facets.First().FacetValues.First().Name.Should().Be("f1");
            results.Facets.First().FacetValues.First().Count.Should().Be(5);
            results.Facets.Last().Name.Should().Be("facet 2");
            results.Facets.Last().FacetValues.Count().Should().Be(2);
            results.Facets.Last().FacetValues.First().Name.Should().Be("f2");
            results.Facets.Last().FacetValues.First().Count.Should().Be(11);
            results.Facets.Last().FacetValues.Last().Name.Should().Be("f3");
            results.Facets.Last().FacetValues.Last().Count.Should().Be(1);
        }
 private void ProcessSearchResults(SearchResults <CalculationProviderResultsIndex> searchResult, CalculationProviderResultSearchResults results)
 {
     if (!searchResult.Facets.IsNullOrEmpty())
     {
         results.Facets = results.Facets.Concat(searchResult.Facets);
     }
     else
     {
         results.TotalCount = (int)(searchResult?.TotalCount ?? 0);
         results.Results    = searchResult?.Results?.Select(m => new CalculationProviderResultSearchResult
         {
             Id                           = m.Result.Id,
             ProviderId                   = m.Result.ProviderId,
             ProviderName                 = m.Result.ProviderName,
             SpecificationName            = m.Result.SpecificationName,
             SpecificationId              = m.Result.SpecificationId,
             CalculationSpecificationId   = m.Result.CalculationSpecificationId,
             CalculationSpecificationName = m.Result.CalculationSpecificationName,
             CalculationId                = m.Result.CalculationId,
             CalculationName              = m.Result.CalculationName,
             CalculationType              = m.Result.CalculationType,
             CalculationResult            = m.Result.CalculationResult,
             LastUpdatedDate              = m.Result.LastUpdatedDate.LocalDateTime,
             LocalAuthority               = m.Result.LocalAuthority,
             ProviderType                 = m.Result.ProviderType,
             ProviderSubType              = m.Result.ProviderSubType,
             UKPRN                        = m.Result.UKPRN,
             UPIN                         = m.Result.UPIN,
             URN                          = m.Result.URN,
             OpenDate                     = m.Result.OpenDate,
             EstablishmentNumber          = m.Result.EstablishmentNumber
         });
     }
 }
        public async Task <CalculationProviderResultSearchResultViewModel> PerformSearch(SearchRequestViewModel request)
        {
            int pageNumber = request.PageNumber.GetValueOrDefault(1);
            int pageSize   = request.PageSize.GetValueOrDefault(50);

            ApiResponse <CalculationProviderResultSearchResults> searchRequestResult = await _resultsClient.SearchCalculationProviderResults(new SearchModel
            {
                PageNumber    = pageNumber,
                Top           = pageSize,
                SearchTerm    = request.SearchTerm,
                IncludeFacets = request.IncludeFacets,
                ErrorToggle   = string.IsNullOrWhiteSpace(request.ErrorToggle) ? (bool?)null : (request.ErrorToggle == "Errors"),
                Filters       = request.Filters,
                SearchFields  = request.SearchFields
            });

            if (searchRequestResult?.Content == null)
            {
                _logger.Error("Find providers HTTP request failed");
                return(null);
            }

            CalculationProviderResultSearchResults calculationProviderResultSearchResults = searchRequestResult.Content;

            CalculationProviderResultSearchResultViewModel result = new CalculationProviderResultSearchResultViewModel
            {
                TotalResults      = calculationProviderResultSearchResults.TotalCount,
                CurrentPage       = pageNumber,
                TotalErrorResults = calculationProviderResultSearchResults.TotalErrorCount
            };

            List <SearchFacetViewModel> searchFacets = new List <SearchFacetViewModel>();

            if (calculationProviderResultSearchResults.Facets != null)
            {
                foreach (Facet facet in calculationProviderResultSearchResults.Facets)
                {
                    searchFacets.Add(_mapper.Map <SearchFacetViewModel>(facet));
                }
            }

            result.Facets = searchFacets.AsEnumerable();

            List <CalculationProviderResultSearchResultItemViewModel> itemResults = new List <CalculationProviderResultSearchResultItemViewModel>();

            Dictionary <string, CalculationValueTypeViewModel> calcTypes = new Dictionary <string, CalculationValueTypeViewModel>();

            foreach (CalculationProviderResultSearchResult searchresult in calculationProviderResultSearchResults.Results)
            {
                CalculationProviderResultSearchResultItemViewModel vmResult = _mapper.Map <CalculationProviderResultSearchResultItemViewModel>(searchresult);
                if (!calcTypes.ContainsKey(searchresult.CalculationId))
                {
                    ApiResponse <Common.ApiClient.Calcs.Models.Calculation> calcResult = await _calculationsApiClient.GetCalculationById(searchresult.CalculationId);

                    if (calcResult == null || calcResult.Content == null || calcResult.StatusCode != System.Net.HttpStatusCode.OK)
                    {
                        throw new InvalidOperationException($"Unable to get calculation details for calculation ID '{searchresult.CalculationId}'");
                    }

                    CalculationValueTypeViewModel calculationValueTypeViewModel = _mapper.Map <CalculationValueTypeViewModel>(calcResult.Content.ValueType);
                    calcTypes.Add(searchresult.CalculationId, calculationValueTypeViewModel);
                }

                vmResult.SetCalculationResultDisplay(calcTypes[searchresult.CalculationId]);
                itemResults.Add(vmResult);
            }

            result.CalculationProviderResults = itemResults.AsEnumerable();

            if (result.TotalResults == 0)
            {
                result.StartItemNumber = 0;
                result.EndItemNumber   = 0;
            }
            else
            {
                result.StartItemNumber = ((pageNumber - 1) * pageSize) + 1;
                result.EndItemNumber   = result.StartItemNumber + pageSize - 1;
            }

            if (result.EndItemNumber > calculationProviderResultSearchResults.TotalCount)
            {
                result.EndItemNumber = calculationProviderResultSearchResults.TotalCount;
            }

            result.PagerState = new PagerState(pageNumber, (int)Math.Ceiling(calculationProviderResultSearchResults.TotalCount / (double)pageSize), 4);

            return(result);
        }
        private void ProcessSearchResults(
            SearchResults <ProviderCalculationResultsIndex> searchResult,
            CalculationProviderResultSearchResults results,
            string entityValue,
            string entityExceptionFieldName,
            bool useCalculationId)
        {
            if (!searchResult.Facets.IsNullOrEmpty())
            {
                if (_featureToggle.IsExceptionMessagesEnabled() && searchResult.Facets.Any(f => f.Name == entityExceptionFieldName))
                {
                    results.TotalErrorCount = (int)(searchResult.TotalCount ?? 0);
                }
                else
                {
                    results.Facets = results.Facets.Concat(searchResult.Facets);
                }
            }
            else
            {
                IList <CalculationProviderResultSearchResult> calculationResults = new List <CalculationProviderResultSearchResult>();

                results.TotalCount = (int)(searchResult?.TotalCount ?? 0);

                if (!searchResult.Results.IsNullOrEmpty())
                {
                    foreach (CalculateFunding.Repositories.Common.Search.SearchResult <ProviderCalculationResultsIndex> result in searchResult.Results)
                    {
                        int valueIndex = Array.IndexOf(useCalculationId ? result.Result.CalculationId : result.Result.FundingLineId, entityValue);

                        CalculationProviderResultSearchResult calculationResult = new CalculationProviderResultSearchResult
                        {
                            Id                  = result.Result.Id,
                            ProviderId          = result.Result.ProviderId,
                            ProviderName        = result.Result.ProviderName,
                            SpecificationName   = result.Result.SpecificationName,
                            SpecificationId     = result.Result.SpecificationId,
                            LastUpdatedDate     = result.Result.LastUpdatedDate.LocalDateTime,
                            LocalAuthority      = result.Result.LocalAuthority,
                            ProviderType        = result.Result.ProviderType,
                            ProviderSubType     = result.Result.ProviderSubType,
                            UKPRN               = result.Result.UKPRN,
                            UPIN                = result.Result.UPIN,
                            URN                 = result.Result.URN,
                            OpenDate            = result.Result.OpenDate,
                            EstablishmentNumber = result.Result.EstablishmentNumber,
                        };

                        if (valueIndex >= 0)
                        {
                            if (useCalculationId)
                            {
                                calculationResult.CalculationId               = entityValue;
                                calculationResult.CalculationName             = result.Result.CalculationName[valueIndex];
                                calculationResult.CalculationResult           = result.Result.CalculationResult[valueIndex].GetObjectOrNull();
                                calculationResult.CalculationExceptionType    = !result.Result.CalculationExceptionType.IsNullOrEmpty() ? result.Result.CalculationExceptionType[valueIndex] : string.Empty;
                                calculationResult.CalculationExceptionMessage = !result.Result.CalculationExceptionMessage.IsNullOrEmpty() ? result.Result.CalculationExceptionMessage[valueIndex] : string.Empty;
                            }
                            else
                            {
                                calculationResult.FundingLineId               = entityValue;
                                calculationResult.FundingLineName             = result.Result.FundingLineName[valueIndex];
                                calculationResult.FundingLineResult           = result.Result.FundingLineResult[valueIndex].GetValueOrNull <decimal>();
                                calculationResult.FundingLineExceptionType    = !result.Result.FundingLineExceptionType.IsNullOrEmpty() ? result.Result.FundingLineExceptionType[valueIndex] : string.Empty;
                                calculationResult.FundingLineExceptionMessage = !result.Result.FundingLineExceptionMessage.IsNullOrEmpty() ? result.Result.FundingLineExceptionMessage[valueIndex] : string.Empty;
                            }
                        }

                        calculationResults.Add(calculationResult);
                    }
                }

                results.Results = calculationResults;
            }
        }
Ejemplo n.º 13
0
        private void ProcessSearchResults(SearchResults <ProviderCalculationResultsIndex> searchResult, CalculationProviderResultSearchResults results, string calculationId)
        {
            if (!searchResult.Facets.IsNullOrEmpty())
            {
                if (_featureToggle.IsExceptionMessagesEnabled() && searchResult.Facets.Any(f => f.Name == "calculationException"))
                {
                    results.TotalErrorCount = (int)(searchResult?.TotalCount ?? 0);
                }
                else
                {
                    results.Facets = results.Facets.Concat(searchResult.Facets);
                }
            }
            else
            {
                IList <CalculationProviderResultSearchResult> calculationResults = new List <CalculationProviderResultSearchResult>();

                results.TotalCount = (int)(searchResult?.TotalCount ?? 0);

                if (!searchResult.Results.IsNullOrEmpty())
                {
                    foreach (CalculateFunding.Repositories.Common.Search.SearchResult <ProviderCalculationResultsIndex> result in searchResult.Results)
                    {
                        int calculationIdIndex = Array.IndexOf(result.Result.CalculationId, calculationId);

                        if (calculationIdIndex < 0)
                        {
                            throw new Exception();
                        }

                        CalculationProviderResultSearchResult calculationResult = new CalculationProviderResultSearchResult
                        {
                            Id                  = result.Result.Id,
                            ProviderId          = result.Result.ProviderId,
                            ProviderName        = result.Result.ProviderName,
                            SpecificationName   = result.Result.SpecificationName,
                            SpecificationId     = result.Result.SpecificationId,
                            LastUpdatedDate     = result.Result.LastUpdatedDate.LocalDateTime,
                            LocalAuthority      = result.Result.LocalAuthority,
                            ProviderType        = result.Result.ProviderType,
                            ProviderSubType     = result.Result.ProviderSubType,
                            UKPRN               = result.Result.UKPRN,
                            UPIN                = result.Result.UPIN,
                            URN                 = result.Result.URN,
                            OpenDate            = result.Result.OpenDate,
                            EstablishmentNumber = result.Result.EstablishmentNumber,
                            CalculationId       = calculationId,
                            CalculationName     = result.Result.CalculationName[calculationIdIndex],
                            CalculationResult   = result.Result.CalculationResult[calculationIdIndex].GetValueOrNull <double>()
                        };

                        if (_featureToggle.IsExceptionMessagesEnabled())
                        {
                            calculationResult.CalculationExceptionType    = !result.Result.CalculationExceptionType.IsNullOrEmpty() ? result.Result.CalculationExceptionType[calculationIdIndex] : string.Empty;
                            calculationResult.CalculationExceptionMessage = !result.Result.CalculationExceptionMessage.IsNullOrEmpty() ? result.Result.CalculationExceptionMessage[calculationIdIndex] : string.Empty;
                        }

                        calculationResults.Add(calculationResult);
                    }
                }

                results.Results = calculationResults;
            }
        }