예제 #1
0
        public async Task <IActionResult> SearchPublishedProviders(SearchModel searchModel)
        {
            if (searchModel == null || searchModel.PageNumber < 1 || searchModel.Top < 1)
            {
                _logger.Error("A null or invalid search model was provided for searching published providers");

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

            try
            {
                if (searchModel.OrderBy.IsNullOrEmpty())
                {
                    searchModel.OrderBy = new[] { "providerName" };
                }

                IEnumerable <Task <SearchResults <PublishedProviderIndex> > > searchTasks = await BuildSearchTasks(searchModel, Facets);

                if (searchTasks.IsNullOrEmpty())
                {
                    return(new InternalServerErrorResult("Failed to build search tasks"));
                }

                PublishedSearchResults results = new PublishedSearchResults();

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

                foreach (var searchTask in searchTasks)
                {
                    SearchResults <PublishedProviderIndex> searchResult = searchTask.Result;

                    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 PublishedSearchResult
                        {
                            Id              = m.Result.Id,
                            ProviderType    = m.Result.ProviderType,
                            ProviderSubType = m.Result.ProviderSubType,
                            LocalAuthority  = m.Result.LocalAuthority,
                            FundingStatus   = m.Result.FundingStatus,
                            ProviderName    = m.Result.ProviderName,
                            UKPRN           = m.Result.UKPRN,
                            UPIN            = m.Result.UPIN,
                            URN             = m.Result.URN,
                            FundingValue    = m.Result.FundingValue,
                            SpecificationId = m.Result.SpecificationId,
                            FundingStreamId = m.Result.FundingStreamId,
                            FundingPeriodId = m.Result.FundingPeriodId,
                            HasErrors       = m.Result.HasErrors,
                            Errors          = m.Result.Errors
                        });
                    }
                }

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

                return(new InternalServerErrorResult($"Failed to query search, with exception: {exception.Message}"));
            }
        }
        public async Task DelegatesToSearchRepositoryAndMapsResultsIntoOkObjectResult()
        {
            Dictionary <string, string[]> nonFacetFilters = new Dictionary <string, string[]>
            {
                { "filter1", new[] { "filter1value1", "filter1value2" } }
            };
            Dictionary <string, string[]> facetFilters = new Dictionary <string, string[]>
            {
                { "hasErrors", new[] { "true" } },
                { "providerType", new[] { "test", "" } }
            };

            SearchModel searchModel = NewSearchModel(builder =>
            {
                builder.WithTop(50)
                .WithPageNumber(1)
                .WithSearchTerm(NewRandomString())
                .WithIncludeFacets(true);
                foreach (var nonFacetFilter in nonFacetFilters)
                {
                    builder.AddFilter(nonFacetFilter.Key, nonFacetFilter.Value);
                }
                foreach (var facetFilter in facetFilters)
                {
                    builder.AddFilter(facetFilter.Key, facetFilter.Value);
                }
            });

            GivenTheSearchModel(searchModel);

            SearchResults <PublishedProviderIndex> searchIndexResults = NewSearchResults(_ =>
                                                                                         _.WithResults(NewPublishedProviderIndex(),
                                                                                                       NewPublishedProviderIndex(),
                                                                                                       NewPublishedProviderIndex()));

            AndTheSearchResults(searchModel, searchIndexResults);

            OkObjectResult result = await WhenTheSearchIsMade() as OkObjectResult;

            result
            .Should()
            .NotBeNull();

            PublishedSearchResults publishedSearchResults = result.Value as PublishedSearchResults;

            publishedSearchResults
            .Facets
            .Should()
            .NotBeNull();

            IEnumerable <PublishedSearchResult> results = publishedSearchResults.Results;

            results
            .Should()
            .NotBeNull();

            results.Select(_ => _.Id)
            .Should()
            .BeEquivalentTo(searchIndexResults.Results.Select(_ => _.Result.Id));

            await ThenTheFiltersWasSearched(searchModel,
                                            PublishedSearchService.Facets.Length - nonFacetFilters.Count,
                                            "(providerType eq 'test' or providerType eq '') and (hasErrors eq true) and (filter1 eq 'filter1value1' or filter1 eq 'filter1value2')");
            await ThenTheFiltersWasSearched(searchModel,
                                            1,
                                            "(providerType eq 'test' or providerType eq '') and (filter1 eq 'filter1value1' or filter1 eq 'filter1value2')");
            await AndTheFilterWasSearched(searchModel,
                                          1,
                                          "(hasErrors eq true) and (filter1 eq 'filter1value1' or filter1 eq 'filter1value2')");
        }