示例#1
0
        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);
        }
示例#3
0
        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));
        }
示例#4
0
        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);
        }
示例#5
0
        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>());
        }