Fix resolve_offers_to_hub to use DISTANCE() instead of graph traversal
All checks were successful
Build Docker Image / build (push) Successful in 1m23s
All checks were successful
Build Docker Image / build (push) Successful in 1m23s
This commit is contained in:
@@ -1075,14 +1075,59 @@ class Query(graphene.ObjectType):
|
|||||||
return []
|
return []
|
||||||
|
|
||||||
def resolve_offers_to_hub(self, info, hub_uuid, product_uuid, limit=10):
|
def resolve_offers_to_hub(self, info, hub_uuid, product_uuid, limit=10):
|
||||||
"""Get offers for a product with routes to hub."""
|
"""Get offers for a product with routes to hub using DISTANCE()."""
|
||||||
return self.resolve_find_product_routes(
|
db = get_db()
|
||||||
info,
|
nodes_col = db.collection('nodes')
|
||||||
product_uuid=product_uuid,
|
|
||||||
to_uuid=hub_uuid,
|
# Get hub coordinates
|
||||||
limit_sources=limit,
|
hub = nodes_col.get(hub_uuid)
|
||||||
limit_routes=1,
|
if not hub:
|
||||||
)
|
logger.info("Hub %s not found", hub_uuid)
|
||||||
|
return []
|
||||||
|
|
||||||
|
hub_lat = hub.get('latitude')
|
||||||
|
hub_lon = hub.get('longitude')
|
||||||
|
if hub_lat is None or hub_lon is None:
|
||||||
|
logger.info("Hub %s missing coordinates", hub_uuid)
|
||||||
|
return []
|
||||||
|
|
||||||
|
# Find offers for this product sorted by distance to hub
|
||||||
|
aql = """
|
||||||
|
FOR node IN nodes
|
||||||
|
FILTER node.node_type == 'offer'
|
||||||
|
FILTER node.product_uuid == @product_uuid
|
||||||
|
FILTER node.latitude != null AND node.longitude != null
|
||||||
|
LET dist = DISTANCE(node.latitude, node.longitude, @hub_lat, @hub_lon) / 1000
|
||||||
|
SORT dist ASC
|
||||||
|
LIMIT @limit
|
||||||
|
RETURN MERGE(node, {distance_km: dist})
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
cursor = db.aql.execute(aql, bind_vars={
|
||||||
|
'product_uuid': product_uuid,
|
||||||
|
'hub_lat': hub_lat,
|
||||||
|
'hub_lon': hub_lon,
|
||||||
|
'limit': limit
|
||||||
|
})
|
||||||
|
offers = list(cursor)
|
||||||
|
logger.info("Found %d offers for product %s near hub %s", len(offers), product_uuid, hub_uuid)
|
||||||
|
|
||||||
|
results = []
|
||||||
|
for offer in offers:
|
||||||
|
# Build route for each offer
|
||||||
|
routes = Query._build_routes(db, offer['_key'], hub_uuid, limit=1)
|
||||||
|
results.append(ProductRouteOptionType(
|
||||||
|
source_uuid=offer['_key'],
|
||||||
|
source_name=offer.get('name'),
|
||||||
|
source_lat=offer.get('latitude'),
|
||||||
|
source_lon=offer.get('longitude'),
|
||||||
|
distance_km=offer.get('distance_km'),
|
||||||
|
routes=routes,
|
||||||
|
))
|
||||||
|
return results
|
||||||
|
except Exception as e:
|
||||||
|
logger.error("Error getting offers to hub: %s", e)
|
||||||
|
return []
|
||||||
|
|
||||||
def resolve_delivery_to_hub(self, info, offer_uuid, hub_uuid):
|
def resolve_delivery_to_hub(self, info, offer_uuid, hub_uuid):
|
||||||
"""Get delivery route from offer to hub."""
|
"""Get delivery route from offer to hub."""
|
||||||
|
|||||||
Reference in New Issue
Block a user