diff --git a/src/ext/java/org/opentripplanner/ext/vectortiles/layers/vehiclerental/VehicleRentalLayerBuilder.java b/src/ext/java/org/opentripplanner/ext/vectortiles/layers/vehiclerental/VehicleRentalLayerBuilder.java index 0869aeb2ba8..24d922bffb3 100644 --- a/src/ext/java/org/opentripplanner/ext/vectortiles/layers/vehiclerental/VehicleRentalLayerBuilder.java +++ b/src/ext/java/org/opentripplanner/ext/vectortiles/layers/vehiclerental/VehicleRentalLayerBuilder.java @@ -18,6 +18,7 @@ abstract class VehicleRentalLayerBuilder extends LayerBuilder { private final VehicleRentalService service; + private final List hideNetworks; public VehicleRentalLayerBuilder( VehicleRentalService service, @@ -30,6 +31,7 @@ public VehicleRentalLayerBuilder( layerParameters.expansionFactor() ); this.service = service; + this.hideNetworks = layerParameters.hideNetworks(); } @Override @@ -39,6 +41,7 @@ protected List getGeometries(Envelope query) { } return getVehicleRentalPlaces(service) .stream() + .filter(rental -> !hideNetworks.contains(rental.getNetwork())) .map(rental -> { Coordinate coordinate = new Coordinate(rental.getLongitude(), rental.getLatitude()); Point point = GeometryUtils.getGeometryFactory().createPoint(coordinate); diff --git a/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/QueryTypeImpl.java b/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/QueryTypeImpl.java index eae4bc2ad33..d46fa2a8cf1 100644 --- a/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/QueryTypeImpl.java +++ b/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/QueryTypeImpl.java @@ -330,6 +330,7 @@ public DataFetcher> nearest() { List filterByPlaceTypes = args.getGraphQLFilterByPlaceTypes() != null ? args.getGraphQLFilterByPlaceTypes().stream().map(GraphQLUtils::toModel).toList() : DEFAULT_PLACE_TYPES; + List filterByNetworkNames = args.getGraphQLFilterByNetworkNames(); List places; try { @@ -347,6 +348,7 @@ public DataFetcher> nearest() { filterByStations, filterByRoutes, filterByBikeRentalStations, + filterByNetworkNames, getTransitService(environment) ) ); diff --git a/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/RentalVehicleImpl.java b/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/RentalVehicleImpl.java index 53c3ba1343d..84b45270a8b 100644 --- a/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/RentalVehicleImpl.java +++ b/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/RentalVehicleImpl.java @@ -61,6 +61,11 @@ public DataFetcher vehicleType() { return environment -> getSource(environment).vehicleType; } + @Override + public DataFetcher systemUrl() { + return environment -> getSource(environment).system.url; + } + private VehicleRentalVehicle getSource(DataFetchingEnvironment environment) { return environment.getSource(); } diff --git a/src/main/java/org/opentripplanner/apis/gtfs/generated/GraphQLDataFetchers.java b/src/main/java/org/opentripplanner/apis/gtfs/generated/GraphQLDataFetchers.java index 6c66d3992f4..7b35af403cc 100644 --- a/src/main/java/org/opentripplanner/apis/gtfs/generated/GraphQLDataFetchers.java +++ b/src/main/java/org/opentripplanner/apis/gtfs/generated/GraphQLDataFetchers.java @@ -857,6 +857,8 @@ public interface GraphQLRentalVehicle { public DataFetcher vehicleId(); public DataFetcher vehicleType(); + + DataFetcher systemUrl(); } public interface GraphQLRentalVehicleEntityCounts { diff --git a/src/main/java/org/opentripplanner/apis/gtfs/generated/GraphQLTypes.java b/src/main/java/org/opentripplanner/apis/gtfs/generated/GraphQLTypes.java index 3c187ca3bbe..0608e97aa77 100644 --- a/src/main/java/org/opentripplanner/apis/gtfs/generated/GraphQLTypes.java +++ b/src/main/java/org/opentripplanner/apis/gtfs/generated/GraphQLTypes.java @@ -2416,6 +2416,7 @@ public static class GraphQLQueryTypeNearestArgs { private Double lon; private Integer maxDistance; private Integer maxResults; + private List filterByNetworkNames; public GraphQLQueryTypeNearestArgs(Map args) { if (args != null) { @@ -2447,6 +2448,7 @@ public GraphQLQueryTypeNearestArgs(Map args) { this.lon = (Double) args.get("lon"); this.maxDistance = (Integer) args.get("maxDistance"); this.maxResults = (Integer) args.get("maxResults"); + this.filterByNetworkNames = (List) args.get("filterByNetworkNames"); } } @@ -2537,6 +2539,14 @@ public void setGraphQLMaxDistance(Integer maxDistance) { public void setGraphQLMaxResults(Integer maxResults) { this.maxResults = maxResults; } + + public List getGraphQLFilterByNetworkNames() { + return this.filterByNetworkNames; + } + + public void setGraphQLFilterByNetworkNames(List networkNames) { + this.filterByNetworkNames = networkNames; + } } public static class GraphQLQueryTypeNodeArgs { diff --git a/src/main/java/org/opentripplanner/apis/transmodel/TransmodelGraphQLSchema.java b/src/main/java/org/opentripplanner/apis/transmodel/TransmodelGraphQLSchema.java index 638d7783e9a..455c7400718 100644 --- a/src/main/java/org/opentripplanner/apis/transmodel/TransmodelGraphQLSchema.java +++ b/src/main/java/org/opentripplanner/apis/transmodel/TransmodelGraphQLSchema.java @@ -847,6 +847,14 @@ private GraphQLSchema create() { .type(Scalars.GraphQLInt) .build() ) + .argument( + GraphQLArgument + .newArgument() + .name("filterByNetworkNames") + .description("Only include places that match one of the given network names.") + .type(new GraphQLList(Scalars.GraphQLString)) + .build() + ) .argument( GraphQLArgument .newArgument() @@ -937,6 +945,7 @@ private GraphQLSchema create() { if (placeTypes.contains(TransmodelPlaceType.STOP_PLACE)) { maxResults *= 5; } + List filterByNetworkNames = environment.getArgument("filterByNetworkNames"); List places; places = @@ -953,6 +962,7 @@ private GraphQLSchema create() { filterByStations, filterByRoutes, filterByBikeRentalStations, + filterByNetworkNames, GqlUtil.getTransitService(environment) ); diff --git a/src/main/java/org/opentripplanner/inspector/vector/LayerParameters.java b/src/main/java/org/opentripplanner/inspector/vector/LayerParameters.java index ca4a6a64c76..23d5d3c2f59 100644 --- a/src/main/java/org/opentripplanner/inspector/vector/LayerParameters.java +++ b/src/main/java/org/opentripplanner/inspector/vector/LayerParameters.java @@ -1,5 +1,7 @@ package org.opentripplanner.inspector.vector; +import java.util.ArrayList; +import java.util.List; import org.opentripplanner.apis.support.mapping.PropertyMapper; /** @@ -10,7 +12,7 @@ public interface LayerParameters> { int MAX_ZOOM = 20; int CACHE_MAX_SECONDS = -1; double EXPANSION_FACTOR = 0.25d; - + List HIDE_NETWORKS = new ArrayList<>(); /** * User-visible name of the layer */ @@ -54,4 +56,8 @@ default int cacheMaxSeconds() { default double expansionFactor() { return EXPANSION_FACTOR; } + + default List hideNetworks() { + return HIDE_NETWORKS; + } } diff --git a/src/main/java/org/opentripplanner/routing/graphfinder/DirectGraphFinder.java b/src/main/java/org/opentripplanner/routing/graphfinder/DirectGraphFinder.java index 5ffa7cd2301..7eaf60e38f1 100644 --- a/src/main/java/org/opentripplanner/routing/graphfinder/DirectGraphFinder.java +++ b/src/main/java/org/opentripplanner/routing/graphfinder/DirectGraphFinder.java @@ -63,6 +63,7 @@ public List findClosestPlaces( List filterByStations, List filterByRoutes, List filterByBikeRentalStations, + List filterByNetworkNames, TransitService transitService ) { throw new UnsupportedOperationException("Not implemented"); diff --git a/src/main/java/org/opentripplanner/routing/graphfinder/GraphFinder.java b/src/main/java/org/opentripplanner/routing/graphfinder/GraphFinder.java index 4c0b0c81144..eecc4f8015a 100644 --- a/src/main/java/org/opentripplanner/routing/graphfinder/GraphFinder.java +++ b/src/main/java/org/opentripplanner/routing/graphfinder/GraphFinder.java @@ -69,6 +69,7 @@ List findClosestPlaces( List filterByStations, List filterByRoutes, List filterByBikeRentalStations, + List filterByNetworkNames, TransitService transitService ); } diff --git a/src/main/java/org/opentripplanner/routing/graphfinder/PlaceFinderTraverseVisitor.java b/src/main/java/org/opentripplanner/routing/graphfinder/PlaceFinderTraverseVisitor.java index e71504d58f3..6b06e358103 100644 --- a/src/main/java/org/opentripplanner/routing/graphfinder/PlaceFinderTraverseVisitor.java +++ b/src/main/java/org/opentripplanner/routing/graphfinder/PlaceFinderTraverseVisitor.java @@ -44,6 +44,7 @@ public class PlaceFinderTraverseVisitor implements TraverseVisitor private final boolean includeStations; private final int maxResults; private final double radiusMeters; + private final Set filterByNetworkNames; /** * @param transitService A TransitService used in finding information about the @@ -69,6 +70,7 @@ public PlaceFinderTraverseVisitor( List filterByStations, List filterByRoutes, List filterByBikeRentalStations, + List filterByNetworkNames, int maxResults, double radiusMeters ) { @@ -82,6 +84,7 @@ public PlaceFinderTraverseVisitor( this.filterByStations = toSet(filterByStations); this.filterByRoutes = toSet(filterByRoutes); this.filterByVehicleRental = toSet(filterByBikeRentalStations); + this.filterByNetworkNames = toSet(filterByNetworkNames); includeStops = shouldInclude(filterByPlaceTypes, PlaceType.STOP); includePatternAtStops = shouldInclude(filterByPlaceTypes, PlaceType.PATTERN_AT_STOP); @@ -264,6 +267,9 @@ private void handleVehicleRental(VehicleRentalPlace station, double distance) { if (seenVehicleRentalPlaces.contains(station.getId())) { return; } + if (!filterByNetworkNames.isEmpty() && !filterByNetworkNames.contains(station.getNetwork())) { + return; + } seenVehicleRentalPlaces.add(station.getId()); placesFound.add(new PlaceAtDistance(station, distance)); } diff --git a/src/main/java/org/opentripplanner/routing/graphfinder/StreetGraphFinder.java b/src/main/java/org/opentripplanner/routing/graphfinder/StreetGraphFinder.java index 1b2b1d8f522..48b4236cd5b 100644 --- a/src/main/java/org/opentripplanner/routing/graphfinder/StreetGraphFinder.java +++ b/src/main/java/org/opentripplanner/routing/graphfinder/StreetGraphFinder.java @@ -56,6 +56,7 @@ public List findClosestPlaces( List filterByStations, List filterByRoutes, List filterByBikeRentalStations, + List filterByNetworkNames, TransitService transitService ) { PlaceFinderTraverseVisitor visitor = new PlaceFinderTraverseVisitor( @@ -66,6 +67,7 @@ public List findClosestPlaces( filterByStations, filterByRoutes, filterByBikeRentalStations, + filterByNetworkNames, maxResults, radiusMeters ); diff --git a/src/main/java/org/opentripplanner/updater/vehicle_rental/datasources/GbfsGeofencingZoneMapper.java b/src/main/java/org/opentripplanner/updater/vehicle_rental/datasources/GbfsGeofencingZoneMapper.java index caf5d97c0d4..78fa7533d58 100644 --- a/src/main/java/org/opentripplanner/updater/vehicle_rental/datasources/GbfsGeofencingZoneMapper.java +++ b/src/main/java/org/opentripplanner/updater/vehicle_rental/datasources/GbfsGeofencingZoneMapper.java @@ -51,7 +51,8 @@ private GeofencingZone toInternalModel(GBFSFeature f) { LOG.error("Could not convert geofencing zone", e); return null; } - var name = Objects.requireNonNullElseGet(f.getProperties().getName(), () -> fallbackId(g)); + var nameFromData = f.getProperties().getName().isEmpty() ? null : f.getProperties().getName(); + var name = Objects.requireNonNullElseGet(nameFromData, () -> fallbackId(g)); var dropOffBanned = !f.getProperties().getRules().get(0).getRideAllowed(); var passThroughBanned = !f.getProperties().getRules().get(0).getRideThroughAllowed(); return new GeofencingZone( diff --git a/src/main/resources/org/opentripplanner/apis/gtfs/schema.graphqls b/src/main/resources/org/opentripplanner/apis/gtfs/schema.graphqls index 79a794b3607..f0fc391a31e 100644 --- a/src/main/resources/org/opentripplanner/apis/gtfs/schema.graphqls +++ b/src/main/resources/org/opentripplanner/apis/gtfs/schema.graphqls @@ -742,6 +742,9 @@ type RentalVehicle implements Node & PlaceInterface { """The type of the rental vehicle (scooter, bicycle, car...)""" vehicleType: RentalVehicleType + + """The rental vehicle operator's system URL.""" + systemUrl: String! } type BikeRentalStationUris { @@ -3543,6 +3546,9 @@ type QueryType { """ filterByModes: [Mode] + """Only include places that match one of the given network names.""" + filterByNetworkNames: [String] + """Only include places that match one of the given GTFS ids.""" filterByIds: InputFilters @deprecated(reason: "Not actively maintained") before: String diff --git a/src/main/resources/org/opentripplanner/apis/transmodel/schema.graphql b/src/main/resources/org/opentripplanner/apis/transmodel/schema.graphql index fbaa2418d7e..7b9fdb3f386 100644 --- a/src/main/resources/org/opentripplanner/apis/transmodel/schema.graphql +++ b/src/main/resources/org/opentripplanner/apis/transmodel/schema.graphql @@ -675,6 +675,8 @@ type QueryType { filterByInUse: Boolean = false, "Only include places that include this mode. Only checked for places with mode i.e. quays, departures." filterByModes: [TransportMode], + """Only include places that match one of the given network names.""" + filterByNetworkNames: [String], "Only include places of given types if set. Default accepts all types" filterByPlaceTypes: [FilterPlaceType] = [quay, stopPlace, bicycleRent, bikePark, carPark], "fetching only the first certain number of nodes" @@ -953,6 +955,7 @@ type RentalVehicle implements PlaceInterface { longitude: Float! network: String! vehicleType: RentalVehicleType! + systemUrl: String! } type RentalVehicleType { diff --git a/src/test/java/org/opentripplanner/apis/gtfs/GraphQLIntegrationTest.java b/src/test/java/org/opentripplanner/apis/gtfs/GraphQLIntegrationTest.java index 614c8778c6b..cb1d919637e 100644 --- a/src/test/java/org/opentripplanner/apis/gtfs/GraphQLIntegrationTest.java +++ b/src/test/java/org/opentripplanner/apis/gtfs/GraphQLIntegrationTest.java @@ -448,6 +448,7 @@ public List findClosestPlaces( List filterByStations, List filterByRoutes, List filterByBikeRentalStations, + List filterByNetworkNames, TransitService transitService ) { return List diff --git a/src/test/java/org/opentripplanner/routing/graphfinder/PlaceFinderTraverseVisitorTest.java b/src/test/java/org/opentripplanner/routing/graphfinder/PlaceFinderTraverseVisitorTest.java index 1ef675c8101..0796176d9bb 100644 --- a/src/test/java/org/opentripplanner/routing/graphfinder/PlaceFinderTraverseVisitorTest.java +++ b/src/test/java/org/opentripplanner/routing/graphfinder/PlaceFinderTraverseVisitorTest.java @@ -96,6 +96,7 @@ void stopsOnly() { null, null, null, + null, 1, 500 ); @@ -124,6 +125,7 @@ void stationsOnly() { null, null, null, + null, 1, 500 ); @@ -152,6 +154,7 @@ void stopsAndStations() { null, null, null, + null, 1, 500 ); @@ -183,6 +186,7 @@ void stopsAndStationsWithStationFilter() { List.of(STATION1.getId()), null, null, + null, 1, 500 ); @@ -217,6 +221,7 @@ void stopsAndStationsWithStopFilter() { null, null, null, + null, 1, 500 ); @@ -250,6 +255,7 @@ void stopsAndStationsWithStopAndStationFilter() { List.of(STATION1.getId()), null, null, + null, 1, 500 ); diff --git a/src/test/java/org/opentripplanner/routing/graphfinder/StreetGraphFinderTest.java b/src/test/java/org/opentripplanner/routing/graphfinder/StreetGraphFinderTest.java index 3285e27594c..76f231577dd 100644 --- a/src/test/java/org/opentripplanner/routing/graphfinder/StreetGraphFinderTest.java +++ b/src/test/java/org/opentripplanner/routing/graphfinder/StreetGraphFinderTest.java @@ -156,6 +156,7 @@ void findClosestPlacesLimiting() { null, null, null, + null, transitService ) ); @@ -179,6 +180,7 @@ void findClosestPlacesLimiting() { null, null, null, + null, transitService ) ); @@ -196,6 +198,7 @@ void findClosestPlacesLimiting() { null, null, null, + null, transitService ) ); @@ -220,6 +223,7 @@ void findClosestPlacesWithAModeFilter() { null, null, null, + null, transitService ) ); @@ -237,6 +241,7 @@ void findClosestPlacesWithAModeFilter() { null, null, null, + null, transitService ) ); @@ -262,6 +267,7 @@ void findClosestPlacesWithAStopFilter() { null, null, null, + null, transitService ) ); @@ -279,6 +285,7 @@ void findClosestPlacesWithAStopFilter() { null, null, null, + null, transitService ) ); @@ -304,6 +311,7 @@ void findClosestPlacesWithAStopAndRouteFilter() { null, null, null, + null, transitService ) ); @@ -321,6 +329,7 @@ void findClosestPlacesWithAStopAndRouteFilter() { null, List.of(R1.getId()), null, + null, transitService ) ); @@ -347,6 +356,7 @@ void findClosestPlacesWithARouteFilter() { null, null, null, + null, transitService ) ); @@ -364,6 +374,7 @@ void findClosestPlacesWithARouteFilter() { null, List.of(R2.getId()), null, + null, transitService ) ); @@ -387,6 +398,7 @@ void findClosestPlacesWithAVehicleRentalFilter() { null, null, null, + null, transitService ) ); @@ -404,6 +416,7 @@ void findClosestPlacesWithAVehicleRentalFilter() { null, null, List.of("BR2"), + null, transitService ) ); @@ -426,6 +439,7 @@ void findClosestPlacesWithABikeParkFilter() { null, null, null, + null, transitService ) ); @@ -448,6 +462,7 @@ void findClosestPlacesWithACarParkFilter() { null, null, null, + null, transitService ) );