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); }
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; } }
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; } }