Beispiel #1
0
        protected virtual void ConvertDate(ForumSearchQuery query, RouteData routeData, string origin)
        {
            string   date;
            DateTime?fromUtc = null;
            DateTime?toUtc   = null;

            if (GetValueFor(query, "d", FacetGroupKind.Date, out date) && TryParseRange(date, out fromUtc, out toUtc))
            {
                if (fromUtc.HasValue && toUtc.HasValue && fromUtc > toUtc)
                {
                    var tmp = fromUtc;
                    fromUtc = toUtc;
                    toUtc   = tmp;
                }

                if (fromUtc.HasValue || toUtc.HasValue)
                {
                    query.CreatedBetween(fromUtc, toUtc);
                }
            }

            AddFacet(query, FacetGroupKind.Date, false, FacetSorting.DisplayOrder, descriptor =>
            {
                AddDates(descriptor, fromUtc, toUtc);
            });
        }
Beispiel #2
0
        public IActionResult Index(string category, int forumPage = 1)
        {
            var forums = _forumService.GetAll()
                         .Select(forum => new ForumListingModel
            {
                Id     = forum.Id,
                Name   = forum.Title,
                Value  = forum.Value,
                ImgUrl = forum.ImageUrl
            });
            var model = new ForumSearchQuery
            {
                Forum = forums
                        .Where(p => p.Name == category || category == null)
                        .OrderBy(p => p.Id)
                        .Skip((forumPage - 1) * PageSize)
                        .Take(PageSize),
                PagingInfo = new PagingInfo
                {
                    CurrentPage  = forumPage,
                    ItemsPerPage = PageSize,
                    TotalItems   = category == null?
                                   forums.Count() :
                                       forums.Where(e => e.Name == category).Count()
                                       //TotalItems = forums.Count()
                },
                CurrentCategory = category
            };

            return(View(model));
        }
Beispiel #3
0
        public ForumSearchedEvent(ForumSearchQuery query, ForumSearchResult result)
        {
            Guard.NotNull(query, nameof(query));
            Guard.NotNull(result, nameof(result));

            Query  = query;
            Result = result;
        }
        private void AddFacet(
            ForumSearchQuery query,
            FacetGroupKind kind,
            bool isMultiSelect,
            FacetSorting sorting,
            Action <FacetDescriptor> addValues)
        {
            string fieldName;
            var    displayOrder = 0;

            switch (kind)
            {
            case FacetGroupKind.Forum:
                if (_searchSettings.ForumDisabled)
                {
                    return;
                }
                fieldName    = "forumid";
                displayOrder = _searchSettings.ForumDisplayOrder;
                break;

            case FacetGroupKind.Customer:
                if (_searchSettings.CustomerDisabled)
                {
                    return;
                }
                fieldName    = "customerid";
                displayOrder = _searchSettings.CustomerDisplayOrder;
                break;

            case FacetGroupKind.Date:
                if (_searchSettings.DateDisabled)
                {
                    return;
                }
                fieldName    = "createdon";
                displayOrder = _searchSettings.DateDisplayOrder;
                break;

            default:
                throw new SmartException($"Unknown field name for facet group '{kind.ToString()}'");
            }

            var descriptor = new FacetDescriptor(fieldName);

            descriptor.Label           = _services.Localization.GetResource(FacetUtility.GetLabelResourceKey(kind) ?? kind.ToString());
            descriptor.IsMultiSelect   = isMultiSelect;
            descriptor.DisplayOrder    = displayOrder;
            descriptor.OrderBy         = sorting;
            descriptor.MinHitCount     = _searchSettings.FilterMinHitCount;
            descriptor.MaxChoicesCount = _searchSettings.FilterMaxChoicesCount;

            addValues(descriptor);
            query.WithFacet(descriptor);
        }
Beispiel #5
0
        public ForumSearchQuery CreateFromQuery()
        {
            var ctx = _httpContext;

            if (ctx.Request == null)
            {
                return(null);
            }

            var routeData  = ctx.Request.RequestContext.RouteData;
            var area       = routeData.GetAreaName();
            var controller = routeData.GetRequiredString("controller");
            var action     = routeData.GetRequiredString("action");
            var origin     = "{0}{1}/{2}".FormatInvariant(area == null ? "" : area + "/", controller, action);
            var fields     = new List <string> {
                "subject"
            };
            var term            = GetValueFor <string>("q");
            var isInstantSearch = origin.IsCaseInsensitiveEqual("Boards/InstantSearch");

            fields.AddRange(_searchSettings.SearchFields);

            var query = new ForumSearchQuery(fields.ToArray(), term, _searchSettings.SearchMode)
                        .OriginatesFrom(origin)
                        .WithLanguage(_services.WorkContext.WorkingLanguage)
                        .WithCurrency(_services.WorkContext.WorkingCurrency)
                        .BuildFacetMap(!isInstantSearch);

            // Visibility.
            query.VisibleOnly(_services.WorkContext.CurrentCustomer, !QuerySettings.IgnoreAcl);

            // Store.
            if (!QuerySettings.IgnoreMultiStore)
            {
                query.HasStoreId(_services.StoreContext.CurrentStore.Id);
            }

            // Instant-Search never uses these filter parameters.
            if (!isInstantSearch)
            {
                ConvertPagingSorting(query, routeData, origin);
                ConvertForum(query, routeData, origin);
                ConvertCustomer(query, routeData, origin);
                ConvertDate(query, routeData, origin);
            }

            OnConverted(query, routeData, origin);

            Current = query;
            return(query);
        }
