-
-
Save florenceyeun/a4184553f0da1d025f7c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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