diff --git a/datagateway_api/common/database/helpers.py b/datagateway_api/common/database/helpers.py index cf682cd8..68df4267 100644 --- a/datagateway_api/common/database/helpers.py +++ b/datagateway_api/common/database/helpers.py @@ -202,42 +202,6 @@ def execute_query(self): self.commit_changes() -class QueryFilterFactory(object): - @staticmethod - def get_query_filter(request_filter): - """ - Given a filter return a matching Query filter object - - This factory is not in common.filters so the created filter can be for the - correct backend. Moving the factory into that file would mean the filters would - be based off the abstract classes (because they're in the same file) which won't - enable filters to be unique to the backend - - :param request_filter: dict - The filter to create the QueryFilter for - :return: The QueryFilter object created - """ - filter_name = list(request_filter)[0].lower() - if filter_name == "where": - field = list(request_filter[filter_name].keys())[0] - operation = list(request_filter[filter_name][field].keys())[0] - value = request_filter[filter_name][field][operation] - return WhereFilter(field, value, operation) - elif filter_name == "order": - field = request_filter["order"].split(" ")[0] - direction = request_filter["order"].split(" ")[1] - return OrderFilter(field, direction) - elif filter_name == "skip": - return SkipFilter(request_filter["skip"]) - elif filter_name == "limit": - return LimitFilter(request_filter["limit"]) - elif filter_name == "include": - return IncludeFilter(request_filter["include"]) - elif filter_name == "distinct": - return DistinctFieldFilter(request_filter["distinct"]) - else: - raise FilterError(f" Bad filter: {request_filter}") - - def insert_row_into_table(table, row): """ Insert the given row into its table diff --git a/datagateway_api/common/helpers.py b/datagateway_api/common/helpers.py index 9115b09f..55dec407 100644 --- a/datagateway_api/common/helpers.py +++ b/datagateway_api/common/helpers.py @@ -6,7 +6,7 @@ from flask_restful import reqparse from sqlalchemy.exc import IntegrityError -from datagateway_api.common.database.helpers import QueryFilterFactory +from datagateway_api.common.query_filter import QueryFilterFactory from datagateway_api.common.exceptions import ( ApiError, AuthenticationError, diff --git a/datagateway_api/common/query_filter.py b/datagateway_api/common/query_filter.py new file mode 100644 index 00000000..f81067b3 --- /dev/null +++ b/datagateway_api/common/query_filter.py @@ -0,0 +1,72 @@ +import logging + +from datagateway_api.common.config import config +from datagateway_api.common.exceptions import ( + ApiError, + FilterError, +) + +log = logging.getLogger() + + +class QueryFilterFactory(object): + @staticmethod + def get_query_filter(request_filter): + """ + Given a filter return a matching Query filter object + + This factory is not in common.filters so the created filter can be for the + correct backend. Moving the factory into that file would mean the filters would + be based off the abstract classes (because they're in the same file) which won't + enable filters to be unique to the backend + + :param request_filter: dict - The filter to create the QueryFilter for + :return: The QueryFilter object created + """ + + backend_type = config.get_backend_type() + print(f"Backend inside staticmethod: {backend_type}") + if backend_type == "db": + from datagateway_api.common.database.filters import ( + DatabaseDistinctFieldFilter as DistinctFieldFilter, + DatabaseIncludeFilter as IncludeFilter, + DatabaseLimitFilter as LimitFilter, + DatabaseOrderFilter as OrderFilter, + DatabaseSkipFilter as SkipFilter, + DatabaseWhereFilter as WhereFilter, + ) + elif backend_type == "python_icat": + from datagateway_api.common.icat.filters import ( + PythonICATDistinctFieldFilter as DistinctFieldFilter, + PythonICATIncludeFilter as IncludeFilter, + PythonICATLimitFilter as LimitFilter, + PythonICATOrderFilter as OrderFilter, + PythonICATSkipFilter as SkipFilter, + PythonICATWhereFilter as WhereFilter, + ) + else: + raise ApiError( + "Cannot select which implementation of filters to import, check the" + " config file has a valid backend type", + ) + + filter_name = list(request_filter)[0].lower() + if filter_name == "where": + field = list(request_filter[filter_name].keys())[0] + operation = list(request_filter[filter_name][field].keys())[0] + value = request_filter[filter_name][field][operation] + return WhereFilter(field, value, operation) + elif filter_name == "order": + field = request_filter["order"].split(" ")[0] + direction = request_filter["order"].split(" ")[1] + return OrderFilter(field, direction) + elif filter_name == "skip": + return SkipFilter(request_filter["skip"]) + elif filter_name == "limit": + return LimitFilter(request_filter["limit"]) + elif filter_name == "include": + return IncludeFilter(request_filter["include"]) + elif filter_name == "distinct": + return DistinctFieldFilter(request_filter["distinct"]) + else: + raise FilterError(f" Bad filter: {request_filter}")