using Microsoft.EntityFrameworkCore;
using RobotNet10.MapManager.Data;
namespace RobotNet10.MapManager.Services;
///
/// Service implementation for querying map data (nodes and edges) by VehicleType
///
public class MapQueryService(MapDbContext context) : IMapQueryService
{
private readonly MapDbContext _context = context;
public async Task> GetNodesByVehicleTypeAsync(Guid vehicleTypeId)
{
var filteredNodes = await _context.Nodes
.Include(n => n.VehicleProperties)
.ThenInclude(vp => vp.VehicleType)
.Where(n => n.VehicleProperties.Any(vp => vp.VehicleTypeId == vehicleTypeId))
.OrderBy(n => n.NodeId)
.ToListAsync();
return filteredNodes;
}
public async Task> GetEdgesByVehicleTypeAsync(Guid vehicleTypeId)
{
var filteredEdges = await _context.Edges
.Include(e => e.VehicleProperties)
.ThenInclude(vp => vp.VehicleType)
.Include(e => e.StartNode)
.Include(e => e.EndNode)
.Where(e => e.VehicleProperties.Any(vp => vp.VehicleTypeId == vehicleTypeId))
.OrderBy(e => e.EdgeId)
.ToListAsync();
return filteredEdges;
}
public async Task> GetNodesByVehicleTypeAndLevelAsync(Guid vehicleTypeId, Guid levelId)
{
var filteredNodes = await _context.Nodes
.Include(n => n.VehicleProperties)
.ThenInclude(vp => vp.VehicleType)
.Where(n => n.LevelId == levelId &&
n.VehicleProperties.Any(vp => vp.VehicleTypeId == vehicleTypeId))
.OrderBy(n => n.NodeId)
.ToListAsync();
return filteredNodes;
}
public async Task> GetEdgesByVehicleTypeAndLevelAsync(Guid vehicleTypeId, Guid levelId)
{
var filteredEdges = await _context.Edges
.Include(e => e.VehicleProperties)
.ThenInclude(vp => vp.VehicleType)
.Include(e => e.StartNode)
.Include(e => e.EndNode)
.Where(e => e.LevelId == levelId &&
e.VehicleProperties.Any(vp => vp.VehicleTypeId == vehicleTypeId))
.OrderBy(e => e.EdgeId)
.ToListAsync();
return filteredEdges;
}
public async Task GetTotalNodesCountAsync()
{
return await _context.Nodes.CountAsync();
}
public async Task GetTotalEdgesCountAsync()
{
return await _context.Edges.CountAsync();
}
}