示例#1
0
        public ActionResult SearchSub(string name, string query, PostsSearchSortBy? sort, TimeFilter? time, int? pageNumber, int? pageSize)
        {
            if (string.IsNullOrEmpty(name))
                return Redirect(Url.Subs());

            if (sort == null)
                sort = PostsSearchSortBy.Relevance;

            if (time == null)
                time = TimeFilter.All;

            var sub = _subDao.GetSubByName(name);

            if (sub == null)
                return Redirect(Url.Subs(name));

            if (pageNumber == null || pageNumber < 1)
                pageNumber = 1;
            if (pageSize == null)
                pageSize = 25;
            if (pageSize > 100)
                pageSize = 100;
            if (pageSize < 1)
                pageSize = 1;

            var model = new SearchResultsModel();
            model.Query = query;
            model.SortBy = sort.Value;
            model.TimeFilter = time.Value;
            model.ResultType = SearchResultType.Post;
            model.LimitingToSub = _subWrapper.Wrap(sub.Id, _userContext.CurrentUser);

            var postIds = _postDao.QueryPosts(query,
               model.LimitingToSub.Sub.Id,
               sort.Value,
               time.Value,
               ((pageNumber - 1) * pageSize),
               pageSize);

            if (!string.IsNullOrEmpty(model.Query))
                model.Posts = new PagedList<PostWrapped>(
                    _postWrapper.Wrap(postIds, _userContext.CurrentUser),
                    pageNumber.Value,
                    pageSize.Value,
                    postIds.HasMore);

            return View("Search", model);
        }
示例#2
0
        public SeekedList<Guid> QueryPosts(string text, Guid? subId = null, PostsSearchSortBy sortBy = PostsSearchSortBy.Relevance, TimeFilter timeFilter = TimeFilter.All, int? skip = null, int? take = null)
        {
            // this implemention will eventually store a index, such as solr.

            return _conn.Perform(conn =>
            {
                var query = conn.From<Post>();

                if (subId.HasValue)
                {
                    query.Where(x => x.SubId == subId);
                }

                if (!string.IsNullOrEmpty(text))
                {
                    query.Where(x => x.Title.Contains(text) || x.Content.Contains(text));
                }

                if (timeFilter != TimeFilter.All)
                {
                    TimeSpan timeSpan;
                    switch (timeFilter)
                    {
                        case TimeFilter.Hour:
                            timeSpan = TimeSpan.FromHours(1);
                            break;
                        case TimeFilter.Day:
                            timeSpan = TimeSpan.FromDays(1);
                            break;
                        case TimeFilter.Week:
                            timeSpan = TimeSpan.FromDays(7);
                            break;
                        case TimeFilter.Month:
                            timeSpan = TimeSpan.FromDays(30);
                            break;
                        case TimeFilter.Year:
                            timeSpan = TimeSpan.FromDays(365);
                            break;
                        default:
                            throw new Exception("unknown time filter");
                    }

                    var from = Common.CurrentTime() - timeSpan;

                    query.Where(x => x.DateCreated >= from);
                }

                var totalCount = conn.Count(query);

                query.Skip(skip).Take(take);

                switch (sortBy)
                {
                    case PostsSearchSortBy.Relevance:
                        // let the db do its thing
                        break;
                    case PostsSearchSortBy.Top:
                        query.OrderByExpression = "ORDER BY (score(vote_up_count, vote_down_count), date_created) DESC";
                        break;
                    case PostsSearchSortBy.New:
                        query.OrderByDescending(x => x.DateCreated);
                        break;
                    case PostsSearchSortBy.Comments:
                        // TODO:
                        break;
                    default:
                        throw new Exception("unknown sort");
                }

                query.SelectExpression = "SELECT \"id\"";

                return new SeekedList<Guid>(conn.Select(query).Select(x => x.Id), skip ?? 0, take, totalCount);
            });
        }
