33from wagtail .models import Site
44from wagtail .search .index import class_is_indexed
55from wagtail .search .models import Query
6+ from wagtail .search .utils import parse_query_string
67
78from .settings import grapple_settings
89from .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
158168def 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