Skip to content

Commit 90accc5

Browse files
committed
Search: allow to search on different versions of subprojects
1 parent 765ebec commit 90accc5

File tree

1 file changed

+31
-4
lines changed

1 file changed

+31
-4
lines changed

readthedocs/search/faceted_search.py

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
MultiMatch,
1212
Nested,
1313
SimpleQueryString,
14+
Term,
1415
Wildcard,
1516
)
1617

@@ -35,12 +36,23 @@ class RTDFacetedSearch(FacetedSearch):
3536
'post_tags': ['</span>'],
3637
}
3738

38-
def __init__(self, query=None, filters=None, user=None, use_advanced_query=True, **kwargs):
39+
def __init__(
40+
self,
41+
query=None,
42+
filters=None,
43+
projects=None,
44+
user=None,
45+
use_advanced_query=True,
46+
**kwargs,
47+
):
3948
"""
4049
Pass in a user in order to filter search results by privacy.
4150
42-
If `use_advanced_query` is `True`,
43-
force to always use `SimpleQueryString` for the text query object.
51+
:param projects: A dictionary of project slugs mapped to a `VersionData` object.
52+
Results are filter with these values.
53+
54+
:param use_advanced_query: If `True` forces to always use
55+
`SimpleQueryString` for the text query object.
4456
4557
.. warning::
4658
@@ -50,6 +62,7 @@ def __init__(self, query=None, filters=None, user=None, use_advanced_query=True,
5062
self.user = user
5163
self.filter_by_user = kwargs.pop('filter_by_user', True)
5264
self.use_advanced_query = use_advanced_query
65+
self.projects = projects or {}
5366

5467
# Hack a fix to our broken connection pooling
5568
# This creates a new connection on every request,
@@ -280,8 +293,22 @@ def query(self, search, query):
280293
)
281294

282295
queries.extend([sections_nested_query, domains_nested_query])
296+
bool_query = Bool(should=queries)
297+
298+
if self.projects:
299+
versions_query = [
300+
Bool(
301+
must=[
302+
Term(project={'value': project}),
303+
Term(version={'value': version}),
304+
]
305+
)
306+
for project, version in self.projects.items()
307+
]
308+
bool_query = Bool(must=[bool_query, Bool(should=versions_query)])
309+
283310
final_query = FunctionScore(
284-
query=Bool(should=queries),
311+
query=bool_query,
285312
script_score=self._get_script_score(),
286313
)
287314
search = search.query(final_query)

0 commit comments

Comments
 (0)