Skip to content

Commit c91b17e

Browse files
committed
Export regulated timing point information to Jore4 database.
1 parent d276b0b commit c91b17e

File tree

11 files changed

+171
-7
lines changed

11 files changed

+171
-7
lines changed

src/main/java/fi/hsl/jore/importer/feature/batch/route/JourneyPatternStopExportMapper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import fi.hsl.jore.importer.feature.common.converter.IJsonbConverter;
44
import fi.hsl.jore.importer.feature.common.dto.field.MultilingualString;
5+
import fi.hsl.jore.importer.feature.jore3.enumerated.RegulatedTimingPointStatus;
56
import fi.hsl.jore.importer.feature.network.route.dto.ImporterJourneyPatternStop;
67
import org.springframework.jdbc.core.RowMapper;
78

@@ -33,6 +34,9 @@ public ImporterJourneyPatternStop mapRow(final ResultSet resultSet,
3334
resultSet.getString("short_id"),
3435
resultSet.getBoolean("is_used_as_timing_point"),
3536
Optional.ofNullable(resultSet.getString("timing_place_id")),
37+
// should never throw exception because of a database check constraint
38+
RegulatedTimingPointStatus.of(resultSet.getInt("regulated_timing_point_status"))
39+
.orElseThrow(),
3640
resultSet.getBoolean("is_via_point"),
3741
Optional.ofNullable(resultSet.getString("via_names"))
3842
.map(viaNames -> jsonConverter.fromJson(viaNames, MultilingualString.class))

src/main/java/fi/hsl/jore/importer/feature/batch/route/JourneyPatternStopExportProcessor.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package fi.hsl.jore.importer.feature.batch.route;
22

3+
import fi.hsl.jore.importer.feature.jore3.enumerated.RegulatedTimingPointStatus;
34
import fi.hsl.jore.importer.feature.jore4.entity.Jore4JourneyPatternStop;
45
import fi.hsl.jore.importer.feature.network.route.dto.ImporterJourneyPatternStop;
56
import org.slf4j.Logger;
@@ -21,11 +22,15 @@ public Jore4JourneyPatternStop process(final ImporterJourneyPatternStop input) t
2122
LOGGER.debug("Processing journey pattern stop: {}", input);
2223

2324
final boolean isUsedAsTimingPoint = isUsedAsTimingPoint(input);
25+
final boolean isRegulatedTimingPoint = isRegulatedTimingPoint(input, isUsedAsTimingPoint);
26+
final boolean isLoadingTimeAllowed = isLoadingTimeAllowed(input, isUsedAsTimingPoint);
2427

2528
return Jore4JourneyPatternStop.of(input.journeyPatternJore4Id(),
2629
input.orderNumber(),
2730
input.scheduledStopPointJore4Label(),
2831
isUsedAsTimingPoint,
32+
isRegulatedTimingPoint,
33+
isLoadingTimeAllowed,
2934
input.isViaPoint(),
3035
input.viaPointNames()
3136
);
@@ -50,4 +55,29 @@ private static boolean isUsedAsTimingPoint(final ImporterJourneyPatternStop stop
5055

5156
return false;
5257
}
58+
59+
private static boolean isRegulatedTimingPoint(final ImporterJourneyPatternStop stop,
60+
final boolean isUsedAsTimingPoint) {
61+
62+
if (stop.regulatedTimingPointStatus().isRegulatedTimingPoint()) {
63+
if (isUsedAsTimingPoint) {
64+
return true;
65+
} else {
66+
LOGGER.warn(
67+
"Jore3 route direction {}: route point {}: stop point marked as a regulated timing point, but "
68+
+ "at the same time it is not used as a timing point => discarding regulated timing "
69+
+ "point status",
70+
stop.routeDirectionJore3Id(),
71+
stop.orderNumber());
72+
}
73+
}
74+
75+
return false;
76+
}
77+
78+
private static boolean isLoadingTimeAllowed(final ImporterJourneyPatternStop stop,
79+
final boolean isUsedAsTimingPoint) {
80+
81+
return isUsedAsTimingPoint && stop.regulatedTimingPointStatus() == RegulatedTimingPointStatus.YES_LOAD_TIME;
82+
}
5383
}

src/main/java/fi/hsl/jore/importer/feature/jore3/enumerated/RegulatedTimingPointStatus.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ public String getDescription() {
3535
return description;
3636
}
3737

