Skip to content

Commit a0b9880

Browse files
committed
Move firstSearchLatestItineraryDeparture logic into PageCursorFactory.
1 parent 24b48ad commit a0b9880

3 files changed

Lines changed: 46 additions & 35 deletions

File tree

application/src/main/java/org/opentripplanner/model/plan/paging/cursor/PageCursorFactory.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55

66
import java.time.Duration;
77
import java.time.Instant;
8+
import java.util.List;
89
import javax.annotation.Nullable;
10+
import org.opentripplanner.model.plan.Itinerary;
911
import org.opentripplanner.model.plan.ItinerarySortKey;
1012
import org.opentripplanner.model.plan.SortOrder;
1113
import org.opentripplanner.utils.tostring.ToStringBuilder;
@@ -50,7 +52,8 @@ public PageCursorFactory withOriginalSearch(
5052
@Nullable PageType pageType,
5153
Instant edt,
5254
Instant lat,
53-
Duration searchWindow
55+
Duration searchWindow,
56+
List<Itinerary> itineraries
5457
) {
5558
this.currentPageType = pageType == null
5659
? resolvePageTypeForTheFirstSearch(sortOrder)
@@ -59,6 +62,11 @@ public PageCursorFactory withOriginalSearch(
5962
this.currentEdt = edt;
6063
this.currentLat = lat;
6164
this.currentSearchWindow = searchWindow;
65+
this.firstSearchLatestItineraryDeparture = resolveFirstSearchLatestItineraryDeparture(
66+
pageType,
67+
itineraries,
68+
edt
69+
);
6270
return this;
6371
}
6472

@@ -125,10 +133,29 @@ public String toString() {
125133
* ascending, and to PREVIOUS if descending. We do this because the logic for the first search is
126134
* equivalent when creating new cursors.
127135
*/
128-
public static PageType resolvePageTypeForTheFirstSearch(SortOrder sortOrder) {
136+
private static PageType resolvePageTypeForTheFirstSearch(SortOrder sortOrder) {
129137
return sortOrder.isSortedByAscendingArrivalTime() ? NEXT_PAGE : PREVIOUS_PAGE;
130138
}
131139

140+
/**
141+
* If the first search is an arrive by search, store the latest itinerary's start time
142+
* to allow setting cursor information correctly for the page cursor of the next page.
143+
*/
144+
private Instant resolveFirstSearchLatestItineraryDeparture(
145+
@Nullable PageType pageType,
146+
List<Itinerary> itineraries,
147+
Instant edt
148+
) {
149+
if (pageType == null && resolvePageTypeForTheFirstSearch(sortOrder) == PREVIOUS_PAGE) {
150+
if (itineraries.size() > 0) {
151+
return itineraries.get(0).startTimeAsInstant();
152+
} else {
153+
return edt;
154+
}
155+
}
156+
return null;
157+
}
158+
132159
/** Create page cursor pair (next and previous) */
133160
private void createPageCursors() {
134161
if (currentEdt == null || nextCursor != null || prevCursor != null) {

application/src/main/java/org/opentripplanner/service/paging/PagingService.java

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package org.opentripplanner.service.paging;
22

3-
import static org.opentripplanner.model.plan.paging.cursor.PageType.PREVIOUS_PAGE;
4-
53
import java.time.Duration;
64
import java.time.Instant;
75
import java.util.List;
@@ -183,36 +181,16 @@ private PageCursorFactory mapIntoPageCursorFactory(@Nullable PageType currentPag
183181
currentPageType,
184182
earliestDepartureTime,
185183
latestArrivalTime,
186-
searchWindowUsed
184+
searchWindowUsed,
185+
itineraries
187186
);
188187

189-
handleFirstSearch(currentPageType, factory);
190-
191188
if (pageCursorInput != null) {
192189
factory = factory.withRemovedItineraries(pageCursorInput);
193190
}
194191
return factory;
195192
}
196193

197-
/**
198-
* If the first search is an arrive by search, add the latest itinerary's start time
199-
* to allow setting cursor information correctly for the page cursor of the next page.
200-
*/
201-
private void handleFirstSearch(@Nullable PageType currentPageType, PageCursorFactory factory) {
202-
if (
203-
currentPageType == null &&
204-
PageCursorFactory.resolvePageTypeForTheFirstSearch(itinerariesSortOrder) == PREVIOUS_PAGE
205-
) {
206-
if (itineraries.size() > 0) {
207-
factory = factory.withFirstSearchLatestItineraryDeparture(
208-
itineraries.get(0).startTimeAsInstant()
209-
);
210-
} else {
211-
factory = factory.withFirstSearchLatestItineraryDeparture(earliestDepartureTime);
212-
}
213-
}
214-
}
215-
216194
private void assertRequestPrerequisites() {
217195
if (noSuccessfulTransitSearchPerformed()) {
218196
throw new IllegalStateException("SearchWindow not set");

application/src/test/java/org/opentripplanner/model/plan/paging/cursor/PageCursorFactoryTest.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import java.time.Duration;
1111
import java.time.Instant;
12+
import java.util.List;
1213
import org.junit.jupiter.api.Test;
1314
import org.opentripplanner.model.plan.Itinerary;
1415
import org.opentripplanner.model.plan.ItinerarySortKey;
@@ -26,6 +27,7 @@ class PageCursorFactoryTest implements PlanTestConstants {
2627
private static final Instant T10_30 = time("10:30");
2728
private static final Instant T11_01 = time("11:01");
2829
private static final Instant T12_00 = time("12:00");
30+
private static final Instant T12_01 = time("12:01");
2931
private static final Instant T12_10 = time("12:10");
3032
private static final Instant T12_30 = time("12:30");
3133
private static final Instant T13_00 = time("13:00");
@@ -37,7 +39,8 @@ public void sortArrivalAscending() {
3739
null,
3840
T12_00,
3941
null,
40-
D1H
42+
D1H,
43+
List.of()
4144
);
4245

4346
var nextPage = factory.nextPageCursor();
@@ -50,7 +53,7 @@ public void sortArrivalAscending() {
5053
@Test
5154
public void sortArrivalAscendingCropSearchWindow() {
5255
var factory = new PageCursorFactory(STREET_AND_ARRIVAL_TIME, D90M)
53-
.withOriginalSearch(NEXT_PAGE, T12_00, null, D1H)
56+
.withOriginalSearch(NEXT_PAGE, T12_00, null, D1H, List.of())
5457
.withRemovedItineraries(
5558
new TestPageCursorInput(
5659
newItinerary(A).bus(55, timeAsSeconds(T12_00), timeAsSeconds(T12_10), B).build(),
@@ -71,7 +74,8 @@ public void sortArrivalAscendingPreviousPage() {
7174
PREVIOUS_PAGE,
7275
T12_00,
7376
null,
74-
D1H
77+
D1H,
78+
List.of()
7579
);
7680

7781
var nextPage = factory.nextPageCursor();
@@ -84,7 +88,7 @@ public void sortArrivalAscendingPreviousPage() {
8488
@Test
8589
public void sortArrivalAscendingCropSearchWindowPreviousPage() {
8690
var factory = new PageCursorFactory(STREET_AND_ARRIVAL_TIME, D90M)
87-
.withOriginalSearch(PREVIOUS_PAGE, T12_00, null, D1H)
91+
.withOriginalSearch(PREVIOUS_PAGE, T12_00, null, D1H, List.of())
8892
.withRemovedItineraries(
8993
new TestPageCursorInput(
9094
newItinerary(A).bus(55, timeAsSeconds(T12_00), timeAsSeconds(T12_10), B).build(),
@@ -105,11 +109,12 @@ public void sortDepartureDescending() {
105109
null,
106110
T12_00,
107111
T13_30,
108-
D1H
112+
D1H,
113+
List.of()
109114
);
110115

111116
var nextPage = factory.nextPageCursor();
112-
assertPageCursor(nextPage, T13_00, null, D90M, NEXT_PAGE, false);
117+
assertPageCursor(nextPage, T12_01, null, D90M, NEXT_PAGE, false);
113118

114119
var prevPage = factory.previousPageCursor();
115120
assertPageCursor(prevPage, T10_30, T13_30, D90M, PREVIOUS_PAGE, false);
@@ -118,7 +123,7 @@ public void sortDepartureDescending() {
118123
@Test
119124
public void sortDepartureDescendingCropSearchWindow() {
120125
var factory = new PageCursorFactory(STREET_AND_DEPARTURE_TIME, D90M)
121-
.withOriginalSearch(PREVIOUS_PAGE, T12_00, T13_30, D1H)
126+
.withOriginalSearch(PREVIOUS_PAGE, T12_00, T13_30, D1H, List.of())
122127
.withRemovedItineraries(
123128
new TestPageCursorInput(
124129
newItinerary(A).bus(55, timeAsSeconds(T12_00), timeAsSeconds(T12_30), B).build(),
@@ -139,7 +144,8 @@ public void sortDepartureDescendingNextPage() {
139144
NEXT_PAGE,
140145
T12_00,
141146
T13_30,
142-
D1H
147+
D1H,
148+
List.of()
143149
);
144150

145151
var nextPage = factory.nextPageCursor();
@@ -152,7 +158,7 @@ public void sortDepartureDescendingNextPage() {
152158
@Test
153159
public void sortDepartureDescendingCropSearchWindowNextPage() {
154160
var factory = new PageCursorFactory(STREET_AND_DEPARTURE_TIME, D90M)
155-
.withOriginalSearch(NEXT_PAGE, T12_00, T13_30, D1H)
161+
.withOriginalSearch(NEXT_PAGE, T12_00, T13_30, D1H, List.of())
156162
.withRemovedItineraries(
157163
new TestPageCursorInput(
158164
newItinerary(A).bus(55, timeAsSeconds(T12_00), timeAsSeconds(T12_30), B).build(),

0 commit comments

Comments
 (0)