Source code for invenio_records_rest.query
# -*- coding: utf-8 -*-
#
# This file is part of Invenio.
# Copyright (C) 2016-2018 CERN.
#
# Invenio is free software; you can redistribute it and/or modify it
# under the terms of the MIT License; see LICENSE file for more details.
"""Query factories for REST API."""
from flask import current_app, request
from invenio_search.engine import dsl
from .errors import InvalidQueryRESTError
[docs]def default_search_factory(self, search, query_parser=None):
"""Parse query using the search engine DSL query.
:param self: REST view.
:param search: search engine DSL search instance.
:returns: Tuple with search instance and URL arguments.
"""
def _default_parser(qstr=None):
"""Default parser that uses the Q() from search engine dsl."""
if qstr:
return dsl.Q("query_string", query=qstr)
return dsl.Q()
from .facets import default_facets_factory
from .sorter import default_sorter_factory
query_string = request.values.get("q")
query_parser = query_parser or _default_parser
try:
search = search.query(query_parser(query_string))
except SyntaxError:
current_app.logger.debug(
"Failed parsing query: {0}".format(request.values.get("q", "")),
exc_info=True,
)
raise InvalidQueryRESTError()
search_index = getattr(search, "_original_index", search._index)[0]
search, urlkwargs = default_facets_factory(search, search_index)
search, sortkwargs = default_sorter_factory(search, search_index)
for key, value in sortkwargs.items():
urlkwargs.add(key, value)
urlkwargs.add("q", query_string)
return search, urlkwargs
es_search_factory = default_search_factory