Skip to content

Commit ca511f9

Browse files
committed
WIP feat: add search operator and fields arguments
this will allow us to implement more specific query functionality. This is a trial balloon to see if it still passes tests, before updating all the queries.
1 parent 7c32128 commit ca511f9

File tree

1 file changed

+36
-5
lines changed

1 file changed

+36
-5
lines changed

grapple/utils.py

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from wagtail.models import Site
44
from wagtail.search.index import class_is_indexed
55
from wagtail.search.models import Query
6+
from wagtail.search.utils import parse_query_string
67

78
from .settings import grapple_settings
89
from .types.structures import BasePaginatedType, PaginationType
@@ -61,6 +62,8 @@ def resolve_queryset(
6162
id=None,
6263
order=None,
6364
collection=None,
65+
search_operator="and",
66+
search_fields=None,
6467
**kwargs,
6568
):
6669
"""
@@ -111,7 +114,14 @@ def resolve_queryset(
111114
query = Query.get(search_query)
112115
query.add_hit()
113116

114-
qs = qs.search(search_query, order_by_relevance=order_by_relevance)
117+
filters, parsed_query = parse_query_string(search_query, search_operator)
118+
119+
qs = qs.search(
120+
parsed_query,
121+
order_by_relevance=order_by_relevance,
122+
operator=search_operator,
123+
fields=search_fields,
124+
)
115125

116126
return _sliced_queryset(qs, limit, offset)
117127

@@ -150,7 +160,16 @@ def get_paginated_result(qs, page, per_page):
150160

151161

152162
def resolve_paginated_queryset(
153-
qs, info, page=None, per_page=None, search_query=None, id=None, order=None, **kwargs
163+
qs,
164+
info,
165+
page=None,
166+
per_page=None,
167+
id=None,
168+
order=None,
169+
search_query=None,
170+
search_operator="and",
171+
search_fields=None,
172+
**kwargs,
154173
):
155174
"""
156175
Add page, per_page and search capabilities to the query. This contains
@@ -164,11 +183,16 @@ def resolve_paginated_queryset(
164183
:type id: int
165184
:param per_page: The maximum number of items to include on a page.
166185
:type per_page: int
186+
:param order: Order the query set using the Django QuerySet order_by format.
187+
:type order: str
167188
:param search_query: Using Wagtail search, exclude objects that do not match
168189
the search query.
169190
:type search_query: str
170-
:param order: Order the query set using the Django QuerySet order_by format.
171-
:type order: str
191+
:param search_operator: The operator to use when combining search terms.
192+
Defaults to "and".
193+
:type search_operator: "and" | "or"
194+
:param search_fields: A list of fields to search. Defaults to all fields.
195+
:type search_fields: list
172196
"""
173197
page = int(page or 1)
174198
per_page = min(
@@ -196,7 +220,14 @@ def resolve_paginated_queryset(
196220
query = Query.get(search_query)
197221
query.add_hit()
198222

199-
qs = qs.search(search_query, order_by_relevance=order_by_relevance)
223+
filters, parsed_query = parse_query_string(search_query, search_operator)
224+
225+
qs = qs.search(
226+
parsed_query,
227+
order_by_relevance=order_by_relevance,
228+
operator=search_operator,
229+
fields=search_fields,
230+
)
200231

201232
return get_paginated_result(qs, page, per_page)
202233

0 commit comments

Comments
 (0)