public void Search_Expands_search_and_filter_to_azure_query()
        {
            // Setup
            string expectedLatestReportedDate = VirtualDateTime.UtcNow.Date.AddDays(-7).ToString("O");
            string expectedFilterQuery        = string.Join(
                " and ",
                "SicSectionIds/any(id: id eq 'G' or id eq 'L' or id eq 'C')",
                "(Size eq 1 or Size eq 2 or Size eq 3)",
                "ReportedYears/any(ReportedYear: ReportedYear eq '2017')",
                $"(LatestReportedDate gt {expectedLatestReportedDate} or ReportedExplanationYears/any(ReportedYear: ReportedYear eq '2017'))");

            var testParams = new EmployerSearchParameters {
                Keywords              = "word1 word2 word3",
                FilterEmployerSizes   = new[] { 1, 2, 3 },
                FilterSicSectionIds   = new[] { 'G', 'L', 'C' },
                FilterReportedYears   = new[] { 2017 },
                FilterReportingStatus = new[] { 0, 3 },
                SearchType            = SearchType.ByEmployerName
            };

            // Test
            string resultFilterQuery = testParams.ToFilterQuery();

            Assert.AreEqual(expectedFilterQuery, resultFilterQuery);
        }
Exemple #2
0
        public async Task <SearchViewModel> SearchAsync(EmployerSearchParameters searchParams, string orderBy)
        {
            bool orderByRelevance = orderBy == "relevance";

            var facets = new Dictionary <string, Dictionary <object, long> >();

            facets.Add("Size", null);
            facets.Add("SicSectionIds", null);
            facets.Add("ReportedYears", null);
            facets.Add("ReportedLateYears", null);
            facets.Add("ReportedExplanationYears", null);

            // build the result view model
            return(new SearchViewModel {
                SizeOptions = GetOrgSizeOptions(searchParams.FilterEmployerSizes, facets["Size"]),
                SectorOptions = await GetSectorOptionsAsync(searchParams.FilterSicSectionIds, facets["SicSectionIds"]),
                ReportingYearOptions = GetReportingYearOptions(searchParams.FilterReportedYears),
                ReportingStatusOptions = GetReportingStatusOptions(searchParams.FilterReportingStatus),
                Employers = viewingSearchService.Search(searchParams, orderByRelevance),
                search = searchParams.Keywords,
                p = searchParams.Page,
                s = searchParams.FilterSicSectionIds,
                es = searchParams.FilterEmployerSizes,
                y = searchParams.FilterReportedYears,
                st = searchParams.FilterReportingStatus,
                t = searchParams.SearchType.ToInt32().ToString(),
                OrderBy = orderBy
            });
        }
        public IEnumerable <DomainEmployer> Search(EmployerSearchParameters searchParameters)
        {
            var sql = "SELECT * FROM dbo.Employer WHERE ";
            var and = "";

            if (!string.IsNullOrEmpty(searchParameters.Id))
            {
                sql += "EmployerId = @Id ";
                and  = "AND ";
            }
            if (!string.IsNullOrEmpty(searchParameters.EdsUrn))
            {
                sql += and + "EDSURN = @EdsUrn ";
                and  = "AND ";
            }
            if (!string.IsNullOrEmpty(searchParameters.Name))
            {
                sql += and + "(FullName LIKE '%' + @Name + '%' OR TradingName LIKE '%' + @Name + '%') ";
                and  = "AND ";
            }
            if (!string.IsNullOrEmpty(searchParameters.Location))
            {
                sql += and + "(Town LIKE '%' + @Location + '%' OR PostCode LIKE '%' + @Location + '%') ";
            }
            sql += "ORDER BY FullName";

            var employers = _getOpenConnection.Query <Employer>(sql, searchParameters).ToList();

            return(MapEmployers(employers));
        }
        [TestCase("uk", "uk")]                                                                                 // Do NOT replace (user might to search by 'uk')
        public void EmployerSearchParameters_RemoveTheMostCommonTermsOnOurDatabaseFromTheKeywords(string keywordsToClean,
                                                                                                  string expectedOutcome)
        {
            // Arrange
            var employerSearchParameters = new EmployerSearchParameters {
                Keywords = keywordsToClean
            };

            // Act
            string actualOutcome = employerSearchParameters.RemoveTheMostCommonTermsOnOurDatabaseFromTheKeywords();

            // Assert
            Assert.AreEqual(expectedOutcome, actualOutcome);
        }
 private async Task <PagedResult <EmployerSearchModel> > DoSearchAsync(EmployerSearchParameters searchParams,
                                                                       Dictionary <string, Dictionary <object, long> > facets)
 {
     return(await _viewingService.SearchBusinessLogic.EmployerSearchRepository.SearchAsync(
                searchParams.Keywords, // .ToSearchQuery(),
                searchParams.Page,
                searchParams.SearchType,
                searchParams.PageSize,
                filter : searchParams.ToFilterQuery(),
                facets : facets,
                orderBy : string.IsNullOrWhiteSpace(searchParams.Keywords)?nameof(EmployerSearchModel.Name) : null,
                searchFields : searchParams.SearchFields,
                searchMode : searchParams.SearchMode));
 }
        public EmployerSearchViewModel SearchEmployers(EmployerSearchViewModel searchViewModel)
        {
            var searchParameters = new EmployerSearchParameters
            {
                Id       = searchViewModel.Id,
                EdsUrn   = searchViewModel.EdsUrn,
                Name     = searchViewModel.Name,
                Location = searchViewModel.Location
            };
            var results   = _employerService.SearchEmployers(searchParameters);
            var employers = results.Select(e => e.Convert()).ToList();

            searchViewModel.Employers.Page         = employers;
            searchViewModel.Employers.ResultsCount = employers.Count;
            return(searchViewModel);
        }
        private List <SearchCachedOrganisation> FilterByOrganisations(List <SearchCachedOrganisation> organisations,
                                                                      EmployerSearchParameters searchParams)
        {
            IEnumerable <OrganisationSizes> selectedOrganisationSizes = searchParams.FilterEmployerSizes.Select(s => (OrganisationSizes)s);
            IEnumerable <char> selectedSicSections    = searchParams.FilterSicSectionIds;
            List <int>         selectedReportingYears = searchParams.FilterReportedYears.ToList();
            IEnumerable <SearchReportingStatusFilter> selectedReportingStatuses =
                searchParams.FilterReportingStatus.Select(s => (SearchReportingStatusFilter)s);

            IEnumerable <SearchCachedOrganisation> filteredOrgs = organisations.AsEnumerable();

            if (selectedOrganisationSizes.Any())
            {
                filteredOrgs = filteredOrgs.Where(o => o.GetOrganisationSizes(selectedReportingYears).Intersect(selectedOrganisationSizes).Any());
            }

            if (selectedSicSections.Any())
            {
                filteredOrgs = filteredOrgs.Where(o => o.SicSectionIds.Intersect(selectedSicSections).Any());
            }

            if (selectedReportingYears.Any())
            {
                filteredOrgs = filteredOrgs.Where(o => o.ReportingYears.Intersect(selectedReportingYears).Any());
            }

            if (selectedReportingStatuses.Any())
            {
                var reportingStatusFilteredOrgs = new List <SearchCachedOrganisation>();

                foreach (SearchReportingStatusFilter status in selectedReportingStatuses)
                {
                    reportingStatusFilteredOrgs = reportingStatusFilteredOrgs.Union(ApplyReportingStatusesFilter(filteredOrgs, status, selectedReportingYears)).ToList();
                }

                filteredOrgs = reportingStatusFilteredOrgs;
            }

            return(filteredOrgs.ToList());
        }