38+
public boolean isRegulatedTimingPoint() {
39+
return this == YES || this == YES_LOAD_TIME;
40+
}
41+
3842
public static Optional<RegulatedTimingPointStatus> of(final int i) {
3943
return Arrays.stream(values())
4044
.filter(transportType -> transportType.value == i)

src/main/java/fi/hsl/jore/importer/feature/jore4/entity/Jore4JourneyPatternStop.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ public interface Jore4JourneyPatternStop {
2121

2222
boolean isUsedAsTimingPoint();
2323

24+
boolean isRegulatedTimingPoint();
25+
26+
boolean isLoadingTimeAllowed();
27+
2428
boolean isViaPoint();
2529

2630
Optional<MultilingualString> viaPointNames();
@@ -29,6 +33,8 @@ static Jore4JourneyPatternStop of(final UUID journeyPatternId,
2933
final int scheduledStopPointSequence,
3034
final String scheduledStopPointLabel,
3135
final boolean isUsedAsTimingPoint,
36+
final boolean isRegulatedTimingPoint,
37+
final boolean isLoadingTimeAllowed,
3238
final boolean isViaPoint,
3339
final Optional<MultilingualString> viaPointNames) {
3440

@@ -38,6 +44,8 @@ static Jore4JourneyPatternStop of(final UUID journeyPatternId,
3844
.scheduledStopPointSequence(scheduledStopPointSequence)
3945
.scheduledStopPointLabel(scheduledStopPointLabel)
4046
.isUsedAsTimingPoint(isUsedAsTimingPoint)
47+
.isRegulatedTimingPoint(isRegulatedTimingPoint)
48+
.isLoadingTimeAllowed(isLoadingTimeAllowed)
4149
.isViaPoint(isViaPoint)
4250
.viaPointNames(viaPointNames)
4351
.build();

src/main/java/fi/hsl/jore/importer/feature/jore4/repository/Jore4JourneyPatternStopRepository.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,21 @@ public void insert(final List<? extends Jore4JourneyPatternStop> journeyPatternS
3737
SCHEDULED_STOP_POINT_IN_JOURNEY_PATTERN.SCHEDULED_STOP_POINT_LABEL,
3838
SCHEDULED_STOP_POINT_IN_JOURNEY_PATTERN.SCHEDULED_STOP_POINT_SEQUENCE,
3939
SCHEDULED_STOP_POINT_IN_JOURNEY_PATTERN.IS_USED_AS_TIMING_POINT,
40+
SCHEDULED_STOP_POINT_IN_JOURNEY_PATTERN.IS_REGULATED_TIMING_POINT,
41+
SCHEDULED_STOP_POINT_IN_JOURNEY_PATTERN.IS_LOADING_TIME_ALLOWED,
4042
SCHEDULED_STOP_POINT_IN_JOURNEY_PATTERN.IS_VIA_POINT,
4143
SCHEDULED_STOP_POINT_IN_JOURNEY_PATTERN.VIA_POINT_NAME_I18N,
4244
SCHEDULED_STOP_POINT_IN_JOURNEY_PATTERN.VIA_POINT_SHORT_NAME_I18N
43-
).values((UUID) null, null, null, null, null, null, null)
45+
).values((UUID) null, null, null, null, null, null, null, null, null)
4446
);
4547

4648
journeyPatternStops.forEach(journeyPatternStop -> batch.bind(
4749
journeyPatternStop.journeyPatternId(),
4850
journeyPatternStop.scheduledStopPointLabel(),
4951
journeyPatternStop.scheduledStopPointSequence(),
5052
journeyPatternStop.isUsedAsTimingPoint(),
53+
journeyPatternStop.isRegulatedTimingPoint(),
54+
journeyPatternStop.isLoadingTimeAllowed(),
5155
journeyPatternStop.isViaPoint(),
5256
// Use the existing via name for both normal and short names
5357
journeyPatternStop.viaPointNames().map(jsonbConverter::asJson).orElse(null),

src/main/java/fi/hsl/jore/importer/feature/network/route/dto/ImporterJourneyPatternStop.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package fi.hsl.jore.importer.feature.network.route.dto;
22

33
import fi.hsl.jore.importer.feature.common.dto.field.MultilingualString;
4+
import fi.hsl.jore.importer.feature.jore3.enumerated.RegulatedTimingPointStatus;
45
import org.immutables.value.Value;
56

67
import java.util.Optional;
@@ -25,6 +26,8 @@ public interface ImporterJourneyPatternStop {
2526

2627
Optional<String> timingPlaceId();
2728

29+
RegulatedTimingPointStatus regulatedTimingPointStatus();
30+
2831
boolean isViaPoint();
2932

3033
Optional<MultilingualString> viaPointNames();
@@ -35,6 +38,7 @@ static ImporterJourneyPatternStop of(final UUID journeyPatternJore4Id,
3538
final String scheduledStopPointJore4Label,
3639
final boolean isUsedAsTimingPoint,
3740
final Optional<String> timingPlaceId,
41+
final RegulatedTimingPointStatus regulatedTimingPointStatus,
3842
final boolean isViaPoint,
3943
final Optional<MultilingualString> viaPointNames) {
4044
return ImmutableImporterJourneyPatternStop
@@ -45,6 +49,7 @@ static ImporterJourneyPatternStop of(final UUID journeyPatternJore4Id,
4549
.scheduledStopPointJore4Label(scheduledStopPointJore4Label)
4650
.isUsedAsTimingPoint(isUsedAsTimingPoint)
4751
.timingPlaceId(timingPlaceId)
52+
.regulatedTimingPointStatus(regulatedTimingPointStatus)
4853
.isViaPoint(isViaPoint)
4954
.viaPointNames(viaPointNames)
5055
.build();

src/main/resources/jore4-export/export_stops_of_journey_patterns.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ SELECT rd.journey_pattern_jore4_id AS journey_pattern_jore4_id,
44
ssp.scheduled_stop_point_short_id AS short_id,
55
rsp.network_route_stop_point_hastus_point AS is_used_as_timing_point,
66
ssp.hastus_place_id AS timing_place_id,
7+
rsp.network_route_stop_point_regulated_timing_point_status AS regulated_timing_point_status,
78
rsp.network_route_stop_point_via_point AS is_via_point,
89
rsp.network_route_stop_point_via_name AS via_names
910
FROM network.network_route_directions rd

src/test/java/fi/hsl/jore/importer/feature/batch/route/JourneyPatternStopExportProcessorTest.java

Lines changed: 75 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package fi.hsl.jore.importer.feature.batch.route;
22

33
import fi.hsl.jore.importer.feature.common.dto.field.MultilingualString;
4+
import fi.hsl.jore.importer.feature.jore3.enumerated.RegulatedTimingPointStatus;
45
import fi.hsl.jore.importer.feature.jore3.util.JoreLocaleUtil;
56
import fi.hsl.jore.importer.feature.jore4.entity.Jore4JourneyPatternStop;
67
import fi.hsl.jore.importer.feature.network.route.dto.ImporterJourneyPatternStop;
78
import org.junit.jupiter.api.DisplayName;
9+
import org.junit.jupiter.api.Nested;
810
import org.junit.jupiter.api.Test;
911

1012
import java.util.Locale;
@@ -22,6 +24,7 @@ class JourneyPatternStopExportProcessorTest {
2224
private static final String SCHEDULED_STOP_POINT_LABEL = "stop1";
2325
private static final boolean IS_USED_AS_TIMING_POINT = true;
2426
private static final String TIMING_PLACE_ID = "1ELIEL";
27+
private static final RegulatedTimingPointStatus REGULATED_TIMING_POINT_STATUS = RegulatedTimingPointStatus.YES_LOAD_TIME;
2528
private static final boolean IS_VIA_POINT = true;
2629
private static final Map<Locale, String> VIA_POINT_NAME_MAP = Map.of(
2730
JoreLocaleUtil.FINNISH, "ViaSuomi",
@@ -36,6 +39,7 @@ class JourneyPatternStopExportProcessorTest {
3639
SCHEDULED_STOP_POINT_LABEL,
3740
IS_USED_AS_TIMING_POINT,
3841
Optional.of(TIMING_PLACE_ID),
42+
REGULATED_TIMING_POINT_STATUS,
3943
IS_VIA_POINT,
4044
VIA_POINT_NAMES
4145
);
@@ -70,6 +74,20 @@ void shouldReturnJourneyPatternStopWithCorrectIsUsedAsTimingPointInformation() t
7074
assertThat(output.isUsedAsTimingPoint()).isEqualTo(IS_USED_AS_TIMING_POINT);
7175
}
7276

77+
@Test
78+
@DisplayName("Should return a journey pattern stop with the correct is-regulated-timing-point information")
79+
void shouldReturnJourneyPatternStopWithCorrectIsRegulatedTimingPointInformation() throws Exception {
80+
final Jore4JourneyPatternStop output = processor.process(DEFAULT_INPUT);
81+
assertThat(output.isRegulatedTimingPoint()).isEqualTo(true);
82+
}
83+
84+
@Test
85+
@DisplayName("Should return a journey pattern stop with the correct is-loading-time-allowed information")
86+
void shouldReturnJourneyPatternStopWithCorrectIsLoadingTimeAllowedInformation() throws Exception {
87+
final Jore4JourneyPatternStop output = processor.process(DEFAULT_INPUT);
88+
assertThat(output.isLoadingTimeAllowed()).isEqualTo(true);
89+
}
90+
7391
@Test
7492
@DisplayName("Should return a journey pattern stop with the correct is-via-point information")
7593
void shouldReturnJourneyPatternStopWithCorrectIsViaPointInformation() throws Exception {
@@ -88,21 +106,72 @@ void shouldReturnJourneyPatternStopWithCorrectViaPointNames() throws Exception {
88106
assertThat(swedishName).isEqualTo(VIA_POINT_NAME_MAP.get(JoreLocaleUtil.SWEDISH));
89107
}
90108

91-
@Test
92-
@DisplayName("When used as timing point and timing place ID absent")
93-
void whenUsedAsTimingPointAndTimingPlaceIdAbsent() throws Exception {
94-
final ImporterJourneyPatternStop INPUT = ImporterJourneyPatternStop.of(
109+
@Nested
110+
@DisplayName("When timing place ID absent")
111+
class WhenTimingPlaceIdAbsent {
112+
113+
private final ImporterJourneyPatternStop INPUT = ImporterJourneyPatternStop.of(
95114
JOURNEY_PATTERN_JORE4_ID,
96115
ROUTE_DIRECTION_JORE3_ID,
97116
ORDER_NUMBER,
98117
SCHEDULED_STOP_POINT_LABEL,
99118
true, // isUsedAsTimingPoint
100119
Optional.empty(), // timing place ID absent
120+
RegulatedTimingPointStatus.YES_LOAD_TIME,
121+
false,
122+
Optional.empty()
123+
);
124+
125+
@Test
126+
@DisplayName("is-used-as-timing-point should not be set")
127+
void isUsedAsTimingPointShouldNotBeSet() throws Exception {
128+
final Jore4JourneyPatternStop output = processor.process(INPUT);
129+
assertThat(output.isUsedAsTimingPoint()).isEqualTo(false);
130+
}
131+
132+
@Test
133+
@DisplayName("is-regulated-timing-point should not be set")
134+
void isRegulatedTimingPointShouldNotBeSet() throws Exception {
135+
final Jore4JourneyPatternStop output = processor.process(INPUT);
136+
assertThat(output.isRegulatedTimingPoint()).isEqualTo(false);
137+
}
138+
139+
@Test
140+
@DisplayName("is-loading-time-allowed should not be set")
141+
void isLoadingTimeAllowedShouldNotBeSet() throws Exception {
142+
final Jore4JourneyPatternStop output = processor.process(INPUT);
143+
assertThat(output.isLoadingTimeAllowed()).isEqualTo(false);
144+
}
145+
}
146+
147+
@Nested
148+
@DisplayName("When not used as timing point")
149+
class WhenNotUsedAsTimingPoint {
150+
151+
private final ImporterJourneyPatternStop INPUT = ImporterJourneyPatternStop.of(
152+
JOURNEY_PATTERN_JORE4_ID,
153+
ROUTE_DIRECTION_JORE3_ID,
154+
ORDER_NUMBER,
155+
SCHEDULED_STOP_POINT_LABEL,
156+
false, // isUsedAsTimingPoint
157+
Optional.of(TIMING_PLACE_ID), // timing place ID is present
158+
RegulatedTimingPointStatus.YES_LOAD_TIME,
101159
false,
102160
Optional.empty()
103161
);
104162

105-
final Jore4JourneyPatternStop output = processor.process(INPUT);
106-
assertThat(output.isUsedAsTimingPoint()).isEqualTo(false);
163+
@Test
164+
@DisplayName("is-regulated-timing-point should not be set")
165+
void isRegulatedTimingPointShouldNotBeSet() throws Exception {
166+
final Jore4JourneyPatternStop output = processor.process(INPUT);
167+
assertThat(output.isRegulatedTimingPoint()).isEqualTo(false);
168+
}
169+
170+
@Test
171+
@DisplayName("is-loading-time-allowed should not be set")
172+
void isLoadingTimeAllowedShouldNotBeSet() throws Exception {
173+
final Jore4JourneyPatternStop output = processor.process(INPUT);
174+
assertThat(output.isLoadingTimeAllowed()).isEqualTo(false);
175+
}
107176
}
108177
}

src/test/java/fi/hsl/jore/importer/feature/batch/route/JourneyPatternStopExportReaderTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package fi.hsl.jore.importer.feature.batch.route;
22

33
import fi.hsl.jore.importer.IntTest;
4+
import fi.hsl.jore.importer.feature.jore3.enumerated.RegulatedTimingPointStatus;
45
import fi.hsl.jore.importer.feature.jore3.util.JoreLocaleUtil;
56
import fi.hsl.jore.importer.feature.network.route.dto.ImporterJourneyPatternStop;
67
import org.assertj.core.api.SoftAssertions;
@@ -75,13 +76,15 @@ class WhenSourceTableHasOneRouteWithTwoStops {
7576
private static final int FIRST_JOURNEY_PATTERN_STOP_ORDER_NUMBER = 1;
7677
private static final boolean FIRST_JOURNEY_PATTERN_STOP_IS_USED_AS_TIMING_POINT = false;
7778
private static final String FIRST_JOURNEY_PATTERN_STOP_TIMING_PLACE_ID = "1ELIEL";
79+
private final RegulatedTimingPointStatus FIRST_JOURNEY_PATTERN_STOP_REGULATED_TIMING_POINT_STATUS = RegulatedTimingPointStatus.NO;
7880
private static final boolean FIRST_JOURNEY_PATTERN_STOP_IS_VIA_POINT = false;
7981

8082
private final String SECOND_JOURNEY_PATTERN_STOP_JORE4_LABEL = "H4321";
8183
private static final int SECOND_JOURNEY_PATTERN_STOP_ORDER_NUMBER = 2;
8284
private static final boolean SECOND_JOURNEY_PATTERN_STOP_IS_USED_AS_TIMING_POINT = true;
8385
private static final boolean SECOND_JOURNEY_PATTERN_STOP_IS_VIA_POINT = true;
8486
private static final String SECOND_JOURNEY_PATTERN_STOP_TIMING_PLACE_ID = "1KALA";
87+
private final RegulatedTimingPointStatus SECOND_JOURNEY_PATTERN_STOP_REGULATED_TIMING_POINT_STATUS = RegulatedTimingPointStatus.YES_LOAD_TIME;
8588
private final String SECOND_JOURNEY_PATTERN_STOP_VIA_NAME_FINNISH = "ViaSuomi";
8689
private final String SECOND_JOURNEY_PATTERN_STOP_VIA_NAME_SWEDISH = "ViaSverige";
8790

@@ -108,6 +111,9 @@ void firstInvocationOfReadMethodMustReturnInformationOfFirstStop(final SoftAsser
108111
softAssertions.assertThat(first.timingPlaceId())
109112
.as("timingPlaceId")
110113
.contains(FIRST_JOURNEY_PATTERN_STOP_TIMING_PLACE_ID);
114+
softAssertions.assertThat(first.regulatedTimingPointStatus())
115+
.as("regulatedTimingPointStatus")
116+
.isEqualTo(FIRST_JOURNEY_PATTERN_STOP_REGULATED_TIMING_POINT_STATUS);
111117
softAssertions.assertThat(first.isViaPoint())
112118
.as("isViaPoint")
113119
.isEqualTo(FIRST_JOURNEY_PATTERN_STOP_IS_VIA_POINT);
@@ -142,6 +148,9 @@ void secondInvocationOfReadMethodMustReturnInformationOfSecondStop(SoftAssertion
142148
softAssertions.assertThat(second.timingPlaceId())
143149
.as("timingPlaceId")
144150
.contains(SECOND_JOURNEY_PATTERN_STOP_TIMING_PLACE_ID);
151+
softAssertions.assertThat(second.regulatedTimingPointStatus())
152+
.as("regulatedTimingPointStatus")
153+
.isEqualTo(SECOND_JOURNEY_PATTERN_STOP_REGULATED_TIMING_POINT_STATUS);
145154
softAssertions.assertThat(second.isViaPoint())
146155
.as("isViaPoint")
147156
.isEqualTo(SECOND_JOURNEY_PATTERN_STOP_IS_VIA_POINT);

0 commit comments

Comments
 (0)