Skip to content

Commit

Permalink
WIP feat: add search operator and fields arguments
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
dopry committed Mar 8, 2023
1 parent 1bd7972 commit c3397c7
Showing 1 changed file with 36 additions and 5 deletions.
41 changes: 36 additions & 5 deletions grapple/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from wagtail.models import Site
from wagtail.search.index import class_is_indexed
from wagtail.search.models import Query
from wagtail.search.utils import parse_query_string

from .settings import grapple_settings
from .types.structures import BasePaginatedType, PaginationType
Expand Down Expand Up @@ -67,6 +68,8 @@ def resolve_queryset(
id=None,
order=None,
collection=None,
search_operator="and",
search_fields=None,
**kwargs,
):
"""
Expand Down Expand Up @@ -117,7 +120,14 @@ def resolve_queryset(
query = Query.get(search_query)
query.add_hit()

qs = qs.search(search_query, order_by_relevance=order_by_relevance)
filters, parsed_query = parse_query_string(search_query, search_operator)

qs = qs.search(
parsed_query,
order_by_relevance=order_by_relevance,
operator=search_operator,
fields=search_fields,
)

return _sliced_queryset(qs, limit, offset)

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


def resolve_paginated_queryset(
qs, info, page=None, per_page=None, search_query=None, id=None, order=None, **kwargs
qs,
info,
page=None,
per_page=None,
id=None,
order=None,
search_query=None,
search_operator="and",
search_fields=None,
**kwargs,
):
"""
Add page, per_page and search capabilities to the query. This contains
Expand All @@ -170,11 +189,16 @@ def resolve_paginated_queryset(
:type id: int
:param per_page: The maximum number of items to include on a page.
:type per_page: int
:param order: Order the query set using the Django QuerySet order_by format.
:type order: str
:param search_query: Using Wagtail search, exclude objects that do not match
the search query.
:type search_query: str
:param order: Order the query set using the Django QuerySet order_by format.
:type order: str
:param search_operator: The operator to use when combining search terms.
Defaults to "and".
:type search_operator: "and" | "or"
:param search_fields: A list of fields to search. Defaults to all fields.
:type search_fields: list
"""
page = int(page or 1)
per_page = min(
Expand Down Expand Up @@ -202,7 +226,14 @@ def resolve_paginated_queryset(
query = Query.get(search_query)
query.add_hit()

qs = qs.search(search_query, order_by_relevance=order_by_relevance)
filters, parsed_query = parse_query_string(search_query, search_operator)

qs = qs.search(
parsed_query,
order_by_relevance=order_by_relevance,
operator=search_operator,
fields=search_fields,
)

return get_paginated_result(qs, page, per_page)

Expand Down

0 comments on commit c3397c7

Please sign in to comment.