Skip to content

Commit c3397c7

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 1bd7972 commit c3397c7

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
@@ -67,6 +68,8 @@ def resolve_queryset(
6768
id=None,
6869
order=None,
6970
collection=None,
71+
search_operator="and",
72+
search_fields=None,
7073
**kwargs,
7174
):
7275
"""
@@ -117,7 +120,14 @@ def resolve_queryset(
117120
query = Query.get(search_query)
118121
query.add_hit()
119122

120-
qs = qs.search(search_query, order_by_relevance=order_by_relevance)
123+
filters, parsed_query = parse_query_string(search_query, search_operator)
124+
125+
qs = qs.search(
126+
parsed_query,
127+
order_by_relevance=order_by_relevance,
128+
operator=search_operator,
129+
fields=search_fields,
130+
)
121131

122132
return _sliced_queryset(qs, limit, offset)
123133

@@ -156,7 +166,16 @@ def get_paginated_result(qs, page, per_page):
156166

157167

158168
def resolve_paginated_queryset(
159-
qs, info, page=None, per_page=None, search_query=None, id=None, order=None, **kwargs
169+
qs,
170+
info,
171+
page=None,
172+
per_page=None,
173+
id=None,
174+
order=None,
175+
search_query=None,
176+
search_operator="and",
177+
search_fields=None,
178+
**kwargs,
160179
):
161180
"""
162181
Add page, per_page and search capabilities to the query. This contains
@@ -170,11 +189,16 @@ def resolve_paginated_queryset(
170189
:type id: int
171190
:param per_page: The maximum number of items to include on a page.
172191
:type per_page: int
192+
:param order: Order the query set using the Django QuerySet order_by format.
193+
:type order: str
173194
:param search_query: Using Wagtail search, exclude objects that do not match
174195
the search query.
175196
:type search_query: str
176-
:param order: Order the query set using the Django QuerySet order_by format.
177-
:type order: str
197+
:param search_operator: The operator to use when combining search terms.
198+
Defaults to "and".
199+
:type search_operator: "and" | "or"
200+
:param search_fields: A list of fields to search. Defaults to all fields.
201+
:type search_fields: list
178202
"""
179203
page = int(page or 1)
180204
per_page = min(
@@ -202,7 +226,14 @@ def resolve_paginated_queryset(
202226
query = Query.get(search_query)
203227
query.add_hit()
204228

205-
qs = qs.search(search_query, order_by_relevance=order_by_relevance)
229+
filters, parsed_query = parse_query_string(search_query, search_operator)
230+
231+
qs = qs.search(
232+
parsed_query,
233+
order_by_relevance=order_by_relevance,
234+
operator=search_operator,
235+
fields=search_fields,
236+
)
206237

207238
return get_paginated_result(qs, page, per_page)
208239

0 commit comments

Comments
 (0)