diff --git a/internal/restapi/stops_for_route_handler.go b/internal/restapi/stops_for_route_handler.go index e1b26785..f97aed0e 100644 --- a/internal/restapi/stops_for_route_handler.go +++ b/internal/restapi/stops_for_route_handler.go @@ -6,6 +6,7 @@ import ( "log/slog" "net/http" "sort" + "sync" "time" "github.com/twpayne/go-polyline" @@ -215,14 +216,28 @@ func buildStopsList(ctx context.Context, api *RestAPI, calc *GTFS.AdvancedDirect stopIDs = append(stopIDs, stopID) } - stops, err := api.GtfsManager.GtfsDB.Queries.GetStopsByIDs(ctx, stopIDs) - if err != nil { - return nil, err + // Fetch stops and routes in parallel for improved performance + var stops []gtfsdb.Stop + var routeRows []gtfsdb.GetRouteIDsForStopsRow + var stopsErr, routesErr error + var wg sync.WaitGroup + + wg.Add(2) + go func() { + defer wg.Done() + stops, stopsErr = api.GtfsManager.GtfsDB.Queries.GetStopsByIDs(ctx, stopIDs) + }() + go func() { + defer wg.Done() + routeRows, routesErr = api.GtfsManager.GtfsDB.Queries.GetRouteIDsForStops(ctx, stopIDs) + }() + wg.Wait() + + if stopsErr != nil { + return nil, stopsErr } - - routeRows, err := api.GtfsManager.GtfsDB.Queries.GetRouteIDsForStops(ctx, stopIDs) - if err != nil { - return nil, err + if routesErr != nil { + return nil, routesErr } // Organize Routes in Memory diff --git a/internal/restapi/trip_details_handler.go b/internal/restapi/trip_details_handler.go index e88e49b2..79a92432 100644 --- a/internal/restapi/trip_details_handler.go +++ b/internal/restapi/trip_details_handler.go @@ -4,6 +4,7 @@ import ( "context" "net/http" "strconv" + "sync" "time" "maglev.onebusaway.org/gtfsdb" @@ -309,9 +310,28 @@ func (api *RestAPI) buildStopReferences(ctx context.Context, calc *GTFS.Advanced return []models.Stop{}, nil } - stops, err := api.GtfsManager.GtfsDB.Queries.GetStopsByIDs(ctx, originalStopIDs) - if err != nil { - return nil, err + // Fetch stops and routes in parallel for improved performance + var stops []gtfsdb.Stop + var allRoutes []gtfsdb.GetRoutesForStopsRow + var stopsErr, routesErr error + var wg sync.WaitGroup + + wg.Add(2) + go func() { + defer wg.Done() + stops, stopsErr = api.GtfsManager.GtfsDB.Queries.GetStopsByIDs(ctx, originalStopIDs) + }() + go func() { + defer wg.Done() + allRoutes, routesErr = api.GtfsManager.GtfsDB.Queries.GetRoutesForStops(ctx, originalStopIDs) + }() + wg.Wait() + + if stopsErr != nil { + return nil, stopsErr + } + if routesErr != nil { + return nil, routesErr } stopMap := make(map[string]gtfsdb.Stop) @@ -319,11 +339,6 @@ func (api *RestAPI) buildStopReferences(ctx context.Context, calc *GTFS.Advanced stopMap[stop.ID] = stop } - allRoutes, err := api.GtfsManager.GtfsDB.Queries.GetRoutesForStops(ctx, originalStopIDs) - if err != nil { - return nil, err - } - routesByStop := make(map[string][]gtfsdb.Route) for _, routeRow := range allRoutes { if ctx.Err() != nil { diff --git a/internal/restapi/trip_for_vehicle_handler.go b/internal/restapi/trip_for_vehicle_handler.go index 82934a02..e0c812d8 100644 --- a/internal/restapi/trip_for_vehicle_handler.go +++ b/internal/restapi/trip_for_vehicle_handler.go @@ -6,6 +6,7 @@ import ( "errors" "net/http" "strconv" + "sync" "time" "maglev.onebusaway.org/gtfsdb" @@ -301,20 +302,35 @@ func BuildStopReferencesAndRouteIDsForStops(api *RestAPI, ctx context.Context, a } } - stopsDB, err := api.GtfsManager.GtfsDB.Queries.GetStopsByIDs(ctx, uniqueStopIDs) - if err != nil { - return nil, nil, err + // Fetch stops and routes in parallel for improved performance + var stopsDB []gtfsdb.Stop + var allRoutes []gtfsdb.GetRoutesForStopsRow + var stopsErr, routesErr error + var wg sync.WaitGroup + + wg.Add(2) + go func() { + defer wg.Done() + stopsDB, stopsErr = api.GtfsManager.GtfsDB.Queries.GetStopsByIDs(ctx, uniqueStopIDs) + }() + go func() { + defer wg.Done() + allRoutes, routesErr = api.GtfsManager.GtfsDB.Queries.GetRoutesForStops(ctx, uniqueStopIDs) + }() + wg.Wait() + + if stopsErr != nil { + return nil, nil, stopsErr + } + if routesErr != nil { + return nil, nil, routesErr } + stopMap := make(map[string]gtfsdb.Stop) for _, stop := range stopsDB { stopMap[stop.ID] = stop } - allRoutes, err := api.GtfsManager.GtfsDB.Queries.GetRoutesForStops(ctx, uniqueStopIDs) - if err != nil { - return nil, nil, err - } - routesByStop := make(map[string][]gtfsdb.Route) uniqueRouteMap := make(map[string]gtfsdb.GetRoutesForStopsRow) for _, routeRow := range allRoutes {