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); }
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>()); }
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); }
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()); }