Пример #1
0
        public async Task PerformSearch_GivenFirstSearchResultReturnedCorrectly_EnsuresResults()
        {
            // Arrange
            IResultsApiClient resultClient = Substitute.For <IResultsApiClient>();
            ILogger           logger       = CreateLogger();
            IMapper           mapper       = MappingHelper.CreateFrontEndMapper();

            CalculationProviderResultsSearchService resultsSearchService = CreateSearchService(resultClient, mapper, logger);

            int numberOfItems = 25;

            PagedResult <CalculationProviderResultSearchResultItem> itemResult = GeneratePagedResult(numberOfItems);

            resultClient
            .FindCalculationProviderResults(Arg.Any <SearchFilterRequest>())
            .Returns(itemResult);

            SearchRequestViewModel request = new SearchRequestViewModel();

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

            // Assert
            results.TotalResults.Should().Be(numberOfItems + 1);
            results.TotalErrorResults.Should().Be(1);
        }
Пример #2
0
        public async Task PerformSearch_GivenFindCalculationProviderResultsServiceReturnsNotFound_ThenNullReturned()
        {
            // Arrange
            IResultsApiClient resultClient = Substitute.For <IResultsApiClient>();
            ILogger           logger       = CreateLogger();
            IMapper           mapper       = CreateMapper();

            CalculationProviderResultsSearchService resultsSearchService = CreateSearchService(resultClient, mapper, logger);

            PagedResult <CalculationProviderResultSearchResultItem> expectedServiceResult = null;

            resultClient
            .FindCalculationProviderResults(Arg.Any <SearchFilterRequest>())
            .Returns(expectedServiceResult);

            SearchRequestViewModel request = new SearchRequestViewModel();

            // Act
            CalculationProviderResultSearchResultViewModel result = await resultsSearchService.PerformSearch(request);

            // Assert
            result
            .Should()
            .BeNull();
        }
Пример #3
0
        public async Task <IActionResult> SearchCalculationProviderResults([FromBody] SearchRequestViewModel request, [FromQuery] string calculationValueType = null)
        {
            Guard.ArgumentNotNull(request, nameof(request));

            CalculationProviderResultSearchResultViewModel searchResults = await _calculationProviderResultsSearchService.PerformSearch(request);

            if (calculationValueType != null)
            {
                CalculationValueTypeViewModel valueType = calculationValueType.AsEnum <CalculationValueTypeViewModel>();

                foreach (CalculationProviderResultSearchResultItemViewModel providerResult in searchResults.CalculationProviderResults)
                {
                    providerResult.SetCalculationResultDisplay(valueType);
                }
            }

            CalculationProviderResultSearchResultViewModel result = searchResults;

            if (result != null)
            {
                return(Ok(result));
            }

            return(new InternalServerErrorResult($"Find provider results HTTP request failed"));
        }
        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");
        }
Пример #5
0
        public async Task <IActionResult> SearchCalculationProviderResults([FromBody] SearchRequestViewModel request)
        {
            Guard.ArgumentNotNull(request, nameof(request));

            CalculationProviderResultSearchResultViewModel result = await _calculationProviderResultsSearchService.PerformSearch(request);

            if (result != null)
            {
                return(Ok(result));
            }
            else
            {
                return(new StatusCodeResult(500));
            }
        }
        public async Task PerformSearch_GivenFindCalculationProviderResultsServiceReturnsNotFound_ThenNullReturned()
        {
            // Arrange
            _resultsClient
            .SearchCalculationProviderResults(Arg.Any <SearchModel>())
            .Returns((ApiResponse <CalculationProviderResultSearchResults>)null);

            SearchRequestViewModel request = new SearchRequestViewModel();

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

            // Assert
            result
            .Should()
            .BeNull();
        }
        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);
        }
Пример #8
0
        public async Task SearchCalculationProviderResults_GivenResultsReturnedFromSearch_ReturnsOK()
        {
            // Arrange
            SearchRequestViewModel requestModel = new SearchRequestViewModel();

            CalculationProviderResultSearchResultViewModel results = new CalculationProviderResultSearchResultViewModel();

            ICalculationProviderResultsSearchService searchService = CreateCalculationProviderResultsSearchService();

            searchService
            .PerformSearch(Arg.Any <SearchRequestViewModel>())
            .Returns(results);

            ProviderSearchController controller = CreateController(calculationProviderResultsSearchService: searchService);

            // Act
            IActionResult actionResult = await controller.SearchCalculationProviderResults(requestModel);

            // Asserts
            actionResult
            .Should()
            .BeOfType <OkObjectResult>();
        }
        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);
        }
        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);
        }
