Skip to content

Commit 8fabb87

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 f0b73e5 commit 8fabb87

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
@@ -4,6 +4,7 @@
44
from wagtail.models import Site
55
from wagtail.search.index import class_is_indexed
66
from wagtail.search.models import Query
7+
from wagtail.search.utils import parse_query_string
78

89
from .settings import grapple_settings
910
from .types.structures import BasePaginatedType, PaginationType
@@ -62,6 +63,8 @@ def resolve_queryset(
6263
id=None,
6364
order=None,
6465
collection=None,
66+
search_operator="and",
67+
search_fields=None,
6568
**kwargs,
6669
):
6770
"""
@@ -112,7 +115,14 @@ def resolve_queryset(
112115
query = Query.get(search_query)
113116
query.add_hit()
114117

115-
qs = qs.search(search_query, order_by_relevance=order_by_relevance)
118+
filters, parsed_query = parse_query_string(search_query, search_operator)
119+
120+
qs = qs.search(
121+
parsed_query,
122+
order_by_relevance=order_by_relevance,
123+
operator=search_operator,
124+
fields=search_fields,
125+
)
116126
if connection.vendor != "sqlite":
117127
qs = qs.annotate_score("search_score")
118128

@@ -153,7 +163,16 @@ def get_paginated_result(qs, page, per_page):
153163

154164

155165
def resolve_paginated_queryset(
156-
qs, info, page=None, per_page=None, search_query=None, id=None, order=None, **kwargs
166+
qs,
167+
info,
168+
page=None,
169+
per_page=None,
170+
id=None,
171+
order=None,
172+
search_query=None,
173+
search_operator="and",
174+
search_fields=None,
175+
**kwargs,
157176
):
158177
"""
159178
Add page, per_page and search capabilities to the query. This contains
@@ -167,11 +186,16 @@ def resolve_paginated_queryset(
167186
:type id: int
168187
:param per_page: The maximum number of items to include on a page.
169188
:type per_page: int
189+
:param order: Order the query set using the Django QuerySet order_by format.
190+
:type order: str
170191
:param search_query: Using Wagtail search, exclude objects that do not match
171192
the search query.
172193
:type search_query: str
173-
:param order: Order the query set using the Django QuerySet order_by format.
174-
:type order: str
194+
:param search_operator: The operator to use when combining search terms.
195+
Defaults to "and".
196+
:type search_operator: "and" | "or"
197+
:param search_fields: A list of fields to search. Defaults to all fields.
198+
:type search_fields: list
175199
"""
176200
page = int(page or 1)
177201
per_page = min(
@@ -199,7 +223,14 @@ def resolve_paginated_queryset(
199223
query = Query.get(search_query)
200224
query.add_hit()
201225

202-
qs = qs.search(search_query, order_by_relevance=order_by_relevance)
226+
filters, parsed_query = parse_query_string(search_query, search_operator)
227+
228+
qs = qs.search(
229+
parsed_query,
230+
order_by_relevance=order_by_relevance,
231+
operator=search_operator,
232+
fields=search_fields,
233+
)
203234
if connection.vendor != "sqlite":
204235
qs = qs.annotate_score("search_score")
205236

0 commit comments

Comments
 (0)