diff --git a/docs/sandbox/TransmodelApi.md b/docs/sandbox/TransmodelApi.md index f44a21d5313..dcf96d1e723 100644 --- a/docs/sandbox/TransmodelApi.md +++ b/docs/sandbox/TransmodelApi.md @@ -49,6 +49,8 @@ [#4161](https://github.com/opentripplanner/OpenTripPlanner/pull/4161) - Add possibility to filter dated service journeys by replacementFor [#4198](https://github.com/opentripplanner/OpenTripPlanner/pull/4198) +- Add support for groupOfLines in top level query + [#4232](https://github.com/opentripplanner/OpenTripPlanner/pull/4232) ## Documentation diff --git a/src/ext/java/org/opentripplanner/ext/transmodelapi/TransmodelGraphQLSchema.java b/src/ext/java/org/opentripplanner/ext/transmodelapi/TransmodelGraphQLSchema.java index a0eb0751ddc..1eb813fd5bd 100644 --- a/src/ext/java/org/opentripplanner/ext/transmodelapi/TransmodelGraphQLSchema.java +++ b/src/ext/java/org/opentripplanner/ext/transmodelapi/TransmodelGraphQLSchema.java @@ -757,7 +757,7 @@ private GraphQLSchema create() { if (stops.isEmpty()) { return new DefaultConnection<>( - Collections.emptyList(), + emptyList(), new DefaultPageInfo(null, null, false, false) ); } @@ -1183,6 +1183,35 @@ private GraphQLSchema create() { }) .build() ) + .field( + GraphQLFieldDefinition + .newFieldDefinition() + .name("groupOfLines") + .description("Get a single group of lines based on its id") + .type(groupOfLinesType) + .argument( + GraphQLArgument + .newArgument() + .name("id") + .type(new GraphQLNonNull(Scalars.GraphQLString)) + .build() + ) + .dataFetcher(environment -> + GqlUtil + .getTransitService(environment) + .getGroupOfRoutesForId(TransitIdMapper.mapIDToDomain(environment.getArgument("id"))) + ) + .build() + ) + .field( + GraphQLFieldDefinition + .newFieldDefinition() + .name("groupsOfLines") + .description("Get all groups of lines") + .type(new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(groupOfLinesType)))) + .dataFetcher(environment -> GqlUtil.getTransitService(environment).getGroupsOfRoutes()) + .build() + ) .field( GraphQLFieldDefinition .newFieldDefinition() diff --git a/src/ext/java/org/opentripplanner/ext/transmodelapi/model/network/GroupOfLinesType.java b/src/ext/java/org/opentripplanner/ext/transmodelapi/model/network/GroupOfLinesType.java index 8154a2ca74d..c316168b2e9 100644 --- a/src/ext/java/org/opentripplanner/ext/transmodelapi/model/network/GroupOfLinesType.java +++ b/src/ext/java/org/opentripplanner/ext/transmodelapi/model/network/GroupOfLinesType.java @@ -2,9 +2,11 @@ import graphql.Scalars; import graphql.schema.GraphQLFieldDefinition; +import graphql.schema.GraphQLList; import graphql.schema.GraphQLNonNull; import graphql.schema.GraphQLObjectType; import org.opentripplanner.ext.transmodelapi.mapping.TransitIdMapper; +import org.opentripplanner.ext.transmodelapi.support.GqlUtil; import org.opentripplanner.transit.model.network.GroupOfRoutes; public class GroupOfLinesType { @@ -62,6 +64,17 @@ public static GraphQLObjectType create() { .dataFetcher(env -> ((GroupOfRoutes) env.getSource()).getDescription()) .build() ) + .field( + GraphQLFieldDefinition + .newFieldDefinition() + .name("lines") + .description("All lines part of this group of lines") + .type(new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(LineType.REF)))) + .dataFetcher(env -> + GqlUtil.getTransitService(env).getRoutesForGroupOfRoutes(env.getSource()) + ) + .build() + ) .build(); } } diff --git a/src/main/java/org/opentripplanner/routing/graph/GraphIndex.java b/src/main/java/org/opentripplanner/routing/graph/GraphIndex.java index 7953aaee8bb..c853471b8fc 100644 --- a/src/main/java/org/opentripplanner/routing/graph/GraphIndex.java +++ b/src/main/java/org/opentripplanner/routing/graph/GraphIndex.java @@ -27,6 +27,7 @@ import org.opentripplanner.model.calendar.ServiceDate; import org.opentripplanner.routing.vertextype.TransitStopVertex; import org.opentripplanner.transit.model.framework.FeedScopedId; +import org.opentripplanner.transit.model.network.GroupOfRoutes; import org.opentripplanner.transit.model.network.Route; import org.opentripplanner.transit.model.organization.Agency; import org.opentripplanner.transit.model.organization.Operator; @@ -58,6 +59,8 @@ public class GraphIndex { private final Map serviceCodesRunningForDate = new HashMap<>(); private final Map tripOnServiceDateById = new HashMap<>(); private final Map tripOnServiceDateForTripAndDay = new HashMap<>(); + private final Multimap routesForGroupOfRoutes = ArrayListMultimap.create(); + private final Map groupOfRoutesForId = new HashMap<>(); private FlexIndex flexIndex = null; public GraphIndex(Graph graph) { @@ -101,6 +104,12 @@ public GraphIndex(Graph graph) { } for (Route route : patternsForRoute.asMap().keySet()) { routeForId.put(route.getId(), route); + for (GroupOfRoutes groupOfRoutes : route.getGroupsOfRoutes()) { + routesForGroupOfRoutes.put(groupOfRoutes, route); + } + } + for (GroupOfRoutes groupOfRoutes : routesForGroupOfRoutes.keySet()) { + groupOfRoutesForId.put(groupOfRoutes.getId(), groupOfRoutes); } for (MultiModalStation multiModalStation : graph.multiModalStationById.values()) { for (Station childStation : multiModalStation.getChildStations()) { @@ -244,6 +253,14 @@ public Map getMultiModalStationForStations() { return multiModalStationForStations; } + public Multimap getRoutesForGroupOfRoutes() { + return routesForGroupOfRoutes; + } + + public Map getGroupOfRoutesForId() { + return groupOfRoutesForId; + } + public HashGridSpatialIndex getStopSpatialIndex() { return stopSpatialIndex; } diff --git a/src/main/java/org/opentripplanner/transit/service/DefaultTransitService.java b/src/main/java/org/opentripplanner/transit/service/DefaultTransitService.java index ef089d18071..e591460559c 100644 --- a/src/main/java/org/opentripplanner/transit/service/DefaultTransitService.java +++ b/src/main/java/org/opentripplanner/transit/service/DefaultTransitService.java @@ -34,6 +34,7 @@ import org.opentripplanner.transit.model.basic.WgsCoordinate; import org.opentripplanner.transit.model.framework.FeedScopedId; import org.opentripplanner.transit.model.framework.TransitEntity; +import org.opentripplanner.transit.model.network.GroupOfRoutes; import org.opentripplanner.transit.model.network.Route; import org.opentripplanner.transit.model.network.TransitMode; import org.opentripplanner.transit.model.organization.Agency; @@ -393,6 +394,21 @@ public Collection getPatternsForStop( ); } + @Override + public Collection getGroupsOfRoutes() { + return graphIndex.getRoutesForGroupOfRoutes().keySet(); + } + + @Override + public Collection getRoutesForGroupOfRoutes(GroupOfRoutes groupOfRoutes) { + return graphIndex.getRoutesForGroupOfRoutes().get(groupOfRoutes); + } + + @Override + public GroupOfRoutes getGroupOfRoutesForId(FeedScopedId id) { + return graphIndex.getGroupOfRoutesForId().get(id); + } + /** * Get the most up-to-date timetable for the given TripPattern, as of right now. There should * probably be a less awkward way to do this that just gets the latest entry from the resolver diff --git a/src/main/java/org/opentripplanner/transit/service/TransitService.java b/src/main/java/org/opentripplanner/transit/service/TransitService.java index 75c850a6de8..cc94d857881 100644 --- a/src/main/java/org/opentripplanner/transit/service/TransitService.java +++ b/src/main/java/org/opentripplanner/transit/service/TransitService.java @@ -27,6 +27,7 @@ import org.opentripplanner.transit.model.basic.WgsCoordinate; import org.opentripplanner.transit.model.framework.FeedScopedId; import org.opentripplanner.transit.model.framework.TransitEntity; +import org.opentripplanner.transit.model.network.GroupOfRoutes; import org.opentripplanner.transit.model.network.Route; import org.opentripplanner.transit.model.network.TransitMode; import org.opentripplanner.transit.model.organization.Agency; @@ -138,6 +139,12 @@ List stopTimesForPatternAtStop( Collection getPatternsForStop(StopLocation stop, boolean includeRealtimeUpdates); + Collection getGroupsOfRoutes(); + + Collection getRoutesForGroupOfRoutes(GroupOfRoutes groupOfRoutes); + + GroupOfRoutes getGroupOfRoutesForId(FeedScopedId id); + Timetable getTimetableForTripPattern(TripPattern tripPattern, ServiceDate serviceDate); TripOnServiceDate getTripOnServiceDateForTripAndDay(FeedScopedId tripId, ServiceDate serviceDate);