diff --git a/src/main/java/org/entur/lamassu/cache/VehicleSpatialIndexId.java b/src/main/java/org/entur/lamassu/cache/VehicleSpatialIndexId.java index 281c3756..ec762252 100644 --- a/src/main/java/org/entur/lamassu/cache/VehicleSpatialIndexId.java +++ b/src/main/java/org/entur/lamassu/cache/VehicleSpatialIndexId.java @@ -11,6 +11,7 @@ public class VehicleSpatialIndexId private PropulsionType propulsionType; private boolean isReserved; private boolean isDisabled; + private boolean isAtNonVirtualStation; public FormFactor getFormFactor() { return formFactor; @@ -44,6 +45,14 @@ public void setDisabled(boolean disabled) { isDisabled = disabled; } + public boolean getAtNonVirtualStation() { + return isAtNonVirtualStation; + } + + public void setAtNonVirtualStation(boolean atNonVirtualStation) { + isAtNonVirtualStation = atNonVirtualStation; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -54,6 +63,7 @@ public boolean equals(Object o) { if (isReserved != that.isReserved) return false; if (isDisabled != that.isDisabled) return false; + if (isAtNonVirtualStation != that.isAtNonVirtualStation) return false; if (formFactor != that.formFactor) return false; return propulsionType == that.propulsionType; } @@ -65,6 +75,7 @@ public int hashCode() { result = 31 * result + (propulsionType != null ? propulsionType.hashCode() : 0); result = 31 * result + (isReserved ? 1 : 0); result = 31 * result + (isDisabled ? 1 : 0); + result = 31 * result + (isAtNonVirtualStation ? 1 : 0); return result; } } diff --git a/src/main/java/org/entur/lamassu/graphql/query/VehicleQueryController.java b/src/main/java/org/entur/lamassu/graphql/query/VehicleQueryController.java index 5ba1fd3a..5c9edb2a 100644 --- a/src/main/java/org/entur/lamassu/graphql/query/VehicleQueryController.java +++ b/src/main/java/org/entur/lamassu/graphql/query/VehicleQueryController.java @@ -12,6 +12,7 @@ import org.entur.lamassu.service.GeoSearchService; import org.entur.lamassu.service.RangeQueryParameters; import org.entur.lamassu.service.VehicleFilterParameters; +import org.springframework.beans.factory.annotation.Value; import org.springframework.graphql.data.method.annotation.Argument; import org.springframework.graphql.data.method.annotation.QueryMapping; import org.springframework.stereotype.Controller; @@ -22,15 +23,21 @@ public class VehicleQueryController { private final GeoSearchService geoSearchService; private final EntityReader vehicleReader; private final QueryParameterValidator validationService; + private final boolean defaultIncludeVehiclesAtNonVirtualStations; public VehicleQueryController( GeoSearchService geoSearchService, EntityReader vehicleReader, - QueryParameterValidator validationService + QueryParameterValidator validationService, + @Value( + "${org.entur.lamassu.graphql.default-include-vehicles-at-non-virtual-stations:false}" + ) boolean defaultIncludeVehiclesAtNonVirtualStations ) { this.geoSearchService = geoSearchService; this.vehicleReader = vehicleReader; this.validationService = validationService; + this.defaultIncludeVehiclesAtNonVirtualStations = + defaultIncludeVehiclesAtNonVirtualStations; } @QueryMapping @@ -55,7 +62,8 @@ public Collection vehicles( @Argument List formFactors, @Argument List propulsionTypes, @Argument Boolean includeReserved, - @Argument Boolean includeDisabled + @Argument Boolean includeDisabled, + @Argument Boolean includeVehiclesAtNonVirtualStations ) { if (ids != null && !ids.isEmpty()) { return vehicleReader.getAll(new HashSet<>(ids)); @@ -73,7 +81,10 @@ public Collection vehicles( formFactors, propulsionTypes, includeReserved, - includeDisabled + includeDisabled, + includeVehiclesAtNonVirtualStations != null + ? includeVehiclesAtNonVirtualStations + : defaultIncludeVehiclesAtNonVirtualStations ); Collection vehicles; diff --git a/src/main/java/org/entur/lamassu/graphql/subscription/VehicleSubscriptionController.java b/src/main/java/org/entur/lamassu/graphql/subscription/VehicleSubscriptionController.java index 23045770..5d8e4bf5 100644 --- a/src/main/java/org/entur/lamassu/graphql/subscription/VehicleSubscriptionController.java +++ b/src/main/java/org/entur/lamassu/graphql/subscription/VehicleSubscriptionController.java @@ -1,17 +1,20 @@ package org.entur.lamassu.graphql.subscription; import java.util.List; +import org.entur.lamassu.cache.EntityCache; import org.entur.lamassu.graphql.subscription.filter.VehicleUpdateFilter; import org.entur.lamassu.graphql.subscription.handler.VehicleSubscriptionHandler; import org.entur.lamassu.graphql.subscription.model.VehicleUpdate; import org.entur.lamassu.graphql.validation.QueryParameterValidator; import org.entur.lamassu.model.entities.FormFactor; import org.entur.lamassu.model.entities.PropulsionType; +import org.entur.lamassu.model.entities.Station; import org.entur.lamassu.service.BoundingBoxQueryParameters; import org.entur.lamassu.service.FeedProviderService; import org.entur.lamassu.service.RangeQueryParameters; import org.entur.lamassu.service.VehicleFilterParameters; import org.reactivestreams.Publisher; +import org.springframework.beans.factory.annotation.Value; import org.springframework.graphql.data.method.annotation.Argument; import org.springframework.graphql.data.method.annotation.SubscriptionMapping; import org.springframework.stereotype.Controller; @@ -26,15 +29,24 @@ public class VehicleSubscriptionController { private final VehicleSubscriptionHandler vehicleSubscriptionHandler; private final QueryParameterValidator validationService; private final FeedProviderService feedProviderService; + private final EntityCache stationCache; + private final boolean defaultIncludeVehiclesAtNonVirtualStations; public VehicleSubscriptionController( VehicleSubscriptionHandler vehicleSubscriptionHandler, QueryParameterValidator validationService, - FeedProviderService feedProviderService + FeedProviderService feedProviderService, + EntityCache stationCache, + @Value( + "${org.entur.lamassu.graphql.default-include-vehicles-at-non-virtual-stations:false}" + ) boolean defaultIncludeVehiclesAtNonVirtualStations ) { this.vehicleSubscriptionHandler = vehicleSubscriptionHandler; this.validationService = validationService; this.feedProviderService = feedProviderService; + this.stationCache = stationCache; + this.defaultIncludeVehiclesAtNonVirtualStations = + defaultIncludeVehiclesAtNonVirtualStations; } /** @@ -72,7 +84,8 @@ public Publisher> vehicles( @Argument List formFactors, @Argument List propulsionTypes, @Argument Boolean includeReserved, - @Argument Boolean includeDisabled + @Argument Boolean includeDisabled, + @Argument Boolean includeVehiclesAtNonVirtualStations ) { // Validate parameters validationService.validateCodespaces(codespaces); @@ -96,7 +109,10 @@ public Publisher> vehicles( formFactors, propulsionTypes, includeReserved != null && includeReserved, - includeDisabled != null && includeDisabled + includeDisabled != null && includeDisabled, + includeVehiclesAtNonVirtualStations != null + ? includeVehiclesAtNonVirtualStations + : defaultIncludeVehiclesAtNonVirtualStations ); // Create subscription handler @@ -114,7 +130,8 @@ public Publisher> vehicles( filterParams, queryParams, systemId -> - feedProviderService.getFeedProviderBySystemId(systemId).getCodespace() + feedProviderService.getFeedProviderBySystemId(systemId).getCodespace(), + this::isNonVirtualStation ); } else { var queryParams = new BoundingBoxQueryParameters( @@ -128,11 +145,20 @@ public Publisher> vehicles( filterParams, queryParams, systemId -> - feedProviderService.getFeedProviderBySystemId(systemId).getCodespace() + feedProviderService.getFeedProviderBySystemId(systemId).getCodespace(), + this::isNonVirtualStation ); } // Return publisher and ensure listener is removed when subscription ends return vehicleSubscriptionHandler.getPublisher(filter); } + + private boolean isNonVirtualStation(String stationId) { + var station = stationCache.get(stationId); + if (station == null) { + return false; + } + return !Boolean.TRUE.equals(station.getVirtualStation()); + } } diff --git a/src/main/java/org/entur/lamassu/graphql/subscription/filter/VehicleUpdateFilter.java b/src/main/java/org/entur/lamassu/graphql/subscription/filter/VehicleUpdateFilter.java index b4047c76..3917b78e 100644 --- a/src/main/java/org/entur/lamassu/graphql/subscription/filter/VehicleUpdateFilter.java +++ b/src/main/java/org/entur/lamassu/graphql/subscription/filter/VehicleUpdateFilter.java @@ -19,6 +19,7 @@ package org.entur.lamassu.graphql.subscription.filter; import java.util.List; +import java.util.function.Predicate; import java.util.function.UnaryOperator; import org.entur.lamassu.graphql.subscription.model.VehicleUpdate; import org.entur.lamassu.model.entities.FormFactor; @@ -34,23 +35,28 @@ public class VehicleUpdateFilter implements EntityUpdateFilter { private final VehicleFilterParameters filterParameters; + private final Predicate nonVirtualStationPredicate; public VehicleUpdateFilter( VehicleFilterParameters filterParameters, RangeQueryParameters rangeQueryParameters, - UnaryOperator codespaceResolver + UnaryOperator codespaceResolver, + Predicate nonVirtualStationPredicate ) { super(filterParameters, rangeQueryParameters, codespaceResolver); this.filterParameters = filterParameters; + this.nonVirtualStationPredicate = nonVirtualStationPredicate; } public VehicleUpdateFilter( VehicleFilterParameters filterParameters, BoundingBoxQueryParameters boundingBoxParameters, - UnaryOperator codespaceResolver + UnaryOperator codespaceResolver, + Predicate nonVirtualStationPredicate ) { super(filterParameters, boundingBoxParameters, codespaceResolver); this.filterParameters = filterParameters; + this.nonVirtualStationPredicate = nonVirtualStationPredicate; } @Override @@ -127,10 +133,24 @@ private boolean matchesStatusFilters(Vehicle vehicle) { } // Filter by disabled status - return ( - filterParameters.getIncludeDisabled() || - vehicle.getDisabled() == null || - !Boolean.TRUE.equals(vehicle.getDisabled()) - ); + if ( + !filterParameters.getIncludeDisabled() && + vehicle.getDisabled() != null && + Boolean.TRUE.equals(vehicle.getDisabled()) + ) { + return false; + } + + // Filter by non-virtual station assignment + if ( + !filterParameters.getIncludeVehiclesAtNonVirtualStations() && + vehicle.getStationId() != null && + nonVirtualStationPredicate != null && + nonVirtualStationPredicate.test(vehicle.getStationId()) + ) { + return false; + } + + return true; } } diff --git a/src/main/java/org/entur/lamassu/service/SpatialIndexIdGeneratorService.java b/src/main/java/org/entur/lamassu/service/SpatialIndexIdGeneratorService.java index 36bf39cd..00ebae32 100644 --- a/src/main/java/org/entur/lamassu/service/SpatialIndexIdGeneratorService.java +++ b/src/main/java/org/entur/lamassu/service/SpatialIndexIdGeneratorService.java @@ -17,10 +17,15 @@ public class SpatialIndexIdGeneratorService { private final EntityCache vehicleTypeCache; + private final EntityCache stationCache; @Autowired - public SpatialIndexIdGeneratorService(EntityCache vehicleTypeCache) { + public SpatialIndexIdGeneratorService( + EntityCache vehicleTypeCache, + EntityCache stationCache + ) { this.vehicleTypeCache = vehicleTypeCache; + this.stationCache = stationCache; } public VehicleSpatialIndexId createVehicleIndexId( @@ -43,9 +48,21 @@ public VehicleSpatialIndexId createVehicleIndexId( id.setPropulsionType(vehicleType.getPropulsionType()); id.setReserved(vehicle.getReserved()); id.setDisabled(vehicle.getDisabled()); + id.setAtNonVirtualStation(isAtNonVirtualStation(vehicle)); return id; } + private boolean isAtNonVirtualStation(Vehicle vehicle) { + if (vehicle.getStationId() == null) { + return false; + } + var station = stationCache.get(vehicle.getStationId()); + if (station == null) { + return false; + } + return !Boolean.TRUE.equals(station.getVirtualStation()); + } + public StationSpatialIndexId createStationIndexId( Station station, FeedProvider provider diff --git a/src/main/java/org/entur/lamassu/service/VehicleFilterParameters.java b/src/main/java/org/entur/lamassu/service/VehicleFilterParameters.java index 71138b0c..06613323 100644 --- a/src/main/java/org/entur/lamassu/service/VehicleFilterParameters.java +++ b/src/main/java/org/entur/lamassu/service/VehicleFilterParameters.java @@ -10,6 +10,7 @@ public class VehicleFilterParameters extends FilterParameters { private List propulsionTypes; private boolean includeReserved; private boolean includeDisabled; + private boolean includeVehiclesAtNonVirtualStations; public VehicleFilterParameters( List codespaces, @@ -19,13 +20,15 @@ public VehicleFilterParameters( List formFactors, List propulsionTypes, boolean includeReserved, - boolean includeDisabled + boolean includeDisabled, + boolean includeVehiclesAtNonVirtualStations ) { super(codespaces, systems, operators, count); this.formFactors = formFactors; this.propulsionTypes = propulsionTypes; this.includeReserved = includeReserved; this.includeDisabled = includeDisabled; + this.includeVehiclesAtNonVirtualStations = includeVehiclesAtNonVirtualStations; } public List getFormFactors() { @@ -59,4 +62,14 @@ public boolean getIncludeDisabled() { public void setIncludeDisabled(boolean includeDisabled) { this.includeDisabled = includeDisabled; } + + public boolean getIncludeVehiclesAtNonVirtualStations() { + return includeVehiclesAtNonVirtualStations; + } + + public void setIncludeVehiclesAtNonVirtualStations( + boolean includeVehiclesAtNonVirtualStations + ) { + this.includeVehiclesAtNonVirtualStations = includeVehiclesAtNonVirtualStations; + } } diff --git a/src/main/java/org/entur/lamassu/util/SpatialIndexIdFilter.java b/src/main/java/org/entur/lamassu/util/SpatialIndexIdFilter.java index af9c2d9f..e5f71799 100644 --- a/src/main/java/org/entur/lamassu/util/SpatialIndexIdFilter.java +++ b/src/main/java/org/entur/lamassu/util/SpatialIndexIdFilter.java @@ -56,6 +56,13 @@ public static boolean filterVehicle( return false; } + if ( + !filters.getIncludeVehiclesAtNonVirtualStations() && + parsedId.getAtNonVirtualStation() + ) { + return false; + } + return true; } diff --git a/src/main/resources/graphql/schema.graphqls b/src/main/resources/graphql/schema.graphqls index 5bad4059..cbf1499c 100644 --- a/src/main/resources/graphql/schema.graphqls +++ b/src/main/resources/graphql/schema.graphqls @@ -14,6 +14,7 @@ type Subscription { propulsionTypes: [PropulsionType] includeReserved: Boolean = false includeDisabled: Boolean = false + includeVehiclesAtNonVirtualStations: Boolean ): [VehicleUpdate] @deprecated(reason: "Experimental feature - API is subject to change") stations( @@ -105,6 +106,9 @@ type Query { "Include disabled vehicles in result" includeDisabled: Boolean = false + + "Include vehicles assigned to non-virtual stations in result" + includeVehiclesAtNonVirtualStations: Boolean ): [Vehicle] station(id: String!): Station diff --git a/src/test/java/org/entur/lamassu/graphql/subscription/VehicleSubscriptionControllerTest.java b/src/test/java/org/entur/lamassu/graphql/subscription/VehicleSubscriptionControllerTest.java index 5e1d6a9d..5ca7a9ae 100644 --- a/src/test/java/org/entur/lamassu/graphql/subscription/VehicleSubscriptionControllerTest.java +++ b/src/test/java/org/entur/lamassu/graphql/subscription/VehicleSubscriptionControllerTest.java @@ -9,6 +9,7 @@ import static org.mockito.Mockito.when; import java.util.List; +import org.entur.lamassu.cache.EntityCache; import org.entur.lamassu.graphql.subscription.filter.VehicleUpdateFilter; import org.entur.lamassu.graphql.subscription.handler.VehicleSubscriptionHandler; import org.entur.lamassu.graphql.subscription.model.UpdateType; @@ -16,6 +17,7 @@ import org.entur.lamassu.graphql.validation.QueryParameterValidator; import org.entur.lamassu.model.entities.FormFactor; import org.entur.lamassu.model.entities.PropulsionType; +import org.entur.lamassu.model.entities.Station; import org.entur.lamassu.model.entities.Vehicle; import org.entur.lamassu.model.entities.VehicleType; import org.entur.lamassu.model.provider.FeedProvider; @@ -25,7 +27,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.reactivestreams.Publisher; @@ -48,7 +49,9 @@ class VehicleSubscriptionControllerTest { @Mock private FeedProviderService feedProviderService; - @InjectMocks + @Mock + private EntityCache stationCache; + private VehicleSubscriptionController controller; private static final String TEST_SYSTEM_ID = "test-system"; @@ -56,6 +59,14 @@ class VehicleSubscriptionControllerTest { @BeforeEach void setUp() { + controller = + new VehicleSubscriptionController( + subscriptionHandler, + validationService, + feedProviderService, + stationCache, + false + ); // Setup common mocks with lenient to avoid UnnecessaryStubbingException FeedProvider feedProvider = new FeedProvider(); feedProvider.setSystemId(TEST_SYSTEM_ID); @@ -102,6 +113,7 @@ void testVehicleSubscriptionWithBoundingBox() { null, null, null, + null, null ); @@ -165,6 +177,7 @@ void testVehicleSubscriptionWithRangeSearch() { null, null, null, + null, null ); @@ -224,6 +237,7 @@ void testVehicleSubscriptionWithVehicleTypeFilters() { List.of(FormFactor.BICYCLE), List.of(PropulsionType.ELECTRIC), null, + null, null ); @@ -287,7 +301,8 @@ void testVehicleSubscriptionWithStatusFilters() { null, null, true, // includeReserved - false // includeDisabled + false, // includeDisabled + null // includeVehiclesAtNonVirtualStations ); // Verify the result @@ -345,6 +360,7 @@ void testVehicleSubscriptionWithOperatorFilter() { null, null, null, + null, null ); diff --git a/src/test/java/org/entur/lamassu/graphql/subscription/filter/VehicleUpdateFilterTest.java b/src/test/java/org/entur/lamassu/graphql/subscription/filter/VehicleUpdateFilterTest.java index f90cd40a..1bd4ac5f 100644 --- a/src/test/java/org/entur/lamassu/graphql/subscription/filter/VehicleUpdateFilterTest.java +++ b/src/test/java/org/entur/lamassu/graphql/subscription/filter/VehicleUpdateFilterTest.java @@ -58,6 +58,7 @@ void testFilterByBoundingBox() { null, null, false, + false, false ); @@ -71,7 +72,8 @@ void testFilterByBoundingBox() { VehicleUpdateFilter filter = new VehicleUpdateFilter( filterParams, bbox, - CODESPACE_RESOLVER + CODESPACE_RESOLVER, + null ); // Create test updates inside and outside the bounding box @@ -100,6 +102,7 @@ void testFilterByRange() { null, null, false, + false, false ); @@ -109,7 +112,8 @@ void testFilterByRange() { VehicleUpdateFilter filter = new VehicleUpdateFilter( filterParams, rangeParams, - CODESPACE_RESOLVER + CODESPACE_RESOLVER, + null ); // Create test updates inside and outside the range @@ -135,6 +139,7 @@ void testFilterByCodespace() { null, null, false, + false, false ); @@ -156,7 +161,8 @@ void testFilterByCodespace() { VehicleUpdateFilter filter = new VehicleUpdateFilter( filterParams, bbox, - codespaceResolver + codespaceResolver, + null ); // Create test updates with matching and non-matching codespaces @@ -192,6 +198,7 @@ void testFilterByFormFactor() { List.of(FormFactor.SCOOTER), null, false, + false, false ); @@ -205,7 +212,8 @@ void testFilterByFormFactor() { VehicleUpdateFilter filter = new VehicleUpdateFilter( filterParams, bbox, - CODESPACE_RESOLVER + CODESPACE_RESOLVER, + null ); // Create test updates with matching and non-matching form factors @@ -239,6 +247,7 @@ void testFilterByPropulsionType() { null, List.of(PropulsionType.ELECTRIC), false, + false, false ); @@ -252,7 +261,8 @@ void testFilterByPropulsionType() { VehicleUpdateFilter filter = new VehicleUpdateFilter( filterParams, bbox, - CODESPACE_RESOLVER + CODESPACE_RESOLVER, + null ); // Create test updates with matching and non-matching propulsion types @@ -289,7 +299,8 @@ void testFilterByReservedStatus() { null, null, false, - true + true, + false ); BoundingBoxQueryParameters bbox = new BoundingBoxQueryParameters( @@ -302,7 +313,8 @@ void testFilterByReservedStatus() { VehicleUpdateFilter filter = new VehicleUpdateFilter( filterParams, bbox, - CODESPACE_RESOLVER + CODESPACE_RESOLVER, + null ); // Create test updates with reserved and non-reserved vehicles @@ -333,13 +345,15 @@ void testFilterByReservedStatus() { null, null, true, - true + true, + false ); VehicleUpdateFilter includeReservedFilter = new VehicleUpdateFilter( includeReservedParams, bbox, - CODESPACE_RESOLVER + CODESPACE_RESOLVER, + null ); assertTrue( @@ -359,6 +373,7 @@ void testFilterByDisabledStatus() { null, null, true, + false, false ); @@ -372,7 +387,8 @@ void testFilterByDisabledStatus() { VehicleUpdateFilter filter = new VehicleUpdateFilter( filterParams, bbox, - CODESPACE_RESOLVER + CODESPACE_RESOLVER, + null ); // Create test updates with disabled and enabled vehicles @@ -403,13 +419,15 @@ void testFilterByDisabledStatus() { null, null, true, - true + true, + false ); VehicleUpdateFilter includeDisabledFilter = new VehicleUpdateFilter( includeDisabledParams, bbox, - CODESPACE_RESOLVER + CODESPACE_RESOLVER, + null ); assertTrue( @@ -429,7 +447,8 @@ void testFilterBySystem() { null, null, true, - true + true, + false ); BoundingBoxQueryParameters bbox = new BoundingBoxQueryParameters( @@ -442,7 +461,8 @@ void testFilterBySystem() { VehicleUpdateFilter filter = new VehicleUpdateFilter( filterParams, bbox, - CODESPACE_RESOLVER + CODESPACE_RESOLVER, + null ); // Create test updates with matching and non-matching system IDs @@ -475,7 +495,8 @@ void testFilterByOperator() { null, null, true, - true + true, + false ); BoundingBoxQueryParameters bbox = new BoundingBoxQueryParameters( @@ -488,7 +509,8 @@ void testFilterByOperator() { VehicleUpdateFilter filter = new VehicleUpdateFilter( filterParams, bbox, - CODESPACE_RESOLVER + CODESPACE_RESOLVER, + null ); // Create test updates with matching and non-matching operator IDs @@ -526,7 +548,8 @@ void testVehicleWithNullVehicleType() { List.of(FormFactor.BICYCLE), null, true, - true + true, + false ); BoundingBoxQueryParameters bbox = new BoundingBoxQueryParameters( @@ -539,7 +562,8 @@ void testVehicleWithNullVehicleType() { VehicleUpdateFilter filter = new VehicleUpdateFilter( filterParams, bbox, - CODESPACE_RESOLVER + CODESPACE_RESOLVER, + null ); // Create a vehicle update with null vehicle type diff --git a/src/test/java/org/entur/lamassu/graphql/subscription/handler/VehicleSubscriptionHandlerTest.java b/src/test/java/org/entur/lamassu/graphql/subscription/handler/VehicleSubscriptionHandlerTest.java index 19a3e461..ce360a1a 100644 --- a/src/test/java/org/entur/lamassu/graphql/subscription/handler/VehicleSubscriptionHandlerTest.java +++ b/src/test/java/org/entur/lamassu/graphql/subscription/handler/VehicleSubscriptionHandlerTest.java @@ -93,6 +93,7 @@ void testGetPublisherWithRangeFilter() { null, null, false, + false, false ); @@ -151,6 +152,7 @@ void testGetPublisherWithBoundingBoxFilter() { null, null, false, + false, false ); @@ -213,6 +215,7 @@ void testEntityListenerEvents() { null, null, false, + false, false ); @@ -283,6 +286,7 @@ void testEntityUpdateAndDeleteEvents() { null, null, false, + false, false ); @@ -393,6 +397,7 @@ void testBufferingAndBackpressure() { null, null, false, + false, false ); @@ -455,6 +460,7 @@ void testLargeDatasetHandling() { null, null, false, + false, false ); diff --git a/src/test/java/org/entur/lamassu/leader/entityupdater/StationsUpdaterTest.java b/src/test/java/org/entur/lamassu/leader/entityupdater/StationsUpdaterTest.java index a57f6bc8..114c42e6 100644 --- a/src/test/java/org/entur/lamassu/leader/entityupdater/StationsUpdaterTest.java +++ b/src/test/java/org/entur/lamassu/leader/entityupdater/StationsUpdaterTest.java @@ -68,7 +68,8 @@ void setUp() { RentalUrisMapper rentalUrisMapper = new RentalUrisMapper(); stationMapper = new StationMapper(translationMapper, rentalUrisMapper); - spatialIndexIdGeneratorService = new SpatialIndexIdGeneratorService(vehicleTypeCache); + spatialIndexIdGeneratorService = + new SpatialIndexIdGeneratorService(vehicleTypeCache, stationCache); stationsUpdater = new StationsUpdater( stationCache, diff --git a/src/test/java/org/entur/lamassu/leader/entityupdater/VehiclesUpdaterTest.java b/src/test/java/org/entur/lamassu/leader/entityupdater/VehiclesUpdaterTest.java index 51c6597b..b0423213 100644 --- a/src/test/java/org/entur/lamassu/leader/entityupdater/VehiclesUpdaterTest.java +++ b/src/test/java/org/entur/lamassu/leader/entityupdater/VehiclesUpdaterTest.java @@ -72,7 +72,8 @@ void setUp() { vehicleMapper = new VehicleMapper(rentalUrisMapper); // Initialize real services - spatialIndexIdGeneratorService = new SpatialIndexIdGeneratorService(vehicleTypeCache); + spatialIndexIdGeneratorService = + new SpatialIndexIdGeneratorService(vehicleTypeCache, stationCache); vehiclesUpdater = new VehiclesUpdater( diff --git a/src/test/java/org/entur/lamassu/util/SpatialIndexIdFilterTest.java b/src/test/java/org/entur/lamassu/util/SpatialIndexIdFilterTest.java index a609bd91..1677f2eb 100644 --- a/src/test/java/org/entur/lamassu/util/SpatialIndexIdFilterTest.java +++ b/src/test/java/org/entur/lamassu/util/SpatialIndexIdFilterTest.java @@ -120,6 +120,29 @@ public void testIncludeDisabledFilter() { Assert.assertFalse(SpatialIndexIdFilter.filterVehicle(testId, params)); } + @Test + public void testIncludeVehiclesAtNonVirtualStationsFilter() { + var testId = aVehicleId(); + testId.setAtNonVirtualStation(true); + var params = aVehicleFilterParams(); + + params.setIncludeVehiclesAtNonVirtualStations(true); + Assert.assertTrue(SpatialIndexIdFilter.filterVehicle(testId, params)); + + params.setIncludeVehiclesAtNonVirtualStations(false); + Assert.assertFalse(SpatialIndexIdFilter.filterVehicle(testId, params)); + } + + @Test + public void testVehicleNotAtNonVirtualStationPassesFilter() { + var testId = aVehicleId(); + testId.setAtNonVirtualStation(false); + var params = aVehicleFilterParams(); + + params.setIncludeVehiclesAtNonVirtualStations(false); + Assert.assertTrue(SpatialIndexIdFilter.filterVehicle(testId, params)); + } + @Test public void testVehicleTypesAvailableFilter() { var testId = aStationId(); @@ -208,7 +231,17 @@ private FeedProvider aProvider() { } private VehicleFilterParameters aVehicleFilterParams() { - return new VehicleFilterParameters(null, null, null, null, null, null, false, false); + return new VehicleFilterParameters( + null, + null, + null, + null, + null, + null, + false, + false, + false + ); } private StationFilterParameters aStationFilterParams() { diff --git a/src/test/java/org/entur/lamassu/util/TestSpatialIndexBuilder.java b/src/test/java/org/entur/lamassu/util/TestSpatialIndexBuilder.java index f167d879..4c086578 100644 --- a/src/test/java/org/entur/lamassu/util/TestSpatialIndexBuilder.java +++ b/src/test/java/org/entur/lamassu/util/TestSpatialIndexBuilder.java @@ -28,6 +28,7 @@ public static VehicleSpatialIndexId createVehicleIndexId( id.setPropulsionType(vehicle.getVehicleType().getPropulsionType()); id.setReserved(vehicle.getReserved()); id.setDisabled(vehicle.getDisabled()); + id.setAtNonVirtualStation(false); return id; }