Add hubCountries query and country filter for nodes
All checks were successful
Build Docker Image / build (push) Successful in 1m45s

This commit is contained in:
Ruslan Bakiev
2026-01-08 10:42:34 +07:00
parent 5d5e0fa4b5
commit e15976382e

View File

@@ -96,11 +96,18 @@ class Query(graphene.ObjectType):
limit=graphene.Int(),
offset=graphene.Int(),
transport_type=graphene.String(),
country=graphene.String(description="Filter by country name"),
search=graphene.String(description="Search by node name (case-insensitive)"),
)
nodes_count = graphene.Int(
transport_type=graphene.String(),
description="Get total count of nodes (with optional transport filter)",
country=graphene.String(description="Filter by country name"),
description="Get total count of nodes (with optional transport/country filter)",
)
hub_countries = graphene.List(
graphene.String,
description="List of countries that have logistics hubs",
)
nearest_nodes = graphene.List(
@@ -272,7 +279,7 @@ class Query(graphene.ObjectType):
edges=[EdgeType(**e) for e in edges],
)
def resolve_nodes(self, info, limit=None, offset=None, transport_type=None, search=None):
def resolve_nodes(self, info, limit=None, offset=None, transport_type=None, country=None, search=None):
"""Get all logistics nodes (without edges for list view)."""
db = get_db()
@@ -282,6 +289,7 @@ class Query(graphene.ObjectType):
FILTER node.node_type == 'logistics' OR node.node_type == null
LET types = node.transport_types != null ? node.transport_types : []
FILTER @transport_type == null OR @transport_type IN types
FILTER @country == null OR node.country == @country
FILTER @search == null OR CONTAINS(LOWER(node.name), LOWER(@search)) OR CONTAINS(LOWER(node.country), LOWER(@search))
SORT node.name ASC
LIMIT @offset, @limit
@@ -291,6 +299,7 @@ class Query(graphene.ObjectType):
aql,
bind_vars={
'transport_type': transport_type,
'country': country,
'search': search,
'offset': 0 if offset is None else offset,
'limit': 1000000 if limit is None else limit,
@@ -314,19 +323,34 @@ class Query(graphene.ObjectType):
logger.info("Returning %d nodes", len(nodes))
return nodes
def resolve_nodes_count(self, info, transport_type=None):
def resolve_nodes_count(self, info, transport_type=None, country=None):
db = get_db()
aql = """
FOR node IN nodes
FILTER node.node_type == 'logistics' OR node.node_type == null
LET types = node.transport_types != null ? node.transport_types : []
FILTER @transport_type == null OR @transport_type IN types
FILTER @country == null OR node.country == @country
COLLECT WITH COUNT INTO length
RETURN length
"""
cursor = db.aql.execute(aql, bind_vars={'transport_type': transport_type})
cursor = db.aql.execute(aql, bind_vars={'transport_type': transport_type, 'country': country})
return next(cursor, 0)
def resolve_hub_countries(self, info):
"""Get unique country names from logistics hubs."""
db = get_db()
aql = """
FOR node IN nodes
FILTER node.node_type == 'logistics' OR node.node_type == null
FILTER node.country != null
COLLECT country = node.country
SORT country ASC
RETURN country
"""
cursor = db.aql.execute(aql)
return list(cursor)
def resolve_nearest_nodes(self, info, lat, lon, limit=5):
"""Find nearest logistics nodes to given coordinates."""
db = get_db()