Пример #11
0
        public async Task PerformSearch_GivenFirstSearchResultReturnedCorrectly_EnsuresResult()
        {
            // Arrange
            IResultsApiClient resultClient = Substitute.For <IResultsApiClient>();
            ILogger           logger       = CreateLogger();
            IMapper           mapper       = MappingHelper.CreateFrontEndMapper();

            CalculationProviderResultsSearchService resultsSearchService = CreateSearchService(resultClient, mapper, logger);

            int numberOfItems = 25;

            PagedResult <CalculationProviderResultSearchResultItem> itemResult = GeneratePagedResult(numberOfItems);

            resultClient
            .FindCalculationProviderResults(Arg.Any <SearchFilterRequest>())
            .Returns(itemResult);

            SearchRequestViewModel request = new SearchRequestViewModel();

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

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

            first
            .Should()
            .NotBeNull();

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

            first
            .CalculationType
            .Should()
            .Be(CalculationSpecificationType.Number);

            first
            .Name
            .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");
        }
Пример #12
0
        public async Task PerformSearch_FirstSearchResultWithFacets_EnsuresFacetsLoadedCorrectly()
        {
            // Arrange
            IResultsApiClient resultClient = Substitute.For <IResultsApiClient>();
            ILogger           logger       = CreateLogger();
            IMapper           mapper       = MappingHelper.CreateFrontEndMapper();

            CalculationProviderResultsSearchService resultsSearchService = CreateSearchService(resultClient, mapper, logger);

            int numberOfItems = 25;

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

            PagedResult <CalculationProviderResultSearchResultItem> itemResult = GeneratePagedResult(numberOfItems, facets);

            resultClient
            .FindCalculationProviderResults(Arg.Any <SearchFilterRequest>())
            .Returns(itemResult);

            SearchRequestViewModel request = new SearchRequestViewModel();

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

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

            first
            .Should()
            .NotBeNull();

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

            first
            .CalculationType
            .Should()
            .Be(CalculationSpecificationType.Number);

            first
            .Name
            .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);
        }
        public async Task OnGetAsync_GivenCalculationFoundWithEmptySearchResults_ReturnsPage()
        {
            //Arrange
            const string calculationId   = "calc-id";
            const string specificationId = "spec-id";

            Calculation calculation = new Calculation
            {
                Id = calculationId,
                SpecificationId = specificationId
            };

            CalculationViewModel calculationViewModel = new CalculationViewModel
            {
                Id = calculationId,
                SpecificationId = specificationId
            };

            IEnumerable <DatasetSchemasAssigned> datasetSchemasAssignedList = new[]
            {
                new DatasetSchemasAssigned
                {
                    IsSetAsProviderData = true
                }
            };

            ApiResponse <IEnumerable <DatasetSchemasAssigned> > datasetSchemaResponse = new ApiResponse <IEnumerable <DatasetSchemasAssigned> >(HttpStatusCode.OK, datasetSchemasAssignedList);

            IDatasetsApiClient datasetsApiClient = CreateDatasetsApiClient();

            datasetsApiClient
            .GetAssignedDatasetSchemasForSpecification(Arg.Is(specificationId))
            .Returns(datasetSchemaResponse);

            CalculationProviderResultSearchResultViewModel calculationProviderResultSearchResultViewModel = new CalculationProviderResultSearchResultViewModel
            {
                CalculationProviderResults = Enumerable.Empty <CalculationProviderResultSearchResultItemViewModel>()
            };

            ApiResponse <Calculation> CalculationResponse = new ApiResponse <Calculation>(HttpStatusCode.OK, calculation);

            ICalculationsApiClient calculationsApiClient = CreateCalculationsApiClient();

            calculationsApiClient
            .GetCalculationById(Arg.Is(calculationId))
            .Returns(CalculationResponse);

            IMapper mapper = CreateMapper();

            mapper
            .Map <CalculationViewModel>(Arg.Is(calculation))
            .Returns(calculationViewModel);

            ICalculationProviderResultsSearchService calculationProviderResultsSearchService = CreateResultsSearchService();

            calculationProviderResultsSearchService
            .PerformSearch(Arg.Any <SearchRequestViewModel>())
            .Returns(calculationProviderResultSearchResultViewModel);

            ISpecsApiClient specsApiClient = CreateSpecsApiClient();

            specsApiClient.GetSpecificationSummaries(Arg.Any <IEnumerable <string> >())
            .Returns(new ApiResponse <IEnumerable <Clients.SpecsClient.Models.SpecificationSummary> >(HttpStatusCode.OK, Enumerable.Empty <Clients.SpecsClient.Models.SpecificationSummary>()));

            Clients.SpecsClient.Models.SpecificationSummary specificationSummary = new Clients.SpecsClient.Models.SpecificationSummary()
            {
                Id = specificationId,
            };

            specsApiClient
            .GetSpecificationSummary(Arg.Is(specificationId))
            .Returns(new ApiResponse <Clients.SpecsClient.Models.SpecificationSummary>(HttpStatusCode.OK, specificationSummary));

            CalculationProviderResultsPageModel pageModel = CreatePageModel(
                calculationProviderResultsSearchService,
                calculationsApiClient,
                mapper: mapper,
                datasetsApiClient: datasetsApiClient,
                specsApiClient: specsApiClient);

            //Act
            IActionResult result = await pageModel.OnGetAsync(calculationId, null, "");

            //Assert
            result
            .Should()
            .BeOfType <PageResult>();

            pageModel
            .CalculationProviderResults
            .CalculationProviderResults
            .Any()
            .Should()
            .BeFalse();
        }
