Skip to content

Instantly share code, notes, and snippets.

@florenceyeun
Created July 1, 2015 20:02
Show Gist options
  • Save florenceyeun/a4184553f0da1d025f7c to your computer and use it in GitHub Desktop.
Save florenceyeun/a4184553f0da1d025f7c to your computer and use it in GitHub Desktop.
commit c3521af23731502a7693566ba1c77d8b05c5986e
Author: Florence Yeun <florwat@reddit.com>
Date: Tue Apr 14 12:44:35 2015 -0700
Search: Add subreddits results to search
Make an extra search request for subreddit results, controlled by a
feature flag.
diff --git a/r2/r2/controllers/front.py b/r2/r2/controllers/front.py
index b354425..3795a76 100644
--- a/r2/r2/controllers/front.py
+++ b/r2/r2/controllers/front.py
@@ -975,14 +975,36 @@ class FrontController(RedditController):
else:
faceting = None
+ result_type = request.GET.get('type')
+ sr_num = 0
+
+ # combined results on first page only, html site only
+ if c.render_style == 'html' and feature.is_enabled('subreddit_search'):
+ if after is None and not restrict_sr and not result_type:
+ # hardcoded to 5 subreddits (or fewer)
+ sr_num = min(5, int(num / 5))
+ num = num - sr_num
+ elif result_type == 'sr':
+ sr_num = num
+ num = 0
+ restrict_sr = False
+
+ content = None
+ subreddits = None
+ cleanup_message = None
+ converted_data = None
+ subreddit_facets = None
+
try:
- cleanup_message = None
try:
q = SearchQuery(query, site, sort=sort, faceting=faceting,
include_over18=include_over18,
recent=recent, syntax=syntax)
content = self._search(q, num=num, after=after, reverse=reverse,
count=count)
+ converted_data = q.converted_data
+ subreddit_facets = content.subreddit_facets
+
except InvalidQuery:
g.stats.simple_event('cloudsearch.error.invalidquery')
@@ -998,6 +1020,9 @@ class FrontController(RedditController):
recent=recent)
content = self._search(q, num=num, after=after, reverse=reverse,
count=count)
+ converted_data = q.converted_data
+ subreddit_facets = content.subreddit_facets
+
if cleaned:
cleanup_message = strings.invalid_search_query % {
"clean_query": cleaned
@@ -1008,27 +1033,40 @@ class FrontController(RedditController):
}
else:
cleanup_message = strings.completely_invalid_search_query
-
- check_cheating("search")
- res = SearchPage(_('search results'), query,
- content=content,
- nav_menus=[SearchSortMenu(default=sort),
- TimeMenu(default=recent)],
- search_params=dict(sort=sort, t=recent),
- infotext=cleanup_message,
- simple=False, site=c.site,
- restrict_sr=restrict_sr,
- syntax=syntax,
- converted_data=q.converted_data,
- facets=content.subreddit_facets,
- sort=sort,
- recent=recent,
- ).render()
- return res
except SearchException + (socket.error,) as e:
return self.search_fail(e)
- def _search(self, query_obj, num, after, reverse, count=0,
+ # extra search request for subreddit results
+ if sr_num > 0:
+ sr_q = SubredditSearchQuery(query, sort='relevance', faceting={},
+ include_over18=include_over18)
+ subreddits = self._search(sr_q, num=sr_num, reverse=reverse,
+ after=after, count=count, type='sr',
+ skip_deleted_authors=False)
+ if is_api() and not content:
+ content = subreddits
+ subreddits = None
+
+ check_cheating("search")
+ res = SearchPage(_('search results'), query,
+ content=content,
+ subreddits=subreddits,
+ nav_menus=[SearchSortMenu(default=sort),
+ TimeMenu(default=recent)],
+ search_params=dict(sort=sort, t=recent),
+ infotext=cleanup_message,
+ simple=False, site=c.site,
+ restrict_sr=restrict_sr,
+ syntax=syntax,
+ converted_data=converted_data,
+ facets=subreddit_facets,
+ sort=sort,
+ recent=recent,
+ ).render()
+
+ return res
+
+ def _search(self, query_obj, num, after, reverse, count=0, type=None,
skip_deleted_authors=True):
"""Helper function for interfacing with search. Basically a
thin wrapper for SearchBuilder."""
@@ -1042,7 +1080,11 @@ class FrontController(RedditController):
g.stats.event_count("listing.invalid_after", "search")
self.abort403()
- listing = SearchListing(builder, show_nums=True)
+ params = request.GET.copy()
+ if type:
+ params['type'] = type
+
+ listing = SearchListing(builder, show_nums=True, params=params)
try:
res = listing.listing()
diff --git a/r2/r2/lib/pages/pages.py b/r2/r2/lib/pages/pages.py
index 10c2513..f449e3a 100644
--- a/r2/r2/lib/pages/pages.py
+++ b/r2/r2/lib/pages/pages.py
@@ -1341,7 +1341,7 @@ class SearchPage(BoringPage):
search_params={},
simple=False, restrict_sr=False, site=None,
syntax=None, converted_data=None, facets={}, sort=None,
- recent=None,
+ recent=None, subreddits=None,
*a, **kw):
self.searchbar = SearchBar(prev_search=prev_search,
search_params=search_params,
@@ -1349,11 +1349,12 @@ class SearchPage(BoringPage):
simple=simple, restrict_sr=restrict_sr,
syntax=syntax, converted_data=converted_data,
facets=facets, sort=sort, recent=recent)
+ self.subreddits = subreddits
BoringPage.__init__(self, pagename, robots='noindex', *a, **kw)
def content(self):
return self.content_stack((self.searchbar, self.infobar,
- self.nav_menu, self._content))
+ self.nav_menu, self.subreddits, self._content))
class TakedownPage(BoringPage):
def __init__(self, link):
diff --git a/r2/r2/models/listing.py b/r2/r2/models/listing.py
index df55803..6450416 100644
--- a/r2/r2/models/listing.py
+++ b/r2/r2/models/listing.py
@@ -43,13 +43,14 @@ class Listing(object):
_js_cls = "Listing"
def __init__(self, builder, nextprev = True, next_link = True,
- prev_link = True, **kw):
+ prev_link = True, params = None, **kw):
self.builder = builder
self.nextprev = nextprev
self.next_link = True
self.prev_link = True
self.next = None
self.prev = None
+ self.params = params or request.GET.copy()
self._max_num = 1
@property
@@ -81,15 +82,15 @@ class Listing(object):
self.before = None
if self.nextprev and self.prev_link and prev and bcount > 1:
- p = request.GET.copy()
+ p = self.params.copy()
p.update({'after':None, 'before':prev._fullname, 'count':bcount})
self.before = prev._fullname
self.prev = (request.path + utils.query_string(p))
- p_first = request.GET.copy()
+ p_first = self.params.copy()
p_first.update({'after':None, 'before':None, 'count':None})
self.first = (request.path + utils.query_string(p_first))
if self.nextprev and self.next_link and next:
- p = request.GET.copy()
+ p = self.params.copy()
p.update({'after':next._fullname, 'before':None, 'count':acount})
self.after = next._fullname
self.next = (request.path + utils.query_string(p))
commit 56c08e11c021916a577ec1d0c0280e0b8b6d7d6c
Author: Florence Yeun <florwat@reddit.com>
Date: Thu Apr 2 17:59:47 2015 -0700
Search: New subreddit relevancy rank expressions
Add subreddit sort menu with new relevancy rank expressions.
diff --git a/r2/r2/controllers/front.py b/r2/r2/controllers/front.py
index 2c81058..649d80e 100644
--- a/r2/r2/controllers/front.py
+++ b/r2/r2/controllers/front.py
@@ -909,6 +909,11 @@ class FrontController(RedditController):
@api_doc(api_section.subreddits, uri='/subreddits/search', supports_rss=True)
def GET_search_reddits(self, query, reverse, after, count, num):
"""Search subreddits by title and description."""
+
+ # do not officially expose sort api yet
+ vsort = VMenu('sort', SubredditSearchSortMenu, remember=False)
+ sort = vsort.run(request.GET.get('sort'), '')
+
# show NSFW to API and RSS users unless obey_over18=true
is_api_or_rss = (c.render_style in API_TYPES
or c.render_style in RSS_TYPES)
@@ -917,7 +922,8 @@ class FrontController(RedditController):
else:
include_over18 = True
- q = SubredditSearchQuery(query, include_over18=include_over18)
+ q = SubredditSearchQuery(query, sort=sort,
+ include_over18=include_over18)
results, etime, spane = self._search(q, num=num, reverse=reverse,
after=after, count=count,
diff --git a/r2/r2/lib/cloudsearch.py b/r2/r2/lib/cloudsearch.py
index 68c4112..b4c2c3a 100644
--- a/r2/r2/lib/cloudsearch.py
+++ b/r2/r2/lib/cloudsearch.py
@@ -1063,11 +1063,16 @@ class LinkSearchQuery(CloudSearchQuery):
class SubredditSearchQuery(CloudSearchQuery):
search_api = g.CLOUDSEARCH_SUBREDDIT_SEARCH_API
- sorts = {'relevance': '-activity',
- None: '-activity',
- }
- sorts_menu_mapping = {'relevance': 1,
- }
+ sorts = {
+ 'relevance': '-activity',
+ 'rel1': '-rel1',
+ 'rel2': '-rel2',
+ }
+ sorts_menu_mapping = {
+ 'relevance': 1,
+ 'rel1': 2,
+ 'rel2': 3,
+ }
known_syntaxes = ("plain",)
default_syntax = "plain"
diff --git a/r2/r2/lib/menus.py b/r2/r2/lib/menus.py
index 8fa959a..5d38a7e 100644
--- a/r2/r2/lib/menus.py
+++ b/r2/r2/lib/menus.py
@@ -27,6 +27,7 @@ from r2.config import feature
from r2.lib.db import operators
from r2.lib.filters import _force_unicode
from r2.lib.search import sorts as search_sorts
+from r2.lib.search import sr_sorts as sr_search_sorts
from r2.lib.strings import StringHandler, plurals
from r2.lib.utils import class_property, query_string, timeago
from r2.lib.wrapped import Styled
@@ -617,6 +618,17 @@ class SearchSortMenu(SortMenu):
return cls.mapping.get(sort, cls.mapping[cls.default])
+class SubredditSearchSortMenu(SortMenu):
+ """Sort menu for subreddit search pages."""
+ _default = 'relevance'
+ mapping = sr_search_sorts
+ _options = mapping.keys()
+
+ @classmethod
+ def operator(cls, sort):
+ return cls.mapping.get(sort, cls.mapping[cls.default])
+
+
class RecSortMenu(SortMenu):
"""Sort menu for recommendation page"""
_default = 'new'
diff --git a/r2/r2/lib/search.py b/r2/r2/lib/search.py
index 8be0b1f..2af3f5a 100644
--- a/r2/r2/lib/search.py
+++ b/r2/r2/lib/search.py
@@ -30,3 +30,4 @@ SearchQuery = cloudsearch.LinkSearchQuery
SubredditSearchQuery = cloudsearch.SubredditSearchQuery
sorts = cloudsearch.LinkSearchQuery.sorts_menu_mapping
+sr_sorts = cloudsearch.SubredditSearchQuery.sorts_menu_mapping
commit ad727b6d5e0f8c919b9dfd04795691f17caf2880
Author: Florence Yeun <florwat@reddit.com>
Date: Mon Apr 20 13:24:37 2015 -0700
Subreddit search: Test new rel1 relevancy
Use rel1 relevancy when the subreddit_relevancy feature flag is
enabled. Add activity as a sort option to access original relevancy.
diff --git a/r2/r2/controllers/front.py b/r2/r2/controllers/front.py
index c2d13b6..51be55f 100644
--- a/r2/r2/controllers/front.py
+++ b/r2/r2/controllers/front.py
@@ -914,6 +914,9 @@ class FrontController(RedditController):
else:
include_over18 = True
+ if feature.is_enabled('subreddit_relevancy') and sort == 'relevance':
+ sort = 'rel1'
+
q = SubredditSearchQuery(query, sort=sort, faceting={},
include_over18=include_over18)
diff --git a/r2/r2/lib/cloudsearch.py b/r2/r2/lib/cloudsearch.py
index 7b99a92..4985bff 100644
--- a/r2/r2/lib/cloudsearch.py
+++ b/r2/r2/lib/cloudsearch.py
@@ -1072,13 +1072,15 @@ class SubredditSearchQuery(CloudSearchQuery):
search_api = g.CLOUDSEARCH_SUBREDDIT_SEARCH_API
sorts = {
'relevance': '-activity',
+ 'activity': '-activity',
'rel1': '-rel1',
'rel2': '-rel2',
}
sorts_menu_mapping = {
'relevance': 1,
- 'rel1': 2,
- 'rel2': 3,
+ 'activity': 2,
+ 'rel1': 3,
+ 'rel2': 4,
}
known_syntaxes = ("plain",)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment