Changeset View
Changeset View
Standalone View
Standalone View
swh/graph/server/app.py
Show First 20 Lines • Show All 103 Lines • ▼ Show 20 Lines | class GraphView(aiohttp.web.View): | ||||
def get_limit(self): | def get_limit(self): | ||||
"""Validate HTTP query parameter `limit`, i.e., number of results""" | """Validate HTTP query parameter `limit`, i.e., number of results""" | ||||
s = self.request.query.get("limit", "0") | s = self.request.query.get("limit", "0") | ||||
try: | try: | ||||
return int(s) | return int(s) | ||||
except ValueError: | except ValueError: | ||||
raise aiohttp.web.HTTPBadRequest(text=f"invalid limit value: {s}") | raise aiohttp.web.HTTPBadRequest(text=f"invalid limit value: {s}") | ||||
def get_max_edges(self): | |||||
"""Validate HTTP query parameter 'max_edges', i.e., | |||||
the limit of the number of edges that can be visited""" | |||||
s: Optional[int] = self.request.query.get("max_edges") | |||||
if s is not None: | |||||
return int(s) | |||||
return s | |||||
class StreamingGraphView(GraphView): | class StreamingGraphView(GraphView): | ||||
"""Base class for views streaming their response line by line.""" | """Base class for views streaming their response line by line.""" | ||||
content_type = "text/plain" | content_type = "text/plain" | ||||
@asynccontextmanager | @asynccontextmanager | ||||
async def response_streamer(self, *args, **kwargs): | async def response_streamer(self, *args, **kwargs): | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | class SimpleTraversalView(StreamingGraphView): | ||||
simple_traversal_type: Optional[str] = None | simple_traversal_type: Optional[str] = None | ||||
async def prepare_response(self): | async def prepare_response(self): | ||||
src = self.request.match_info["src"] | src = self.request.match_info["src"] | ||||
self.src_node = self.node_of_swhid(src) | self.src_node = self.node_of_swhid(src) | ||||
self.edges = self.get_edges() | self.edges = self.get_edges() | ||||
self.direction = self.get_direction() | self.direction = self.get_direction() | ||||
self.max_edges = self.get_max_edges() | |||||
async def stream_response(self): | async def stream_response(self): | ||||
async for res_node in self.backend.simple_traversal( | async for res_node in self.backend.simple_traversal( | ||||
self.simple_traversal_type, self.direction, self.edges, self.src_node | self.simple_traversal_type, self.direction, self.edges, self.src_node | ||||
): | ): | ||||
res_swhid = self.swhid_of_node(res_node) | res_swhid = self.swhid_of_node(res_node) | ||||
await self.stream_line(res_swhid) | await self.stream_line(res_swhid) | ||||
class LeavesView(SimpleTraversalView): | class LeavesView(SimpleTraversalView): | ||||
simple_traversal_type = "leaves" | simple_traversal_type = "leaves" | ||||
class NeighborsView(SimpleTraversalView): | class NeighborsView(SimpleTraversalView): | ||||
simple_traversal_type = "neighbors" | simple_traversal_type = "neighbors" | ||||
class VisitNodesView(SimpleTraversalView): | |||||
simple_traversal_type = "visit_nodes" | |||||
class WalkView(StreamingGraphView): | class WalkView(StreamingGraphView): | ||||
async def prepare_response(self): | async def prepare_response(self): | ||||
src = self.request.match_info["src"] | src = self.request.match_info["src"] | ||||
dst = self.request.match_info["dst"] | dst = self.request.match_info["dst"] | ||||
self.src_node = self.node_of_swhid(src) | self.src_node = self.node_of_swhid(src) | ||||
if dst not in EXTENDED_SWHID_TYPES: | if dst not in EXTENDED_SWHID_TYPES: | ||||
self.dst_thing = self.node_of_swhid(dst) | self.dst_thing = self.node_of_swhid(dst) | ||||
else: | else: | ||||
Show All 31 Lines | |||||
class RandomWalkView(WalkView): | class RandomWalkView(WalkView): | ||||
def get_walk_iterator(self): | def get_walk_iterator(self): | ||||
return self.backend.random_walk( | return self.backend.random_walk( | ||||
self.direction, self.edges, RANDOM_RETRIES, self.src_node, self.dst_thing | self.direction, self.edges, RANDOM_RETRIES, self.src_node, self.dst_thing | ||||
) | ) | ||||
class VisitNodesView(SimpleTraversalView): | |||||
async def stream_response(self): | |||||
async for res_node in self.backend.visit_nodes( | |||||
self.direction, self.edges, self.src_node, self.max_edges | |||||
): | |||||
res_swhid = self.swhid_of_node(res_node) | |||||
await self.stream_line(res_swhid) | |||||
class VisitEdgesView(SimpleTraversalView): | class VisitEdgesView(SimpleTraversalView): | ||||
async def stream_response(self): | async def stream_response(self): | ||||
it = self.backend.visit_edges(self.direction, self.edges, self.src_node) | it = self.backend.visit_edges( | ||||
self.direction, self.edges, self.src_node, self.max_edges | |||||
) | |||||
async for (res_src, res_dst) in it: | async for (res_src, res_dst) in it: | ||||
res_src_swhid = self.swhid_of_node(res_src) | res_src_swhid = self.swhid_of_node(res_src) | ||||
res_dst_swhid = self.swhid_of_node(res_dst) | res_dst_swhid = self.swhid_of_node(res_dst) | ||||
await self.stream_line("{} {}".format(res_src_swhid, res_dst_swhid)) | await self.stream_line("{} {}".format(res_src_swhid, res_dst_swhid)) | ||||
class VisitPathsView(SimpleTraversalView): | class VisitPathsView(SimpleTraversalView): | ||||
content_type = "application/x-ndjson" | content_type = "application/x-ndjson" | ||||
async def stream_response(self): | async def stream_response(self): | ||||
it = self.backend.visit_paths(self.direction, self.edges, self.src_node) | it = self.backend.visit_paths( | ||||
self.direction, self.edges, self.src_node, self.max_edges | |||||
) | |||||
async for res_path in it: | async for res_path in it: | ||||
res_path_swhid = [self.swhid_of_node(n) for n in res_path] | res_path_swhid = [self.swhid_of_node(n) for n in res_path] | ||||
line = json.dumps(res_path_swhid) | line = json.dumps(res_path_swhid) | ||||
await self.stream_line(line) | await self.stream_line(line) | ||||
class CountView(GraphView): | class CountView(GraphView): | ||||
"""Base class for counting views.""" | """Base class for counting views.""" | ||||
▲ Show 20 Lines • Show All 57 Lines • Show Last 20 Lines |