示例#1
0
        protected virtual Type GetSearchType(FilterModel filterModel)
        {
            Type selectedType = null;

            foreach (var filter in filterModel.CheckedItems)
            {
                if (!filter.Value.Any())
                {
                    continue;
                }

                var filterContentModelType = FilterContentsWithGenericTypes
                                             .SingleOrDefault(x => x.Filter.Name == filter.Key);

                if (filterContentModelType == null)
                {
                    continue;
                }

                if (selectedType == null || selectedType.IsAssignableFrom(filterContentModelType.ContentType))
                {
                    selectedType = filterContentModelType.ContentType;
                }
            }

            return(selectedType);
        }
示例#2
0
        public override IEnumerable <FilterContentWithOptions> GetItems(ContentQueryParameters parameters)
        {
            var listingMode = GetListingMode(parameters);
            var contentLink = GetContentLink(parameters, listingMode);

            var filterModelString = parameters.AllParameters["filterModel"];

            var cacheKey     = String.Concat("FacetService#", contentLink, "#", filterModelString);
            var cachedResult = GetCachedContent <IEnumerable <FilterContentWithOptions> >(cacheKey);

            if (cachedResult != null)
            {
                return(cachedResult);
            }

            var content = ContentRepository.Get <IContent>(contentLink);

            var filters = new Dictionary <string, IEnumerable <object> >();
            var filter  = CheckedOptionsService.CreateFilterModel(filterModelString);

            if (filter != null && filter.CheckedItems != null)
            {
                filters = filter.CheckedItems.Where(x => x.Value != null)
                          .ToDictionary(k => k.Key, v => v.Value.Select(x => x));
            }

            var searchType           = GetSearchType(filter) ?? typeof(CatalogContentBase);
            var possiblefacetQueries = FilterContentsWithGenericTypes.Where(x =>
                                                                            x.ContentType.IsAssignableFrom(searchType) ||
                                                                            searchType.IsAssignableFrom(x.ContentType)).ToList();

            var subQueries = new Dictionary <FilterContentModelType, ISearch>();

            AddSubqueries(possiblefacetQueries, subQueries, searchType);

            var filterContentModelTypes = GetSupportedFilterContentModelTypes(searchType).ToList();

            AddFiltersToSubQueries(content, subQueries, filterContentModelTypes, filters, searchType);

            if (subQueries.Any())
            {
                var result = GetFilterResult(subQueries, listingMode).ToList();
                Cache(cacheKey, result);

                return(result);
            }

            return(Enumerable.Empty <FilterContentWithOptions>());
        }
示例#3
0
        protected virtual IEnumerable <FilterContentModelType> GetSupportedFilterContentModelTypes(Type queryType)
        {
            var supportedTypes = FilterContentsWithGenericTypes.Where(x => x.ContentType.IsAssignableFrom(queryType)).ToArray(); //.OrderBy(x => x.Filter.Name)

            for (var i = 0; i < supportedTypes.Length; i++)
            {
                for (var j = i; j < supportedTypes.Length; j++)
                {
                    if (supportedTypes[i].HasGenericArgument && (!supportedTypes[j].HasGenericArgument || supportedTypes[i].ContentType.IsAssignableFrom(supportedTypes[j].ContentType)))
                    {
                        var temp = supportedTypes[i];
                        supportedTypes[i] = supportedTypes[j];
                        supportedTypes[j] = temp;
                    }
                }
            }

            return(supportedTypes);
        }
示例#4
0
        private IEnumerable <FilterContentWithOptions> GetFilterResult(Dictionary <FilterContentModelType, ISearch> subQueries, ListingMode listingMode)
        {
            var filters = new List <FilterContentWithOptions>();

            var multSearch = SearchClient.Instance.MultiSearch <IFacetContent>();
            var filterListInResultOrder = new Dictionary <IFilterContent, FacetFilterSetting>();

            foreach (var subQuery in subQueries.OrderBy(x => x.Key.Filter.Name))
            {
                var typeSearch = subQuery.Value as ITypeSearch <object>;
                AddToMultiSearch(multSearch, typeSearch);

                foreach (var filterContentModelType in FilterContentsWithGenericTypes.Where(x => x.Filter.Name == subQuery.Key.Filter.Name).Where(filterContentModelType => !filters.Select(x => x.Name).Contains(filterContentModelType.Filter.Name)))
                {
                    filterListInResultOrder.Add(filterContentModelType.Filter, filterContentModelType.Setting);
                }
            }

            var filterListInResultOrderKeys = filterListInResultOrder.Keys.ToArray();
            var multiResult = multSearch.GetResult().ToList();

            for (var i = 0; i < multiResult.Count; i++)
            {
                var option = new FilterContentWithOptions()
                {
                    Name = filterListInResultOrderKeys[i].Name,
                    FilterContentType = filterListInResultOrderKeys[i].GetType(),
                    FilterOptions     = filterListInResultOrderKeys[i].GetFilterOptions(multiResult[i], listingMode).ToArray(),
                };

                var settings = filterListInResultOrder[filterListInResultOrderKeys[i]];
                if (settings != null)
                {
                    option.Settings = settings;
                }

                filters.Add(option);
            }

            return(filters.OrderBy(x => x.Settings.SortOrder).ToList());
        }