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