From f24f4b4f5e69c558db630e5cdaef4979cd1d5be9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 30 Sep 2025 22:34:11 +0000 Subject: [PATCH 1/2] Initial plan From 5af2194e2f12b504ab60bab32dc546e3f3f925da Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 30 Sep 2025 22:40:38 +0000 Subject: [PATCH 2/2] Fix RoutesOdataController to include routes without RouteInstances when no filter applied Co-authored-by: jjasloot <5612709+jjasloot@users.noreply.github.com> --- OV_DB/Controllers/RoutesOdataController.cs | 52 ++++++++++++++++------ 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/OV_DB/Controllers/RoutesOdataController.cs b/OV_DB/Controllers/RoutesOdataController.cs index 32506efe..0796b1b3 100644 --- a/OV_DB/Controllers/RoutesOdataController.cs +++ b/OV_DB/Controllers/RoutesOdataController.cs @@ -67,11 +67,6 @@ public async Task> GetGeoJsonAsync(string id, ODataQuer return Forbid(); } } - var routes = _context.RouteInstances - .Include(ri => ri.Route) - .ThenInclude(r => r.RouteType) - .AsQueryable(); - var types = await _context.RouteTypes.ToListAsync(cancellationToken: cancellationToken); var colours = new Dictionary(); types.ForEach(t => @@ -79,8 +74,19 @@ public async Task> GetGeoJsonAsync(string id, ODataQuer colours.Add(t.TypeId, new LineStyle { Color = Color32.Parse(t.Colour) }); }); NetTopologySuite.Geometries.Geometry? limitingArea = null; + + var collection = new FeatureCollection(); + var routesList = new List(); + var routesToReturn = new Dictionary(); + if (q.Filter != null) { + // Apply filters - use existing RouteInstance-based logic for backward compatibility + var routes = _context.RouteInstances + .Include(ri => ri.Route) + .ThenInclude(r => r.RouteType) + .AsQueryable(); + var model = Startup.GetEdmModel(); IEdmType type = model.FindDeclaredType("OVDB_database.Models.RouteInstance"); IEdmNavigationSource source = model.FindDeclaredEntitySet("Products"); @@ -93,19 +99,37 @@ public async Task> GetGeoJsonAsync(string id, ODataQuer { limitingArea = await ExtractAreaFromQueryAsync(q, cancellationToken); } + + routes = routes.Where(r => r.RouteInstanceMaps.Any(rim => rim.MapId == map.MapId) || r.Route.RouteMaps.Any(rm => rm.MapId == map.MapId)); + + await routes.ForEachAsync(r => + { + if (routesToReturn.TryAdd(r.RouteId, 0)) + { + routesList.Add(r.Route); + } + routesToReturn[r.RouteId] += 1; + }, cancellationToken: cancellationToken); } - routes = routes.Where(r => r.RouteInstanceMaps.Any(rim => rim.MapId == map.MapId) || r.Route.RouteMaps.Any(rm => rm.MapId == map.MapId)); - var collection = new FeatureCollection(); - var routesList = new List(); - var routesToReturn = new Dictionary(); - await routes.ForEachAsync(r => + else { - if (routesToReturn.TryAdd(r.RouteId, 0)) + // No filter applied - include all routes (even those without RouteInstances) + var allRoutes = await _context.Routes + .Include(r => r.RouteType) + .Include(r => r.RouteInstances) + .Where(r => r.RouteMaps.Any(rm => rm.MapId == map.MapId)) + .ToListAsync(cancellationToken: cancellationToken); + + foreach (var route in allRoutes) { - routesList.Add(r.Route); + routesList.Add(route); + // Count instances associated with this map + var instanceCount = route.RouteInstances.Count(ri => + ri.RouteInstanceMaps.Any(rim => rim.MapId == map.MapId) || + route.RouteMaps.Any(rm => rm.MapId == map.MapId)); + routesToReturn[route.RouteId] = instanceCount; } - routesToReturn[r.RouteId] += 1; - }, cancellationToken: cancellationToken); + } var total = routesList.Count; var processed = 0;