示例#3
0
        public ActionResult SearchSite(string query, PostsSearchSortBy? sort, TimeFilter? time, SearchResultType? resultType, int? pageNumber, int? pageSize)
        {
            if (sort == null)
                sort = PostsSearchSortBy.Relevance;

            if (time == null)
                time = TimeFilter.All;

            if (pageNumber == null || pageNumber < 1)
                pageNumber = 1;
            if (pageSize == null)
                pageSize = 25;
            if (pageSize > 100)
                pageSize = 100;
            if (pageSize < 1)
                pageSize = 1;

            var model = new SearchResultsModel();
            model.Query = query;
            model.SortBy = sort.Value;
            model.TimeFilter = time.Value;
            model.ResultType = resultType;

            if (!string.IsNullOrEmpty(model.Query))
            {
                SeekedList<Guid> postIds = null;
                SeekedList<Guid> subIds = null;

                switch (resultType)
                {
                    case null:
                        postIds = _postDao.QueryPosts(query,
                            model.LimitingToSub != null ? model.LimitingToSub.Sub.Id : (Guid?)null, sort.Value,
                            time.Value, ((pageNumber - 1) * pageSize), pageSize);
                        subIds = _subDao.GetAllSubs(model.Query, SubsSortBy.Relevance, ((pageNumber - 1) * pageSize), pageSize);
                        break;
                    case SearchResultType.Post:
                        postIds = _postDao.QueryPosts(query,
                            model.LimitingToSub != null ? model.LimitingToSub.Sub.Id : (Guid?)null, sort.Value,
                            time.Value, ((pageNumber - 1) * pageSize), pageSize);
                        break;
                    case SearchResultType.Sub:
                        subIds = _subDao.GetAllSubs(model.Query, SubsSortBy.Relevance, ((pageNumber - 1) * pageSize), pageSize);
                        break;
                    default:
                        throw new Exception("unknown result type");
                }

                if (postIds != null)
                    model.Posts = new PagedList<PostWrapped>(_postWrapper.Wrap(postIds, _userContext.CurrentUser), pageNumber.Value, pageSize.Value, postIds.HasMore);

                if (subIds != null)
                    model.Subs = new PagedList<SubWrapped>(_subWrapper.Wrap(subIds, _userContext.CurrentUser), pageNumber.Value, pageSize.Value, subIds.HasMore);
            }

            return View("Search", model);
        }
示例#4
0
        public SeekedList <Guid> QueryPosts(string text,
                                            Guid?subId = null,
                                            PostsSearchSortBy sortBy   = PostsSearchSortBy.Relevance,
                                            PostsTimeFilter timeFilter = PostsTimeFilter.All,
                                            Guid?userId           = null,
                                            bool hideRemovedPosts = true,
                                            bool showDeleted      = false,
                                            bool?nsfw             = null,
                                            int?skip = null,
                                            int?take = null)
        {
            // this implemention will eventually store an index, such as solr.

            return(_conn.Perform(conn =>
            {
                var query = conn.From <Post>();

                if (subId.HasValue)
                {
                    query.Where(x => x.SubId == subId);
                }

                if (!string.IsNullOrEmpty(text))
                {
                    query.Where(x => x.Title.Contains(text) || x.Content.Contains(text));
                }

                if (timeFilter != PostsTimeFilter.All)
                {
                    TimeSpan timeSpan;
                    switch (timeFilter)
                    {
                    case PostsTimeFilter.Hour:
                        timeSpan = TimeSpan.FromHours(1);
                        break;

                    case PostsTimeFilter.Day:
                        timeSpan = TimeSpan.FromDays(1);
                        break;

                    case PostsTimeFilter.Week:
                        timeSpan = TimeSpan.FromDays(7);
                        break;

                    case PostsTimeFilter.Month:
                        timeSpan = TimeSpan.FromDays(30);
                        break;

                    case PostsTimeFilter.Year:
                        timeSpan = TimeSpan.FromDays(365);
                        break;

                    default:
                        throw new Exception("unknown time filter");
                    }

                    var from = Common.CurrentTime() - timeSpan;

                    query.Where(x => x.DateCreated >= from);
                }

                if (hideRemovedPosts)
                {
                    query.Where(x => x.Verdict != (int)Verdict.ModRemoved);
                }

                if (!showDeleted)
                {
                    query.Where(x => x.Deleted == false);
                }

                if (nsfw.HasValue)
                {
                    query.Where(x => x.Nsfw == nsfw.Value);
                }

                if (userId.HasValue)
                {
                    query.Where(x => x.UserId == userId.Value);
                }

                var totalCount = conn.Count(query);

                query.Skip(skip).Take(take);

                switch (sortBy)
                {
                case PostsSearchSortBy.Relevance:
                    // let the db do its thing
                    break;

                case PostsSearchSortBy.Top:
                    query.OrderByExpression = "ORDER BY (score(vote_up_count, vote_down_count), date_created) DESC";
                    break;

                case PostsSearchSortBy.New:
                    query.OrderByDescending(x => x.DateCreated);
                    break;

                case PostsSearchSortBy.Comments:
                    query.OrderByDescending(x => x.NumberOfComments);
                    break;

                default:
                    throw new Exception("unknown sort");
                }

                query.SelectExpression = "SELECT \"id\"";

                return new SeekedList <Guid>(conn.Select(query).Select(x => x.Id), skip ?? 0, take, totalCount);
            }));
        }