Exemple #8
0
 public IEnumerable <Employer> Search(EmployerSearchParameters searchParameters)
 {
     throw new NotImplementedException();
 }
Exemple #9
0
        public PagedResult <EmployerSearchModel> Search(EmployerSearchParameters searchParams, bool orderByRelevance)
        {
            List <SearchCachedOrganisation> allOrganisations = SearchRepository.CachedOrganisations
                                                               .Where(o => o.IncludeInViewingService)
                                                               .ToList();

            List <SearchCachedOrganisation> filteredOrganisations = FilterByOrganisations(allOrganisations, searchParams);

            if (searchParams.Keywords == null)
            {
                List <SearchCachedOrganisation> orderedOrganisations =
                    filteredOrganisations.OrderBy(o => o.OrganisationName.OriginalValue).ToList();

                List <SearchCachedOrganisation> paginatedResultsForAllOrganisations = PaginateResults(
                    orderedOrganisations,
                    searchParams.Page,
                    searchParams.PageSize);

                return(new PagedResult <EmployerSearchModel>
                {
                    Results = ConvertToEmployerSearchModels(paginatedResultsForAllOrganisations),
                    CurrentPage = searchParams.Page,
                    PageSize = searchParams.PageSize,
                    ActualRecordTotal = orderedOrganisations.Count,
                    VirtualRecordTotal = orderedOrganisations.Count
                });
            }

            string query = searchParams.Keywords.Trim().ToLower();

            bool queryContainsPunctuation = WordSplittingRegex.ContainsPunctuationCharacters(query);

            List <string> searchTerms = SearchHelper.ExtractSearchTermsFromQuery(query, queryContainsPunctuation);

            var matchingOrganisations = new List <SearchCachedOrganisation>();
            var convertedResults      = new List <EmployerSearchModel>();

            if (searchParams.SearchType == SearchType.NotSet)
            {
                throw new NotImplementedException();
            }

            if (searchParams.SearchType == SearchType.ByEmployerName)
            {
                matchingOrganisations = GetMatchingOrganisationsByName(
                    filteredOrganisations,
                    searchTerms,
                    query,
                    queryContainsPunctuation);

                List <RankedViewingSearchOrganisation> organisationsWithRankings = CalculateOrganisationRankings(
                    matchingOrganisations,
                    searchTerms,
                    query,
                    queryContainsPunctuation);

                List <RankedViewingSearchOrganisation> rankedOrganisations = orderByRelevance
                    ? OrderOrganisationsByRank(organisationsWithRankings)
                    : OrderOrganisationsAlphabetically(organisationsWithRankings);

                List <RankedViewingSearchOrganisation> paginatedResults = PaginateResults(
                    rankedOrganisations,
                    searchParams.Page,
                    searchParams.PageSize);

                convertedResults = ConvertRankedOrgsToEmployerSearchModels(paginatedResults);
            }

            if (searchParams.SearchType == SearchType.BySectorType)
            {
                matchingOrganisations = GetMatchingOrganisationsBySicCode(
                    filteredOrganisations,
                    searchTerms,
                    query,
                    queryContainsPunctuation);

                // Only alphabetically for SIC code search
                List <SearchCachedOrganisation> orderedOrganisations =
                    matchingOrganisations.OrderBy(o => o.OrganisationName.OriginalValue).ToList();

                List <SearchCachedOrganisation> paginatedSicCodeResults = PaginateResults(
                    orderedOrganisations,
                    searchParams.Page,
                    searchParams.PageSize);

                convertedResults = ConvertSearchCachedOrganisationsToEmployerSearchModels(paginatedSicCodeResults);
            }

            var pagedResult = new PagedResult <EmployerSearchModel>
            {
                Results            = convertedResults,
                CurrentPage        = searchParams.Page,
                PageSize           = searchParams.PageSize,
                ActualRecordTotal  = matchingOrganisations.Count,
                VirtualRecordTotal = matchingOrganisations.Count
            };

            return(pagedResult);
        }
 public IEnumerable <Employer> SearchEmployers(EmployerSearchParameters searchParameters)
 {
     return(_employerReadRepository.Search(searchParameters));
 }
 public IEnumerable <Employer> SearchEmployers(EmployerSearchParameters searchParameters)
 {
     return(_searchEmployersStrategy.SearchEmployers(searchParameters));
 }
        public async Task <SearchViewModel> SearchAsync(EmployerSearchParameters searchParams)
        {
            var searchResults = new PagedResult <EmployerSearchModel>();

            var facets = new Dictionary <string, Dictionary <object, long> >();

            facets.Add("Size", null);
            facets.Add("SicSectionIds", null);
            facets.Add("ReportedYears", null);
            facets.Add("ReportedLateYears", null);
            facets.Add("ReportedExplanationYears", null);

            var searchTermEnteredOnScreen = searchParams.Keywords;

            if (searchParams.SearchType == SearchTypes.BySectorType)
            {
                var list =
                    await GetListOfSicCodeSuggestionsFromIndexAsync(searchParams.Keywords);

                searchParams.FilterCodeIds = list.Select(x => int.Parse(x.Value.SicCodeId));

                #region Log the search

                if (!string.IsNullOrEmpty(searchParams.Keywords))
                {
                    var detailedListOfReturnedSearchTerms =
                        string.Join(", ", list.Take(5).Select(x => x.Value.ToLogFriendlyString()));

                    var telemetryProperties = new Dictionary <string, string>
                    {
                        { "TimeStamp", VirtualDateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") },
                        { "QueryTerms", searchParams.Keywords },
                        { "ResultCount", list.Count().ToString() },
                        { "SearchType", searchParams.SearchType.ToString() },
                        { "SampleOfResultsReturned", detailedListOfReturnedSearchTerms }
                    };

                    //SharedBusinessLogic.SharedOptions.AppInsightsClient?.TrackEvent("Gpg_SicCode_Suggest", telemetryProperties);

                    await _viewingService.SearchBusinessLogic.SearchLog.WriteAsync(telemetryProperties);
                }

                #endregion

                searchParams.SearchFields =
                    $"{nameof(EmployerSearchModel.SicCodeIds)};{nameof(EmployerSearchModel.SicCodeListOfSynonyms)}";
                searchParams.Keywords = "*"; // searchTermModified

                if (list.Any())
                {
                    searchResults = await DoSearchAsync(searchParams, facets);
                }
            }

            if (searchParams.SearchType == SearchTypes.ByEmployerName)
            {
                searchParams.Keywords = searchParams.Keywords?.Trim();
                searchParams.Keywords = searchParams.RemoveTheMostCommonTermsOnOurDatabaseFromTheKeywords();
                searchResults         = await DoSearchAsync(searchParams, facets);
            }

            // build the result view model
            return(new SearchViewModel
            {
                SizeOptions = GetOrgSizeOptions(searchParams.FilterEmployerSizes, facets["Size"]),
                SectorOptions = await GetSectorOptionsAsync(searchParams.FilterSicSectionIds, facets["SicSectionIds"]),
                ReportingYearOptions = GetReportingYearOptions(searchParams.FilterReportedYears),
                ReportingStatusOptions = GetReportingStatusOptions(searchParams.FilterReportingStatus),
                Employers = searchResults,
                search = searchTermEnteredOnScreen,
                p = searchParams.Page,
                s = searchParams.FilterSicSectionIds,
                es = searchParams.FilterEmployerSizes,
                y = searchParams.FilterReportedYears,
                st = searchParams.FilterReportingStatus,
                t = searchParams.SearchType.ToInt32().ToString()
            });
        }