Search: Decouple sort menu from search provider

Decouple the sort menu options for link search from the search
provider configuration and remove global g.search_sorts. This
allows SubredditSearchSortMenu to be used again.
This commit is contained in:
Florence Yeun
2015-05-21 13:05:39 -07:00
parent f4325ab2e8
commit 052151da53
5 changed files with 28 additions and 54 deletions

View File

@@ -904,8 +904,7 @@ class FrontController(RedditController):
@base_listing
@require_oauth2_scope("read")
@validate(query=nop('q', docs={"q": "a search query"}),
sort=VOneOf('sort', ('relevance', 'activity'),
default='relevance'))
sort=VMenu('sort', SubredditSearchSortMenu, remember=False))
@api_doc(api_section.subreddits, uri='/subreddits/search', supports_rss=True)
def GET_search_reddits(self, query, reverse, after, count, num, sort):
"""Search subreddits by title and description."""

View File

@@ -74,19 +74,6 @@ from r2.lib.utils import config_gold_price, thread_dump
LIVE_CONFIG_NODE = "/config/live"
LINK_SEARCH_SORTS = {
'cloudsearch': {'relevance': '-relevance',
'hot': '-hot2',
'top': '-top',
'new': '-timestamp',
'comments': '-num_comments',},
'solr': {'relevance': 'score desc',
'hot': 'max(hot/45000.0, 1.0) desc',
'top': 'top desc',
'new': 'timestamp desc',
'comments': 'num_comments desc',},
}
SEARCH_SYNTAXES = {
'cloudsearch': ('cloudsearch', 'lucene', 'plain'),
'solr': ('solr', 'plain'),
@@ -999,10 +986,6 @@ class Globals(object):
return self.search_provider
return None
@property
def search_sorts(self):
return LINK_SEARCH_SORTS[self.config.get('search_provider')]
@property
def search_syntaxes(self):
return SEARCH_SYNTAXES[self.config.get('search_provider')]

View File

@@ -608,23 +608,13 @@ class CommentSortMenu(SortMenu):
class SearchSortMenu(SortMenu):
"""Sort menu for search pages."""
_default = 'relevance'
mapping = g.search_sorts
_options = mapping.keys()
@classmethod
def operator(cls, sort):
return cls.mapping.get(sort, cls.mapping[cls.default])
_options = ('relevance', 'hot', 'top', 'new', 'comments')
class SubredditSearchSortMenu(SortMenu):
"""Sort menu for subreddit search pages."""
_default = 'relevance'
mapping = g.search_sorts
_options = mapping.keys()
@classmethod
def operator(cls, sort):
return cls.mapping.get(sort, cls.mapping[cls.default])
_options = ('relevance', 'activity')
class RecSortMenu(SortMenu):

View File

@@ -443,7 +443,7 @@ INVALID_QUERY_CODES = ('CS-UnknownFieldInMatchExpression',
'CS-InvalidMatchSetExpression',)
DEFAULT_FACETS = {"reddit": {"count":20}}
def basic_query(query=None, bq=None, faceting=None, size=1000,
start=0, rank="-relevance", rank_expressions=None,
start=0, rank=None, rank_expressions=None,
return_fields=None, record_stats=False, search_api=None):
if search_api is None:
search_api = g.CLOUDSEARCH_SEARCH_API
@@ -515,7 +515,8 @@ def _encode_query(query, bq, faceting, size, start, rank, rank_expressions,
params["results-type"] = "json"
params["size"] = size
params["start"] = start
params["rank"] = rank
if rank:
params["rank"] = rank
if rank_expressions:
for rank, expression in rank_expressions.iteritems():
params['rank-%s' % rank] = expression
@@ -536,7 +537,6 @@ class CloudSearchQuery(object):
'''Represents a search query sent to cloudsearch'''
search_api = None
sorts = {}
sorts_menu_mapping = {}
recents = {None: None}
default_syntax = "plain"
lucene_parser = None
@@ -568,7 +568,7 @@ class CloudSearchQuery(object):
if raw_sort:
self.sort = raw_sort
else:
self.sort = self.sorts[sort]
self.sort = self.sorts.get(sort)
self.rank_expressions = rank_expressions
# pagination
@@ -638,8 +638,9 @@ class CloudSearchQuery(object):
result.append(" bq:")
result.append(repr(self.bq))
result.append(" ")
result.append("sort:")
result.append(self.sort)
if self.sort:
result.append("sort:")
result.append(self.sort)
return ''.join(result)
@classmethod
@@ -705,7 +706,13 @@ class CloudSearchQuery(object):
class LinkSearchQuery(CloudSearchQuery):
search_api = g.CLOUDSEARCH_SEARCH_API
sorts = g.search_sorts
sorts = {
'relevance': '-relevance',
'hot': '-hot2',
'top': '-top',
'new': '-timestamp',
'comments': '-num_comments',
}
recents = {
'hour': timedelta(hours=1),
'day': timedelta(days=1),

View File

@@ -161,7 +161,7 @@ class SolrSearchQuery(object):
if raw_sort:
self.sort = _translate_raw_sort(raw_sort)
elif sort:
self.sort = g.search_sorts.get(sort)
self.sort = self.sorts.get(sort)
else:
self.sort = 'score'
self.rank_expressions = rank_expressions
@@ -289,13 +289,13 @@ class SolrSearchQuery(object):
class LinkSearchQuery(SolrSearchQuery):
search_api = g.solr_search_host
sorts = g.search_sorts
sorts_menu_mapping = {'relevance': 1,
'hot': 2,
'new': 3,
'top': 4,
'comments': 5,
}
sorts = {
'relevance': 'score desc',
'hot': 'max(hot/45000.0, 1.0) desc',
'top': 'top desc',
'new': 'timestamp desc',
'comments': 'num_comments desc',
}
recents = {
'hour': timedelta(hours=1),
'day': timedelta(days=1),
@@ -365,12 +365,9 @@ class LinkSearchQuery(SolrSearchQuery):
class SolrSubredditSearchQuery(SolrSearchQuery):
search_api = g.solr_subreddit_search_host
sorts = {'relevance': 'activity',
None: 'activity',
}
sorts_menu_mapping = {'relevance': 1,
}
sorts = {
'relevance': 'activity desc',
}
known_syntaxes = ("plain", "solr")
default_syntax = "plain"
@@ -833,8 +830,6 @@ class SolrSearchProvider(SearchProvider):
SubredditSearchQuery = SolrSubredditSearchQuery
sorts = LinkSearchQuery.sorts_menu_mapping
def run_changed(self, drain=False, min_size=int(getattr(g, 'solr_min_batch', 500)), limit=1000, sleep_time=10,
use_safe_get=False, verbose=False):
'''Run by `cron` (through `paster run`) on a schedule to send Things to Solr