mirror of
https://github.com/reddit-archive/reddit.git
synced 2026-04-27 03:00:12 -04:00
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:
@@ -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."""
|
||||
|
||||
@@ -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')]
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user