From 2ae244d70b87516c519afb17df2479c3f0711262 Mon Sep 17 00:00:00 2001 From: Teemu Kalvas Date: Mon, 24 Feb 2025 15:20:20 +0200 Subject: [PATCH 1/9] fix inaccuracy in state reversal which generates rounding errors in creating the reversed path for arriveBy queries --- .../routing/impl/GraphPathFinder.java | 10 +++---- .../street/search/state/State.java | 4 +-- .../street/integration/WalkRoutingTest.java | 26 ++++++++++++++++--- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/application/src/main/java/org/opentripplanner/routing/impl/GraphPathFinder.java b/application/src/main/java/org/opentripplanner/routing/impl/GraphPathFinder.java index d8de0332238..0fe5d4ed95e 100644 --- a/application/src/main/java/org/opentripplanner/routing/impl/GraphPathFinder.java +++ b/application/src/main/java/org/opentripplanner/routing/impl/GraphPathFinder.java @@ -139,7 +139,7 @@ public List> graphPathFinderEntryPoint( Set to ) { OTPRequestTimeoutException.checkForTimeout(); - Instant reqTime = request.dateTime().truncatedTo(ChronoUnit.SECONDS); + Instant reqTime = request.dateTime(); List> paths = getPaths(request, from, to); @@ -151,13 +151,13 @@ public List> graphPathFinderEntryPoint( GraphPath graphPath = gpi.next(); // TODO check, is it possible that arriveBy and time are modifed in-place by the search? if (request.arriveBy()) { - if (graphPath.states.getLast().getTime().isAfter(reqTime)) { - LOG.error("A graph path arrives after the requested time. This implies a bug."); + if (graphPath.states.getLast().getTimeAccurate().isAfter(reqTime)) { + LOG.error("A graph path arrives {} after the requested time {}. This implies a bug.", graphPath.states.getLast().getTimeAccurate(), reqTime); gpi.remove(); } } else { - if (graphPath.states.getFirst().getTime().isBefore(reqTime)) { - LOG.error("A graph path leaves before the requested time. This implies a bug."); + if (graphPath.states.getFirst().getTimeAccurate().isBefore(reqTime)) { + LOG.error("A graph path leaves {} before the requested time {}. This implies a bug.", graphPath.states.getFirst().getTimeAccurate(), reqTime); gpi.remove(); } } diff --git a/application/src/main/java/org/opentripplanner/street/search/state/State.java b/application/src/main/java/org/opentripplanner/street/search/state/State.java index 90336cdaa2a..9b4c50580cf 100644 --- a/application/src/main/java/org/opentripplanner/street/search/state/State.java +++ b/application/src/main/java/org/opentripplanner/street/search/state/State.java @@ -527,7 +527,7 @@ private double getWalkDistanceDelta() { private State reversedClone() { StreetSearchRequest reversedRequest = request - .copyOfReversed(getTime()) + .copyOfReversed(getTimeAccurate()) .withPreferences(p -> { p.withCar(c -> c.withRental(r -> r.withUseAvailabilityInformation(false))); p.withBike(b -> b.withRental(r -> r.withUseAvailabilityInformation(false))); @@ -535,7 +535,7 @@ private State reversedClone() { .build(); StateData newStateData = stateData.clone(); newStateData.backMode = null; - return new State(this.vertex, getTime(), newStateData, reversedRequest); + return new State(this.vertex, getTimeAccurate(), newStateData, reversedRequest); } /** diff --git a/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java b/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java index 6f3f47ba6e6..b4f81410cfd 100644 --- a/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java +++ b/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java @@ -1,9 +1,12 @@ package org.opentripplanner.street.integration; import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.opentripplanner.ConstantsForTests; import org.opentripplanner.TestOtpModel; import org.opentripplanner.astar.model.GraphPath; @@ -45,18 +48,35 @@ class WalkRoutingTest { void shouldRouteAroundRoundabout() { var start = new GenericLocation(59.94646, 10.77511); var end = new GenericLocation(59.94641, 10.77522); - Assertions.assertDoesNotThrow(() -> route(roundabout, start, end)); + Assertions.assertDoesNotThrow(() -> route(roundabout, start, end, dateTime, false)); + } + + @ParameterizedTest + @ValueSource(ints = {0, 200, 400, 499, 500, 501, 600, 700, 800, 900, 999}) + void pathReversalWorks(int offset) { + var start = new GenericLocation(59.94646, 10.77511); + var end = new GenericLocation(59.94641, 10.77522); + var base = dateTime.truncatedTo(ChronoUnit.SECONDS); + var time = base.plusMillis(offset); + var results = route(roundabout, start, end, time, true); + Assertions.assertEquals(1, results.size()); + var states = results.get(0).states; + var diff = ChronoUnit.MILLIS.between(states.getFirst().getTimeAccurate(), states.getLast().getTimeAccurate()); + Assertions.assertEquals(13926, diff); // should be same for every parametrized offset, otherwise irrelevant } private static List> route( Graph graph, GenericLocation from, - GenericLocation to + GenericLocation to, + Instant instant, + boolean arriveBy ) { RouteRequest request = new RouteRequest(); - request.setDateTime(dateTime); + request.setDateTime(instant); request.setFrom(from); request.setTo(to); + request.setArriveBy(arriveBy); request.journey().direct().setMode(StreetMode.WALK); try ( From 55f88051517cf40592342ac1c0718da8361853b6 Mon Sep 17 00:00:00 2001 From: Teemu Kalvas Date: Wed, 26 Feb 2025 12:24:24 +0200 Subject: [PATCH 2/9] change State.reversedClone time handling back, reversed times must change to work with changed arriveBy time rounding logic --- .../router/street/DirectStreetRouter.java | 1 + .../routing/impl/GraphPathFinder.java | 14 +++++++++++--- .../opentripplanner/street/search/state/State.java | 7 +++++-- .../street/integration/WalkRoutingTest.java | 7 +++++-- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/router/street/DirectStreetRouter.java b/application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/router/street/DirectStreetRouter.java index 7d73d705dfe..757dd02bbd8 100644 --- a/application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/router/street/DirectStreetRouter.java +++ b/application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/router/street/DirectStreetRouter.java @@ -57,6 +57,7 @@ public static List route(OtpServerRequestContext serverContext, Route directRequest, temporaryVertices ); + var path = paths.getFirst(); // Convert the internal GraphPaths to itineraries final GraphPathToItineraryMapper graphPathToItineraryMapper = new GraphPathToItineraryMapper( diff --git a/application/src/main/java/org/opentripplanner/routing/impl/GraphPathFinder.java b/application/src/main/java/org/opentripplanner/routing/impl/GraphPathFinder.java index 0fe5d4ed95e..27c597de204 100644 --- a/application/src/main/java/org/opentripplanner/routing/impl/GraphPathFinder.java +++ b/application/src/main/java/org/opentripplanner/routing/impl/GraphPathFinder.java @@ -139,7 +139,7 @@ public List> graphPathFinderEntryPoint( Set to ) { OTPRequestTimeoutException.checkForTimeout(); - Instant reqTime = request.dateTime(); + Instant reqTime = request.dateTime().truncatedTo(ChronoUnit.MILLIS); List> paths = getPaths(request, from, to); @@ -152,12 +152,20 @@ public List> graphPathFinderEntryPoint( // TODO check, is it possible that arriveBy and time are modifed in-place by the search? if (request.arriveBy()) { if (graphPath.states.getLast().getTimeAccurate().isAfter(reqTime)) { - LOG.error("A graph path arrives {} after the requested time {}. This implies a bug.", graphPath.states.getLast().getTimeAccurate(), reqTime); + LOG.error( + "A graph path arrives {} after the requested time {}. This implies a bug.", + graphPath.states.getLast().getTimeAccurate(), + reqTime + ); gpi.remove(); } } else { if (graphPath.states.getFirst().getTimeAccurate().isBefore(reqTime)) { - LOG.error("A graph path leaves {} before the requested time {}. This implies a bug.", graphPath.states.getFirst().getTimeAccurate(), reqTime); + LOG.error( + "A graph path leaves {} before the requested time {}. This implies a bug.", + graphPath.states.getFirst().getTimeAccurate(), + reqTime + ); gpi.remove(); } } diff --git a/application/src/main/java/org/opentripplanner/street/search/state/State.java b/application/src/main/java/org/opentripplanner/street/search/state/State.java index 9b4c50580cf..19ef2ba1f9b 100644 --- a/application/src/main/java/org/opentripplanner/street/search/state/State.java +++ b/application/src/main/java/org/opentripplanner/street/search/state/State.java @@ -526,8 +526,11 @@ private double getWalkDistanceDelta() { } private State reversedClone() { + // these must be getTime(), not getTimeAccurate(), so that the reversed path (which does not + // have arriveBy true anymore) has times which round correctly, as the rounding rules + // depend on arriveBy StreetSearchRequest reversedRequest = request - .copyOfReversed(getTimeAccurate()) + .copyOfReversed(getTime()) .withPreferences(p -> { p.withCar(c -> c.withRental(r -> r.withUseAvailabilityInformation(false))); p.withBike(b -> b.withRental(r -> r.withUseAvailabilityInformation(false))); @@ -535,7 +538,7 @@ private State reversedClone() { .build(); StateData newStateData = stateData.clone(); newStateData.backMode = null; - return new State(this.vertex, getTimeAccurate(), newStateData, reversedRequest); + return new State(this.vertex, getTime(), newStateData, reversedRequest); } /** diff --git a/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java b/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java index b4f81410cfd..950ba427525 100644 --- a/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java +++ b/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java @@ -52,7 +52,7 @@ void shouldRouteAroundRoundabout() { } @ParameterizedTest - @ValueSource(ints = {0, 200, 400, 499, 500, 501, 600, 700, 800, 900, 999}) + @ValueSource(ints = { 0, 200, 400, 499, 500, 501, 600, 700, 800, 900, 999 }) void pathReversalWorks(int offset) { var start = new GenericLocation(59.94646, 10.77511); var end = new GenericLocation(59.94641, 10.77522); @@ -61,7 +61,10 @@ void pathReversalWorks(int offset) { var results = route(roundabout, start, end, time, true); Assertions.assertEquals(1, results.size()); var states = results.get(0).states; - var diff = ChronoUnit.MILLIS.between(states.getFirst().getTimeAccurate(), states.getLast().getTimeAccurate()); + var diff = ChronoUnit.MILLIS.between( + states.getFirst().getTimeAccurate(), + states.getLast().getTimeAccurate() + ); Assertions.assertEquals(13926, diff); // should be same for every parametrized offset, otherwise irrelevant } From e5d070c64270551fc0ea8be5050e3ea3d7f1a0e8 Mon Sep 17 00:00:00 2001 From: Teemu Kalvas Date: Wed, 26 Feb 2025 12:35:18 +0200 Subject: [PATCH 3/9] remove left-behind debug code --- .../raptoradapter/router/street/DirectStreetRouter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/router/street/DirectStreetRouter.java b/application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/router/street/DirectStreetRouter.java index 757dd02bbd8..7d73d705dfe 100644 --- a/application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/router/street/DirectStreetRouter.java +++ b/application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/router/street/DirectStreetRouter.java @@ -57,7 +57,6 @@ public static List route(OtpServerRequestContext serverContext, Route directRequest, temporaryVertices ); - var path = paths.getFirst(); // Convert the internal GraphPaths to itineraries final GraphPathToItineraryMapper graphPathToItineraryMapper = new GraphPathToItineraryMapper( From 6ff83ef4e0730c4053b4b4302e19da800c26a40e Mon Sep 17 00:00:00 2001 From: Teemu Kalvas Date: Thu, 27 Feb 2025 14:06:02 +0200 Subject: [PATCH 4/9] force initial state time to be an exact number of seconds. Force RouteRequest datetime to be an exact number of seconds. Backward and forward searches will now not match unless the request datetime is an exact number of seconds. --- .../opentripplanner/routing/api/request/RouteRequest.java | 3 ++- .../org/opentripplanner/street/search/state/State.java | 8 +++++++- .../street/integration/BarrierRoutingTest.java | 3 ++- .../street/integration/BicycleRoutingTest.java | 3 ++- .../street/integration/CarRoutingTest.java | 3 ++- .../street/integration/WalkRoutingTest.java | 2 +- 6 files changed, 16 insertions(+), 6 deletions(-) diff --git a/application/src/main/java/org/opentripplanner/routing/api/request/RouteRequest.java b/application/src/main/java/org/opentripplanner/routing/api/request/RouteRequest.java index daafe70f9e7..d32b126c311 100644 --- a/application/src/main/java/org/opentripplanner/routing/api/request/RouteRequest.java +++ b/application/src/main/java/org/opentripplanner/routing/api/request/RouteRequest.java @@ -7,6 +7,7 @@ import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -54,7 +55,7 @@ public class RouteRequest implements Cloneable, Serializable { private List via = Collections.emptyList(); - private Instant dateTime = Instant.now(); + private Instant dateTime = Instant.now().truncatedTo(ChronoUnit.SECONDS); @Nullable private Duration maxSearchWindow; diff --git a/application/src/main/java/org/opentripplanner/street/search/state/State.java b/application/src/main/java/org/opentripplanner/street/search/state/State.java index 19ef2ba1f9b..bce2f2c55e5 100644 --- a/application/src/main/java/org/opentripplanner/street/search/state/State.java +++ b/application/src/main/java/org/opentripplanner/street/search/state/State.java @@ -3,6 +3,7 @@ import static org.opentripplanner.utils.lang.ObjectUtils.requireNotInitialized; import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collection; import java.util.Objects; @@ -92,7 +93,12 @@ public static Collection getInitialStates( for (Vertex vertex : vertices) { for (StateData stateData : StateData.getInitialStateDatas(streetSearchRequest)) { states.add( - new State(vertex, streetSearchRequest.startTime(), stateData, streetSearchRequest) + new State( + vertex, + streetSearchRequest.startTime().truncatedTo(ChronoUnit.SECONDS), + stateData, + streetSearchRequest + ) ); } } diff --git a/application/src/test/java/org/opentripplanner/street/integration/BarrierRoutingTest.java b/application/src/test/java/org/opentripplanner/street/integration/BarrierRoutingTest.java index 8092ab62bc3..52dcc771c5d 100644 --- a/application/src/test/java/org/opentripplanner/street/integration/BarrierRoutingTest.java +++ b/application/src/test/java/org/opentripplanner/street/integration/BarrierRoutingTest.java @@ -7,6 +7,7 @@ import static org.opentripplanner.test.support.PolylineAssert.assertThatPolylinesAreEqual; import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.function.Consumer; import java.util.function.Function; @@ -35,7 +36,7 @@ public class BarrierRoutingTest { - private static final Instant dateTime = Instant.now(); + private static final Instant dateTime = Instant.now().truncatedTo(ChronoUnit.SECONDS); private static Graph graph; diff --git a/application/src/test/java/org/opentripplanner/street/integration/BicycleRoutingTest.java b/application/src/test/java/org/opentripplanner/street/integration/BicycleRoutingTest.java index 60dc43aa3f9..301caeda8b2 100644 --- a/application/src/test/java/org/opentripplanner/street/integration/BicycleRoutingTest.java +++ b/application/src/test/java/org/opentripplanner/street/integration/BicycleRoutingTest.java @@ -5,6 +5,7 @@ import static org.opentripplanner.test.support.PolylineAssert.assertThatPolylinesAreEqual; import java.time.Instant; +import java.time.temporal.ChronoUnit; import org.junit.jupiter.api.Test; import org.locationtech.jts.geom.Geometry; import org.opentripplanner.ConstantsForTests; @@ -25,7 +26,7 @@ public class BicycleRoutingTest { - static final Instant dateTime = Instant.now(); + static final Instant dateTime = Instant.now().truncatedTo(ChronoUnit.SECONDS); private final Graph herrenbergGraph; { diff --git a/application/src/test/java/org/opentripplanner/street/integration/CarRoutingTest.java b/application/src/test/java/org/opentripplanner/street/integration/CarRoutingTest.java index caddf972e86..34beead9aed 100644 --- a/application/src/test/java/org/opentripplanner/street/integration/CarRoutingTest.java +++ b/application/src/test/java/org/opentripplanner/street/integration/CarRoutingTest.java @@ -5,6 +5,7 @@ import static org.opentripplanner.test.support.PolylineAssert.assertThatPolylinesAreEqual; import java.time.Instant; +import java.time.temporal.ChronoUnit; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -26,7 +27,7 @@ public class CarRoutingTest { - static final Instant dateTime = Instant.now(); + static final Instant dateTime = Instant.now().truncatedTo(ChronoUnit.SECONDS); private static final ResourceLoader RESOURCE_LOADER = ResourceLoader.of(CarRoutingTest.class); private static Graph herrenbergGraph; diff --git a/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java b/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java index 950ba427525..dcbd69e7778 100644 --- a/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java +++ b/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java @@ -23,7 +23,7 @@ class WalkRoutingTest { - static final Instant dateTime = Instant.now(); + static final Instant dateTime = Instant.now().truncatedTo(ChronoUnit.SECONDS); private final Graph roundabout; { From 3e5333c563793e0f1bf33d932c3026dd1a6081e0 Mon Sep 17 00:00:00 2001 From: Teemu Kalvas Date: Thu, 27 Feb 2025 15:42:43 +0200 Subject: [PATCH 5/9] style fixes from review --- .../street/integration/WalkRoutingTest.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java b/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java index dcbd69e7778..7d9a2277129 100644 --- a/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java +++ b/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java @@ -1,9 +1,11 @@ package org.opentripplanner.street.integration; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.List; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -48,7 +50,7 @@ class WalkRoutingTest { void shouldRouteAroundRoundabout() { var start = new GenericLocation(59.94646, 10.77511); var end = new GenericLocation(59.94641, 10.77522); - Assertions.assertDoesNotThrow(() -> route(roundabout, start, end, dateTime, false)); + assertDoesNotThrow(() -> route(roundabout, start, end, dateTime, false)); } @ParameterizedTest @@ -59,13 +61,14 @@ void pathReversalWorks(int offset) { var base = dateTime.truncatedTo(ChronoUnit.SECONDS); var time = base.plusMillis(offset); var results = route(roundabout, start, end, time, true); - Assertions.assertEquals(1, results.size()); + assertEquals(1, results.size()); var states = results.get(0).states; var diff = ChronoUnit.MILLIS.between( states.getFirst().getTimeAccurate(), states.getLast().getTimeAccurate() ); - Assertions.assertEquals(13926, diff); // should be same for every parametrized offset, otherwise irrelevant + // should be same for every parametrized offset, otherwise irrelevant + assertEquals(13926, diff); } private static List> route( From 5fb2e6b376346e20cecb681e81cd3f9dfc9170e0 Mon Sep 17 00:00:00 2001 From: Teemu Kalvas Date: Thu, 27 Feb 2025 15:54:30 +0200 Subject: [PATCH 6/9] force routerequest datetime to be accurate to one second, no more --- .../opentripplanner/routing/api/request/RouteRequest.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/application/src/main/java/org/opentripplanner/routing/api/request/RouteRequest.java b/application/src/main/java/org/opentripplanner/routing/api/request/RouteRequest.java index d32b126c311..ebf751bc50d 100644 --- a/application/src/main/java/org/opentripplanner/routing/api/request/RouteRequest.java +++ b/application/src/main/java/org/opentripplanner/routing/api/request/RouteRequest.java @@ -153,8 +153,14 @@ public Instant dateTime() { return dateTime; } + /** + * The dateTime will be set to a whole number of seconds. We don't do sub-second accuracy, + * and if we set the millisecond part to a non-zero value, rounding will not be guaranteed + * to be the same for departAt and arriveBy queries. + * @param dateTime Either a departAt time or an arriveBy time, one second's accuracy + */ public void setDateTime(Instant dateTime) { - this.dateTime = dateTime; + this.dateTime = dateTime.truncatedTo(ChronoUnit.SECONDS); } public void setDateTime(String date, String time, ZoneId tz) { From 955867f8ec8e9a758a97c068f2c266bfb9655891 Mon Sep 17 00:00:00 2001 From: Teemu Kalvas Date: Thu, 27 Feb 2025 17:36:32 +0200 Subject: [PATCH 7/9] cleanup based on review --- .../street/search/request/StreetSearchRequest.java | 5 +++-- .../org/opentripplanner/street/search/state/State.java | 7 +------ .../street/integration/BarrierRoutingTest.java | 2 +- .../street/integration/BicycleRoutingTest.java | 2 +- .../opentripplanner/street/integration/CarRoutingTest.java | 2 +- .../street/integration/WalkRoutingTest.java | 2 +- 6 files changed, 8 insertions(+), 12 deletions(-) diff --git a/application/src/main/java/org/opentripplanner/street/search/request/StreetSearchRequest.java b/application/src/main/java/org/opentripplanner/street/search/request/StreetSearchRequest.java index c93ea598256..7aa8b74352c 100644 --- a/application/src/main/java/org/opentripplanner/street/search/request/StreetSearchRequest.java +++ b/application/src/main/java/org/opentripplanner/street/search/request/StreetSearchRequest.java @@ -1,6 +1,7 @@ package org.opentripplanner.street.search.request; import java.time.Instant; +import java.time.temporal.ChronoUnit; import javax.annotation.Nullable; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Envelope; @@ -52,7 +53,7 @@ public class StreetSearchRequest implements AStarRequest { * Constructor only used for creating a default instance. */ private StreetSearchRequest() { - this.startTime = Instant.now(); + this.startTime = Instant.now().truncatedTo(ChronoUnit.SECONDS); this.preferences = new RoutingPreferences(); this.mode = StreetMode.WALK; this.arriveBy = false; @@ -64,7 +65,7 @@ private StreetSearchRequest() { } StreetSearchRequest(StreetSearchRequestBuilder builder) { - this.startTime = builder.startTime; + this.startTime = builder.startTime.truncatedTo(ChronoUnit.SECONDS); this.preferences = builder.preferences; this.mode = builder.mode; this.arriveBy = builder.arriveBy; diff --git a/application/src/main/java/org/opentripplanner/street/search/state/State.java b/application/src/main/java/org/opentripplanner/street/search/state/State.java index bce2f2c55e5..96960f5c5f5 100644 --- a/application/src/main/java/org/opentripplanner/street/search/state/State.java +++ b/application/src/main/java/org/opentripplanner/street/search/state/State.java @@ -93,12 +93,7 @@ public static Collection getInitialStates( for (Vertex vertex : vertices) { for (StateData stateData : StateData.getInitialStateDatas(streetSearchRequest)) { states.add( - new State( - vertex, - streetSearchRequest.startTime().truncatedTo(ChronoUnit.SECONDS), - stateData, - streetSearchRequest - ) + new State(vertex, streetSearchRequest.startTime(), stateData, streetSearchRequest) ); } } diff --git a/application/src/test/java/org/opentripplanner/street/integration/BarrierRoutingTest.java b/application/src/test/java/org/opentripplanner/street/integration/BarrierRoutingTest.java index 52dcc771c5d..944903188f0 100644 --- a/application/src/test/java/org/opentripplanner/street/integration/BarrierRoutingTest.java +++ b/application/src/test/java/org/opentripplanner/street/integration/BarrierRoutingTest.java @@ -36,7 +36,7 @@ public class BarrierRoutingTest { - private static final Instant dateTime = Instant.now().truncatedTo(ChronoUnit.SECONDS); + private static final Instant dateTime = Instant.now(); private static Graph graph; diff --git a/application/src/test/java/org/opentripplanner/street/integration/BicycleRoutingTest.java b/application/src/test/java/org/opentripplanner/street/integration/BicycleRoutingTest.java index 301caeda8b2..73b0cbf3fdd 100644 --- a/application/src/test/java/org/opentripplanner/street/integration/BicycleRoutingTest.java +++ b/application/src/test/java/org/opentripplanner/street/integration/BicycleRoutingTest.java @@ -26,7 +26,7 @@ public class BicycleRoutingTest { - static final Instant dateTime = Instant.now().truncatedTo(ChronoUnit.SECONDS); + static final Instant dateTime = Instant.now(); private final Graph herrenbergGraph; { diff --git a/application/src/test/java/org/opentripplanner/street/integration/CarRoutingTest.java b/application/src/test/java/org/opentripplanner/street/integration/CarRoutingTest.java index 34beead9aed..76e42b50c0e 100644 --- a/application/src/test/java/org/opentripplanner/street/integration/CarRoutingTest.java +++ b/application/src/test/java/org/opentripplanner/street/integration/CarRoutingTest.java @@ -27,7 +27,7 @@ public class CarRoutingTest { - static final Instant dateTime = Instant.now().truncatedTo(ChronoUnit.SECONDS); + static final Instant dateTime = Instant.now(); private static final ResourceLoader RESOURCE_LOADER = ResourceLoader.of(CarRoutingTest.class); private static Graph herrenbergGraph; diff --git a/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java b/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java index 7d9a2277129..550985152fe 100644 --- a/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java +++ b/application/src/test/java/org/opentripplanner/street/integration/WalkRoutingTest.java @@ -25,7 +25,7 @@ class WalkRoutingTest { - static final Instant dateTime = Instant.now().truncatedTo(ChronoUnit.SECONDS); + static final Instant dateTime = Instant.now(); private final Graph roundabout; { From efaa55ff37e2a88b6c2e44276ac20b1da98c9c8a Mon Sep 17 00:00:00 2001 From: Teemu Kalvas Date: Mon, 3 Mar 2025 10:33:42 +0200 Subject: [PATCH 8/9] this date truncate is no longer necessary --- .../java/org/opentripplanner/routing/impl/GraphPathFinder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/java/org/opentripplanner/routing/impl/GraphPathFinder.java b/application/src/main/java/org/opentripplanner/routing/impl/GraphPathFinder.java index 27c597de204..c481c52efa9 100644 --- a/application/src/main/java/org/opentripplanner/routing/impl/GraphPathFinder.java +++ b/application/src/main/java/org/opentripplanner/routing/impl/GraphPathFinder.java @@ -139,7 +139,7 @@ public List> graphPathFinderEntryPoint( Set to ) { OTPRequestTimeoutException.checkForTimeout(); - Instant reqTime = request.dateTime().truncatedTo(ChronoUnit.MILLIS); + Instant reqTime = request.dateTime(); List> paths = getPaths(request, from, to); From 0240eda7a2af99f073b984bb6901bc1ec63f1916 Mon Sep 17 00:00:00 2001 From: Teemu Kalvas Date: Mon, 3 Mar 2025 10:40:06 +0200 Subject: [PATCH 9/9] removed unnecessary imports --- .../java/org/opentripplanner/routing/impl/GraphPathFinder.java | 1 - .../main/java/org/opentripplanner/street/search/state/State.java | 1 - .../opentripplanner/street/integration/BarrierRoutingTest.java | 1 - .../opentripplanner/street/integration/BicycleRoutingTest.java | 1 - .../org/opentripplanner/street/integration/CarRoutingTest.java | 1 - 5 files changed, 5 deletions(-) diff --git a/application/src/main/java/org/opentripplanner/routing/impl/GraphPathFinder.java b/application/src/main/java/org/opentripplanner/routing/impl/GraphPathFinder.java index c481c52efa9..77264af9212 100644 --- a/application/src/main/java/org/opentripplanner/routing/impl/GraphPathFinder.java +++ b/application/src/main/java/org/opentripplanner/routing/impl/GraphPathFinder.java @@ -1,7 +1,6 @@ package org.opentripplanner.routing.impl; import java.time.Instant; -import java.time.temporal.ChronoUnit; import java.util.Iterator; import java.util.List; import java.util.Set; diff --git a/application/src/main/java/org/opentripplanner/street/search/state/State.java b/application/src/main/java/org/opentripplanner/street/search/state/State.java index 96960f5c5f5..19ef2ba1f9b 100644 --- a/application/src/main/java/org/opentripplanner/street/search/state/State.java +++ b/application/src/main/java/org/opentripplanner/street/search/state/State.java @@ -3,7 +3,6 @@ import static org.opentripplanner.utils.lang.ObjectUtils.requireNotInitialized; import java.time.Instant; -import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collection; import java.util.Objects; diff --git a/application/src/test/java/org/opentripplanner/street/integration/BarrierRoutingTest.java b/application/src/test/java/org/opentripplanner/street/integration/BarrierRoutingTest.java index 944903188f0..8092ab62bc3 100644 --- a/application/src/test/java/org/opentripplanner/street/integration/BarrierRoutingTest.java +++ b/application/src/test/java/org/opentripplanner/street/integration/BarrierRoutingTest.java @@ -7,7 +7,6 @@ import static org.opentripplanner.test.support.PolylineAssert.assertThatPolylinesAreEqual; import java.time.Instant; -import java.time.temporal.ChronoUnit; import java.util.List; import java.util.function.Consumer; import java.util.function.Function; diff --git a/application/src/test/java/org/opentripplanner/street/integration/BicycleRoutingTest.java b/application/src/test/java/org/opentripplanner/street/integration/BicycleRoutingTest.java index 73b0cbf3fdd..60dc43aa3f9 100644 --- a/application/src/test/java/org/opentripplanner/street/integration/BicycleRoutingTest.java +++ b/application/src/test/java/org/opentripplanner/street/integration/BicycleRoutingTest.java @@ -5,7 +5,6 @@ import static org.opentripplanner.test.support.PolylineAssert.assertThatPolylinesAreEqual; import java.time.Instant; -import java.time.temporal.ChronoUnit; import org.junit.jupiter.api.Test; import org.locationtech.jts.geom.Geometry; import org.opentripplanner.ConstantsForTests; diff --git a/application/src/test/java/org/opentripplanner/street/integration/CarRoutingTest.java b/application/src/test/java/org/opentripplanner/street/integration/CarRoutingTest.java index 76e42b50c0e..caddf972e86 100644 --- a/application/src/test/java/org/opentripplanner/street/integration/CarRoutingTest.java +++ b/application/src/test/java/org/opentripplanner/street/integration/CarRoutingTest.java @@ -5,7 +5,6 @@ import static org.opentripplanner.test.support.PolylineAssert.assertThatPolylinesAreEqual; import java.time.Instant; -import java.time.temporal.ChronoUnit; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test;