diff --git a/config/dev.yml b/config/dev.yml --- a/config/dev.yml +++ b/config/dev.yml @@ -2,6 +2,10 @@ cls: remote url: http://moma.internal.softwareheritage.org:5002 +search: + cls: remote + url: http://moma.internal.softwareheritage.org:5010 + debug: yes server-type: asgi diff --git a/swh/graphql/backends/search.py b/swh/graphql/backends/search.py new file mode 100644 --- /dev/null +++ b/swh/graphql/backends/search.py @@ -0,0 +1,14 @@ +# Copyright (C) 2022 The Software Heritage developers +# See the AUTHORS file at the top-level directory of this distribution +# License: GNU General Public License version 3, or any later version +# See top-level LICENSE file for more information + +from swh.graphql import server + + +class Search: + def __init__(self): + self.search = server.get_search() + + def origins(self, query): + return query diff --git a/swh/graphql/resolvers/resolver_factory.py b/swh/graphql/resolvers/resolver_factory.py --- a/swh/graphql/resolvers/resolver_factory.py +++ b/swh/graphql/resolvers/resolver_factory.py @@ -14,7 +14,7 @@ RevisionNode, TargetRevisionNode, ) -from .search import ResolveSwhidConnection +from .search import ResolveSwhidConnection, SearchConnection from .snapshot import ( OriginSnapshotConnection, SnapshotNode, @@ -75,6 +75,7 @@ "revision-log": LogRevisionConnection, "directory-entries": DirectoryEntryConnection, "resolve-swhid": ResolveSwhidConnection, + "search": SearchConnection, } if resolver_type not in mapping: raise AttributeError(f"Invalid connection type: {resolver_type}") diff --git a/swh/graphql/resolvers/resolvers.py b/swh/graphql/resolvers/resolvers.py --- a/swh/graphql/resolvers/resolvers.py +++ b/swh/graphql/resolvers/resolvers.py @@ -266,6 +266,14 @@ return resolver(obj, info, **kw) +@query.field("search") +def search_resolver( + obj, info: GraphQLResolveInfo, **kw +) -> rs.search.ResolveSwhidConnection: + resolver = get_connection_resolver("search") + return resolver(obj, info, **kw) + + # Any other type of resolver diff --git a/swh/graphql/resolvers/search.py b/swh/graphql/resolvers/search.py --- a/swh/graphql/resolvers/search.py +++ b/swh/graphql/resolvers/search.py @@ -3,7 +3,7 @@ # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information -from swh.graphql.backends import archive +from swh.graphql.backends import archive, search from swh.storage.interface import PagedResult from .base_connection import BaseConnection @@ -29,3 +29,14 @@ } ] return PagedResult(results=results) + + +class SearchConnection(BaseConnection): + + _node_class = SearchResultNode + + def _get_paged_result(self) -> PagedResult: + # obj_type = self.kwargs.get("type") + results = search.Search().origins(self.kwargs.get("query")) + results = [] + return PagedResult(results=results) diff --git a/swh/graphql/schema/schema.graphql b/swh/graphql/schema/schema.graphql --- a/swh/graphql/schema/schema.graphql +++ b/swh/graphql/schema/schema.graphql @@ -921,6 +921,10 @@ target: SearchResultTarget } +enum SearchType { + origin +} + """ The query root of the GraphQL interface. """ @@ -1040,4 +1044,9 @@ """ swhid: SWHID! ): SearchResultConnection! + + search( + query: String! + type: SearchType! + ): SearchResultConnection! } diff --git a/swh/graphql/server.py b/swh/graphql/server.py --- a/swh/graphql/server.py +++ b/swh/graphql/server.py @@ -7,19 +7,28 @@ from typing import Any, Dict, Optional from swh.core import config -from swh.storage import get_storage as get_swhstorage +from swh.search import get_search as get_swh_search +from swh.storage import get_storage as get_swh_storage graphql_cfg = None storage = None +search = None def get_storage(): global storage if not storage: - storage = get_swhstorage(**graphql_cfg["storage"]) + storage = get_swh_storage(**graphql_cfg["storage"]) return storage +def get_search(): + global search + if not search: + search = get_swh_search(**graphql_cfg["search"]) + return search + + def load_and_check_config(config_path: Optional[str]) -> Dict[str, Any]: """Check the minimal configuration is set to run the api or raise an error explanation.