public override IQueryResults Get([ModelBinder(typeof(ApiSearchRequestModelBinder))] ApiSearchRequest request) { //If an improper request is passed in return nothing if (string.IsNullOrEmpty(request?.PageId)) { return(null); } var q = new SearchQuery <InformaSearchResultItem>(request, _parser); q.FilterPredicateBuilder = new InformaPredicateBuilder <InformaSearchResultItem>(_parser, request); q.QueryPredicateBuilder = new InformaQueryPredicateBuilder <InformaSearchResultItem>(_queryFormatter, request); var results = _searchManager.GetItems(q); var multiSelectFacetResults = GetMultiSelectFacetResults(request); return(new QueryResults { Request = request, Results = results.Results, TotalResults = results.TotalResults, Facets = MergeFacets(results.Facets, multiSelectFacetResults) }); }
public override bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) { if (bindingContext.ModelType != typeof(ApiSearchRequest)) { return(false); } var pageId = GetPageId(bindingContext); var page = GetPage(bindingContext); var sort = GetSort(bindingContext); var sortOrder = GetSortOrder(bindingContext); // Add extraneous query parameters (excludes pageId, page, sort) var queryParams = actionContext.Request.GetQueryNameValuePairs().Where(kvp => !IgnoredQueryParams.Contains(kvp.Key) && !string.IsNullOrEmpty(kvp.Value)).ToQueryParamDictionary(); // Get the request lifetime scope so you can resolve services. var requestScope = actionContext.Request.GetDependencyScope(); // Resolve the service you want to use. var glassFactory = requestScope.GetService(typeof(IGlassInterfaceFactory)) as IGlassInterfaceFactory; var searchPageParser = requestScope.GetService(typeof(ISearchPageParser)) as ISearchPageParser; var result = new ApiSearchRequest(searchPageParser, glassFactory) { Page = page, PageId = pageId, SortBy = sort, SortOrder = sortOrder, QueryParameters = queryParams }; bindingContext.Model = result; return(true); }
public virtual IQueryResults Get(ApiSearchRequest request) { if (request == null || string.IsNullOrEmpty(request.PageId)) { return(null); } var query = new SearchQuery <T>(request, _searchPageParser); return(_searchFactory.For <T>().GetItems(query)); }
private IEnumerable <FacetGroup> GetMultiSelectFacetResults(ApiSearchRequest request) { var facets = _cacheProvider.GetFromCache($"GetMulitSelectFacets:ID:{request.PageId}", () => _parser.RefinementOptions.OfType <IFacet>().Where(f => f.Is_Multi_Value && !f.And_Filter).Select(f => f.Key).ToArray()); if (!facets.Any()) { return(Enumerable.Empty <FacetGroup>()); } var newRequest = new ApiSearchRequest(_parser, _interfaceFactory) { PageId = request.PageId, Page = 1, PerPage = 0, QueryParameters = request.QueryParameters.ToDictionary(entry => entry.Key, entry => entry.Value) }; //For each facet group get facets count without including the selections from this group to enforce ORing between the same groups IEnumerable <FacetGroup> facetsGroups = Enumerable.Empty <FacetGroup>(); foreach (var facet in request.QueryParameters.Where(r => facets.Contains(r.Key))) { //reset the queryParameters to all selections newRequest.QueryParameters = request.QueryParameters.ToDictionary(entry => entry.Key, entry => entry.Value); //remove the current facet group for the parameters of the new request newRequest.QueryParameters.Remove(facet); if (request.QueryParameters.Count == newRequest.QueryParameters.Count) { continue; } //Do the search to get the results var qForCurrentGroup = new SearchQuery <InformaSearchResultItem>(request, _parser) { FilterPredicateBuilder = new InformaPredicateBuilder <InformaSearchResultItem>(_parser, newRequest), QueryPredicateBuilder = new InformaQueryPredicateBuilder <InformaSearchResultItem>(_queryFormatter, newRequest), FacetBuilder = new SearchFacetBuilder <InformaSearchResultItem>( request.GetRefinements().Where(r => facets.Contains(r.RefinementKey))), SortBuilder = null }; var resultsForCurrentGroup = _searchManager.GetItems(qForCurrentGroup); //include only the current facets group's count into the facetsGroups list facetsGroups = facetsGroups.Concat(resultsForCurrentGroup.Facets.Where(w => w.Id == facet.Key)); } return(facetsGroups); }
public IEnumerable <CompanyTypeAheadResponseItem> GetCompanies([ModelBinder(typeof(ApiSearchRequestModelBinder))] ApiSearchRequest request) { var q = new SearchQuery <InformaSearchResultItem>(request, _parser) { Take = 1, Skip = 0, FilterPredicateBuilder = new InformaPredicateBuilder <InformaSearchResultItem>(_parser, request), QueryPredicateBuilder = new InformaQueryPredicateBuilder <InformaSearchResultItem>(_queryFormatter, request), FacetBuilder = new CompaniesFacetBuilder(), SortBuilder = null }; var results = _searchManager.GetItems(q); return(results.Facets.FirstOrDefault()?.Values.Select(f => new CompanyTypeAheadResponseItem(f.Name)) ?? Enumerable.Empty <CompanyTypeAheadResponseItem>()); }