Пример #14
0
        public async Task <IActionResult> SearchProviderResultsForCalculation([FromBody] CalculationProviderSearchRequestViewModel viewModel)
        {
            Guard.ArgumentNotNull(viewModel, nameof(viewModel));

            SearchRequestViewModel request = new SearchRequestViewModel
            {
                Filters       = new Dictionary <string, string[]>(),
                FacetCount    = viewModel.FacetCount,
                IncludeFacets = viewModel.IncludeFacets,
                PageNumber    = viewModel.PageNumber,
                PageSize      = viewModel.PageSize,
                SearchMode    = viewModel.SearchMode,
                SearchFields  = viewModel.SearchFields
            };

            if (!string.IsNullOrEmpty(viewModel.SearchTerm))
            {
                request.SearchTerm = viewModel.SearchTerm;
            }

            if (!string.IsNullOrEmpty(viewModel.ErrorToggle))
            {
                request.ErrorToggle = "Errors";
            }

            if (viewModel.ProviderType != null && viewModel.ProviderType.Any())
            {
                request.Filters.Add("providerType", viewModel.ProviderType);
            }

            if (viewModel.ProviderSubType != null && viewModel.ProviderSubType.Any())
            {
                request.Filters.Add("providerSubType", viewModel.ProviderSubType);
            }

            if (viewModel.ResultsStatus != null && viewModel.ResultsStatus.Any())
            {
                request.Filters.Add("resultsStatus", viewModel.ResultsStatus);
            }

            if (viewModel.ResultsStatus != null && viewModel.LocalAuthority.Any())
            {
                request.Filters.Add("localAuthority", viewModel.LocalAuthority);
            }

            if (!string.IsNullOrEmpty(viewModel.CalculationId))
            {
                request.Filters.Add("calculationId", new[]
                {
                    viewModel.CalculationId
                });
            }


            CalculationProviderResultSearchResultViewModel searchResults = await _calculationProviderResultsSearchService.PerformSearch(request);


            CalculationProviderResultSearchResultViewModel result = searchResults;

            if (result != null)
            {
                return(Ok(result));
            }

            return(new InternalServerErrorResult($"Find provider results HTTP request failed"));
        }
Пример #15
0
        public async Task <CalculationProviderResultSearchResultViewModel> PerformSearch(SearchRequestViewModel request)
        {
            SearchFilterRequest requestOptions = new SearchFilterRequest()
            {
                Page          = request.PageNumber.HasValue ? request.PageNumber.Value : 1,
                PageSize      = request.PageSize.HasValue ? request.PageSize.Value : 50,
                SearchTerm    = request.SearchTerm,
                IncludeFacets = request.IncludeFacets,
                ErrorToggle   = string.IsNullOrWhiteSpace(request.ErrorToggle) ? (bool?)null : (request.ErrorToggle == "Errors" ? true : false),
                Filters       = request.Filters
            };

            if (request.PageNumber.HasValue && request.PageNumber.Value > 0)
            {
                requestOptions.Page = request.PageNumber.Value;
            }

            PagedResult <CalculationProviderResultSearchResultItem> searchRequestResult = await _resultsClient.FindCalculationProviderResults(requestOptions);

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

            CalculationProviderResultSearchResultViewModel result = new CalculationProviderResultSearchResultViewModel
            {
                TotalResults      = searchRequestResult.TotalItems,
                CurrentPage       = searchRequestResult.PageNumber,
                TotalErrorResults = searchRequestResult.TotalErrorItems
            };

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

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

            result.Facets = searchFacets.AsEnumerable();

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

            foreach (CalculationProviderResultSearchResultItem searchresult in searchRequestResult.Items)
            {
                itemResults.Add(_mapper.Map <CalculationProviderResultSearchResultItemViewModel>(searchresult));
            }

            result.CalculationProviderResults = itemResults.AsEnumerable();

            if (result.TotalResults == 0)
            {
                result.StartItemNumber = 0;
                result.EndItemNumber   = 0;
            }
            else
            {
                result.StartItemNumber = ((requestOptions.Page - 1) * requestOptions.PageSize) + 1;
                result.EndItemNumber   = result.StartItemNumber + requestOptions.PageSize - 1;
            }

            if (result.EndItemNumber > searchRequestResult.TotalItems)
            {
                result.EndItemNumber = searchRequestResult.TotalItems;
            }

            result.PagerState = new PagerState(requestOptions.Page, searchRequestResult.TotalPages, 4);

            return(result);
        }