protected virtual IList <IFilter> GetFilters(CategoryIndexedSearchCriteria criteria)
        {
            var result = new List <IFilter>();

            if (!string.IsNullOrEmpty(criteria.Keyword))
            {
                var parseResult = _searchPhraseParser.Parse(criteria.Keyword);
                criteria.Keyword = parseResult.Keyword;
                result.AddRange(parseResult.Filters);
            }

            if (criteria.ObjectIds != null)
            {
                result.Add(new IdsFilter {
                    Values = criteria.ObjectIds
                });
            }

            if (!string.IsNullOrEmpty(criteria.CatalogId))
            {
                result.Add(FiltersHelper.CreateTermFilter("catalog", criteria.CatalogId.ToLowerInvariant()));
            }

            result.Add(FiltersHelper.CreateOutlineFilter(criteria));

            var terms = criteria.GetTerms();

            result.AddRange(terms.Select(term => FiltersHelper.CreateTermFilter(term.Key, term.Values)));

            return(result);
        }
        protected virtual IList <SortingField> GetSorting(CategoryIndexedSearchCriteria criteria)
        {
            var result = new List <SortingField>();
            //For sorting by relevance have to keep sortInfo clear
            var needClearSortInfo = false;

            var priorityFields = criteria.GetPriorityFields();

            foreach (var sortInfo in criteria.SortInfos)
            {
                var fieldName    = sortInfo.SortColumn.ToLowerInvariant();
                var isDescending = sortInfo.SortDirection == SortDirection.Descending;

                switch (fieldName)
                {
                case "relevance":
                    needClearSortInfo = true;
                    break;

                case "priority":
                    result.AddRange(priorityFields.Select(priorityField => new SortingField(priorityField, isDescending)));
                    break;

                case "name":
                case "title":
                    result.Add(new SortingField("name", isDescending));
                    break;

                default:
                    result.Add(new SortingField(fieldName, isDescending));
                    break;
                }
            }

            if (!result.Any())
            {
                result.AddRange(priorityFields.Select(priorityField => new SortingField(priorityField, true)));
                result.Add(new SortingField("__sort"));
            }

            if (needClearSortInfo)
            {
                result.Clear();
            }
            return(result);
        }
Ejemplo n.º 3
0
        public async Task <ActionResult <CategoryIndexedSearchResult> > SearchCategories([FromBody] CategoryIndexedSearchCriteria criteria)
        {
            criteria.ObjectType = KnownDocumentTypes.Category;
            var result = await _categoryIndexedSearchService.SearchAsync(criteria);

            return(Ok(result));
        }
        public async Task <ActionResult <CategoryIndexedSearchResult> > SearchCategories([FromBody] CategoryIndexedSearchCriteria criteria)
        {
            criteria.ObjectType = KnownDocumentTypes.Category;
            var result = await _categoryIndexedSearchService.SearchAsync(criteria);

            //It is a important to return serialized data by such way. Instead you have a slow response time for large outputs
            //https://github.com/dotnet/aspnetcore/issues/19646
            return(Content(JsonConvert.SerializeObject(result, _jsonOptions.SerializerSettings), "application/json"));
        }