Beispiel #6
0
        protected virtual void ConvertPagingSorting(ForumSearchQuery query, RouteData routeData, string origin)
        {
            var index = Math.Max(1, GetValueFor <int?>("i") ?? 1);
            var size  = GetPageSize(query, routeData, origin);

            query.Slice((index - 1) * size, size);

            if (_forumSettings.AllowSorting)
            {
                var orderBy = GetValueFor <ForumTopicSorting?>("o");
                if (orderBy == null || orderBy == ForumTopicSorting.Initial)
                {
                    orderBy = _searchSettings.DefaultSortOrder;
                }

                query.SortBy(orderBy.Value);
                query.CustomData["CurrentSortOrder"] = orderBy.Value;
            }
        }
Beispiel #7
0
        protected virtual void ConvertCustomer(ForumSearchQuery query, RouteData routeData, string origin)
        {
            List <int> ids;

            if (GetValueFor(query, "c", FacetGroupKind.Customer, out ids) && ids != null && ids.Any())
            {
                query.WithCustomerIds(ids.ToArray());
            }

            AddFacet(query, FacetGroupKind.Customer, true, FacetSorting.HitsDesc, descriptor =>
            {
                if (ids != null)
                {
                    foreach (var id in ids)
                    {
                        descriptor.AddValue(new FacetValue(id, IndexTypeCode.Int32)
                        {
                            IsSelected = true
                        });
                    }
                }
            });
        }
Beispiel #8
0
        public async void LoadPage(int page, bool decrement = false, bool force = false)
        {
            LoadingTopics = true;
            if (decrement)
            {
                page--;
            }
            try
            {
                Topics = new List <ForumTopicEntryViewModel>();
                ForumBoardContent topics;
                int?arg;
                if (page != 0)
                {
                    arg = _allPages;
                }
                else
                {
                    arg = null;
                }
                switch (PrevArgs.WorkMode)
                {
                case ForumBoardPageWorkModes.Standard:
                    topics = await new ForumBoardTopicsQuery(PrevArgs.TargetBoard, page).GetTopicPosts(arg, force);
                    break;

                case ForumBoardPageWorkModes.AnimeBoard:
                case ForumBoardPageWorkModes.MangaBoard:
                    topics = await
                             new ForumBoardTopicsQuery(PrevArgs.AnimeId, page, PrevArgs.IsAnimeBoard).GetTopicPosts(arg, force);
                    break;

                case ForumBoardPageWorkModes.Search:
                    topics = await
                             ForumSearchQuery.GetSearchResults(PrevArgs.Query, PrevArgs.Scope);

                    break;

                case ForumBoardPageWorkModes.UserSearch:
                    topics = await
                             ForumSearchQuery.GetRecentTopics(PrevArgs.Query);

                    break;

                case ForumBoardPageWorkModes.WatchedTopics:
                    topics = await
                             ForumSearchQuery.GetWatchedTopics();

                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
                if (topics.ForumTopicEntries.Count != 0)
                {
                    Topics      = topics.ForumTopicEntries.Select(entry => new ForumTopicEntryViewModel(entry)).ToList();
                    _allPages   = topics.Pages;
                    CurrentPage = page;
                }
                EmptyNoticeVisibility = !Topics.Any();
            }
            catch (Exception)
            {
                //no shuch page
            }
            _initizalizing = false;
            LoadingTopics  = false;
        }
Beispiel #9
0
 protected virtual bool GetValueFor <T>(ForumSearchQuery query, string key, FacetGroupKind kind, out T value)
 {
     return(GetValueFor(_forumSearchQueryAliasMapper.GetCommonFacetAliasByGroupKind(kind, query.LanguageId ?? 0) ?? key, out value));
 }
Beispiel #10
0
 protected virtual void OnConverted(ForumSearchQuery query, RouteData routeData, string origin)
 {
 }
Beispiel #11
0
 protected virtual int GetPageSize(ForumSearchQuery query, RouteData routeData, string origin)
 {
     return(_forumSettings.SearchResultsPageSize);
 }
Beispiel #12
0
 public ForumSearchResultModel(ForumSearchQuery query)
 {
     Query = query;
 }
Beispiel #13
0
        public ForumSearchingEvent(ForumSearchQuery query)
        {
            Guard.NotNull(query, nameof(query));

            Query = query;
        }