From d3df8ec4bc41a0e50c4764fd0a30580fe0874fc3 Mon Sep 17 00:00:00 2001 From: msalvatore Date: Tue, 2 Jan 2024 16:56:24 -0500 Subject: [PATCH] Revert "Revert "NYS-168 second attempt at limited out-of-system transfers"" This reverts commit 0e490b5946986d24fe1b4a9d56d72aadadd3ec25. --- .../org/opentripplanner/routing/core/State.java | 11 ++++++----- .../opentripplanner/routing/core/StateEditor.java | 14 ++++++++++++++ .../routing/edgetype/StreetTransitEntityLink.java | 10 ++++++++++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/opentripplanner/routing/core/State.java b/src/main/java/org/opentripplanner/routing/core/State.java index 690c9f136b5..1d931bfd211 100644 --- a/src/main/java/org/opentripplanner/routing/core/State.java +++ b/src/main/java/org/opentripplanner/routing/core/State.java @@ -1,10 +1,8 @@ package org.opentripplanner.routing.core; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.Objects; -import java.util.Set; +import java.util.*; + +import org.opentripplanner.model.Station; import org.opentripplanner.routing.algorithm.astar.NegativeWeightException; import org.opentripplanner.routing.api.request.RoutingRequest; import org.opentripplanner.routing.edgetype.StreetEdge; @@ -40,6 +38,9 @@ public class State implements Cloneable { // we should DEFINITELY rename this variable and the associated methods. public double walkDistance; + // keep track of transit stations entered to prevent out-of-system transfers + public List transitStationList = new ArrayList(); + /* CONSTRUCTORS */ /** diff --git a/src/main/java/org/opentripplanner/routing/core/StateEditor.java b/src/main/java/org/opentripplanner/routing/core/StateEditor.java index 10458669cd1..01aa6c239b3 100644 --- a/src/main/java/org/opentripplanner/routing/core/StateEditor.java +++ b/src/main/java/org/opentripplanner/routing/core/StateEditor.java @@ -1,11 +1,13 @@ package org.opentripplanner.routing.core; +import org.opentripplanner.model.Station; import org.opentripplanner.routing.graph.Edge; import org.opentripplanner.routing.graph.Vertex; import org.opentripplanner.routing.api.request.RoutingRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Collections; import java.util.Set; /** @@ -393,4 +395,16 @@ public void setBikeRentalNetwork(Set networks) { public State getBackState() { return child.getBackState(); } + + // record that station was entered + public void markTransitStation(Station station) { + if (station != null) + child.transitStationList.add(station); + } + + // how many stations have been entered + public Set getTransitStationsEntered() { + return Set.copyOf(child.transitStationList); + } + } diff --git a/src/main/java/org/opentripplanner/routing/edgetype/StreetTransitEntityLink.java b/src/main/java/org/opentripplanner/routing/edgetype/StreetTransitEntityLink.java index d94ac97b373..e3825959746 100644 --- a/src/main/java/org/opentripplanner/routing/edgetype/StreetTransitEntityLink.java +++ b/src/main/java/org/opentripplanner/routing/edgetype/StreetTransitEntityLink.java @@ -138,6 +138,16 @@ else if (s0.isBikeRentingFromStation() && !(s0.mayKeepRentedBicycleAtDestination int streetToStopTime = getStreetToStopTime(); s1.incrementTimeInSeconds(streetToStopTime); s1.incrementWeight(STEL_TRAVERSE_COST + streetToStopTime); + if (this instanceof StreetTransitEntranceLink) { + // if we are entering transit mark it, but allow us to leave! + if (isLeavingStreetNetwork(req)) { + if (s1.getTransitStationsEntered().size() > 1) { + // ban this entrance, we've already taken an entrance + return null; + } + s1.markTransitStation(getTransitEntityVertex().getStationElement().getParentStation()); + } + } return s1.makeState(); }