Skip to content

Commit 36ec367

Browse files
committed
Export timing places to Jore4 database.
1 parent 293217e commit 36ec367

File tree

39 files changed

+909
-36
lines changed

39 files changed

+909
-36
lines changed

docker/docker-compose.custom.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ services:
3232
- jore4
3333

3434
jore4-mapmatching:
35-
image: "hsldevcom/jore4-map-matching:main--20221101-55b0d65292b29db99c9ddaa93de6b422326d2976"
35+
image: "hsldevcom/jore4-map-matching:main--20230314-81b915f44bef9bf57ff707f303a9642fcd4489ce"
3636

3737
jore4-mssqltestdb:
3838
# pin compatible version of mssql schema
@@ -43,6 +43,6 @@ services:
4343

4444
jore4-hasura:
4545
# pin compatible version of jore4 data model
46-
image: "hsldevcom/jore4-hasura:hsl-main--20230202-6029ef3d1c6678fd14c8e4e2296f2d83ce066db1"
46+
image: "hsldevcom/jore4-hasura:hsl-main--20230324-beb6ecbde2b638b79af499e7f18a568d85f1541e"
4747
networks:
4848
jore4:

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,7 @@
474474
| reusable_components.*
475475
| route.*
476476
| service_pattern.*
477+
| timing_pattern.*
477478
</includes>
478479
<excludes>
479480
AUTH_SESSION.*

src/main/java/fi/hsl/jore/importer/config/jobs/JobConfig.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@
5858
import fi.hsl.jore.importer.feature.batch.scheduled_stop_point.ScheduledStopPointImportProcessor;
5959
import fi.hsl.jore.importer.feature.batch.scheduled_stop_point.ScheduledStopPointImportReader;
6060
import fi.hsl.jore.importer.feature.batch.scheduled_stop_point.support.IScheduledStopPointImportRepository;
61+
import fi.hsl.jore.importer.feature.batch.scheduled_stop_point.timing_place.TimingPlaceExportProcessor;
62+
import fi.hsl.jore.importer.feature.batch.scheduled_stop_point.timing_place.TimingPlaceExportReader;
63+
import fi.hsl.jore.importer.feature.batch.scheduled_stop_point.timing_place.TimingPlaceExportWriter;
6164
import fi.hsl.jore.importer.feature.infrastructure.link.dto.Jore3Link;
6265
import fi.hsl.jore.importer.feature.infrastructure.link_shape.dto.Jore3LinkShape;
6366
import fi.hsl.jore.importer.feature.infrastructure.node.dto.Jore3Node;
@@ -73,6 +76,7 @@
7376
import fi.hsl.jore.importer.feature.jore4.entity.Jore4Route;
7477
import fi.hsl.jore.importer.feature.jore4.entity.Jore4RouteGeometry;
7578
import fi.hsl.jore.importer.feature.jore4.entity.Jore4ScheduledStopPoint;
79+
import fi.hsl.jore.importer.feature.jore4.entity.Jore4TimingPlace;
7680
import fi.hsl.jore.importer.feature.network.line.dto.ImporterLine;
7781
import fi.hsl.jore.importer.feature.network.line.dto.PersistableLine;
7882
import fi.hsl.jore.importer.feature.network.line_header.dto.Jore3LineHeader;
@@ -84,6 +88,7 @@
8488
import fi.hsl.jore.importer.feature.network.route_point.dto.ImporterRouteGeometry;
8589
import fi.hsl.jore.importer.feature.network.scheduled_stop_point.dto.ImporterScheduledStopPoint;
8690
import fi.hsl.jore.importer.feature.network.scheduled_stop_point.dto.Jore3ScheduledStopPoint;
91+
import fi.hsl.jore.importer.feature.network.scheduled_stop_point.timing_place.ImporterTimingPlace;
8792
import org.springframework.batch.core.Job;
8893
import org.springframework.batch.core.Step;
8994
import org.springframework.batch.core.job.builder.FlowBuilder;
@@ -546,6 +551,7 @@ public Step commitScheduledStopPointsStep(final IScheduledStopPointImportReposit
546551

547552
@Bean
548553
public Flow jore4ExportFlow(final Step prepareJore4ExportStep,
554+
final Step exportTimingPlacesStep,
549555
final Step exportScheduledStopPointsStep,
550556
final Step exportLinesStep,
551557
final Step exportRoutesStep,
@@ -554,6 +560,7 @@ public Flow jore4ExportFlow(final Step prepareJore4ExportStep,
554560
final Step exportJourneyPatternStopsStep) {
555561
return new FlowBuilder<SimpleFlow>("jore4ExportFlow")
556562
.start(prepareJore4ExportStep)
563+
.next(exportTimingPlacesStep)
557564
.next(exportScheduledStopPointsStep)
558565
.next(exportLinesStep)
559566
.next(exportRoutesStep)
@@ -571,6 +578,21 @@ public Step prepareJore4ExportStep(final Jore4SchemaCleanupTasklet cleanupTaskle
571578
.build();
572579
}
573580

581+
@Bean
582+
public Step exportTimingPlacesStep(final TimingPlaceExportReader reader,
583+
final TimingPlaceExportWriter writer) {
584+
return steps.get("exportTimingPlacesStep")
585+
.allowStartIfComplete(true)
586+
.<ImporterTimingPlace, Jore4TimingPlace>chunk(1)
587+
.reader(reader.build())
588+
.processor(new TimingPlaceExportProcessor())
589+
.writer(writer)
590+
.faultTolerant()
591+
.skipPolicy(new AlwaysSkipItemSkipPolicy())
592+
.listener(new StatisticsLoggingStepExecutionListener())
593+
.build();
594+
}
595+
574596
@Bean
575597
public Step exportScheduledStopPointsStep(final ScheduledStopPointExportReader reader,
576598
final ScheduledStopPointExportProcessor processor,

src/main/java/fi/hsl/jore/importer/feature/batch/common/Jore4SchemaCleanupTasklet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public Jore4SchemaCleanupTasklet(final IDataEraser dataEraser) {
2828
public RepeatStatus execute(final StepContribution contribution, final ChunkContext chunkContext) throws Exception {
2929
dataEraser.deleteJourneyPatterns();
3030
dataEraser.deleteRoutesAndLines();
31-
dataEraser.deleteScheduledStopPoints();
31+
dataEraser.deleteScheduledStopPointsAndTimingPlaces();
3232

3333
return RepeatStatus.FINISHED;
3434
}

src/main/java/fi/hsl/jore/importer/feature/batch/scheduled_stop_point/ScheduledStopPointExportMapper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ public ImporterScheduledStopPoint mapRow(final ResultSet resultSet,
4141
csvToElyNumbers(resultSet.getString("ely_number")),
4242
pointFromDatabaseObject(resultSet.getObject("location")),
4343
jsonConverter.fromJson(resultSet.getString("name"), MultilingualString.class),
44-
getOptionalString(resultSet, "short_id")
44+
getOptionalString(resultSet, "short_id"),
45+
getOptionalString(resultSet, "hastus_place_id")
4546
);
4647
}
4748

src/main/java/fi/hsl/jore/importer/feature/batch/scheduled_stop_point/ScheduledStopPointExportProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ public Jore4ScheduledStopPoint process(final ImporterScheduledStopPoint jore3Sto
6262
return null;
6363
}
6464

65-
6665
for (int index = 0; index < elyNumbers.size(); index++) {
6766
final ExternalId externalId = externalIds.get(index);
6867
final Long elyNumber = elyNumbers.get(index);
@@ -79,6 +78,7 @@ public Jore4ScheduledStopPoint process(final ImporterScheduledStopPoint jore3Sto
7978
Jore4ScheduledStopPointDirection.valueOf(digiroadStop.directionOnInfraLink().name()),
8079
jore3Stop.shortId().get(),
8180
jore3Stop.location(),
81+
jore3Stop.hastusPlaceId(),
8282
DEFAULT_PRIORITY,
8383
Optional.of(DEFAULT_VALIDITY_START),
8484
Optional.of(DEFAULT_VALIDITY_END)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package fi.hsl.jore.importer.feature.batch.scheduled_stop_point.timing_place;
2+
3+
import fi.hsl.jore.importer.feature.network.scheduled_stop_point.timing_place.ImporterTimingPlace;
4+
import org.springframework.jdbc.core.RowMapper;
5+
6+
import java.sql.ResultSet;
7+
import java.sql.SQLException;
8+
9+
/**
10+
* Maps a result set row into an {@link ImporterTimingPlace} object.
11+
*/
12+
public class TimingPlaceExportMapper implements RowMapper<ImporterTimingPlace> {
13+
14+
public static final String SQL_PATH = "classpath:jore4-export/export_timing_places.sql";
15+
16+
@Override
17+
public ImporterTimingPlace mapRow(final ResultSet resultSet,
18+
final int rowNumber) throws SQLException {
19+
20+
return ImporterTimingPlace.of((resultSet.getString("hastus_place_id")));
21+
}
22+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package fi.hsl.jore.importer.feature.batch.scheduled_stop_point.timing_place;
2+
3+
import fi.hsl.jore.importer.feature.jore4.entity.Jore4TimingPlace;
4+
import fi.hsl.jore.importer.feature.network.scheduled_stop_point.timing_place.ImporterTimingPlace;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
import org.springframework.batch.item.ItemProcessor;
8+
9+
import java.util.UUID;
10+
11+
public class TimingPlaceExportProcessor implements ItemProcessor<ImporterTimingPlace, Jore4TimingPlace> {
12+
13+
private static final Logger LOGGER = LoggerFactory.getLogger(TimingPlaceExportProcessor.class);
14+
15+
@Override
16+
public Jore4TimingPlace process(final ImporterTimingPlace timingPlace) throws Exception {
17+
LOGGER.debug("Processing timing place input: {}", timingPlace);
18+
19+
final Jore4TimingPlace jore4TimingPlace = Jore4TimingPlace.of(UUID.randomUUID(),
20+
timingPlace.hastusPlaceId());
21+
22+
LOGGER.debug("Created timing place output: {}", jore4TimingPlace);
23+
24+
return jore4TimingPlace;
25+
}
26+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package fi.hsl.jore.importer.feature.batch.scheduled_stop_point.timing_place;
2+
3+
import fi.hsl.jore.importer.feature.batch.util.ResourceUtil;
4+
import fi.hsl.jore.importer.feature.network.scheduled_stop_point.timing_place.ImporterTimingPlace;
5+
import org.springframework.batch.item.database.JdbcCursorItemReader;
6+
import org.springframework.batch.item.database.builder.JdbcCursorItemReaderBuilder;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.beans.factory.annotation.Qualifier;
9+
import org.springframework.beans.factory.annotation.Value;
10+
import org.springframework.core.io.Resource;
11+
import org.springframework.stereotype.Component;
12+
13+
import javax.sql.DataSource;
14+
15+
/**
16+
* Reads Hastus place IDs from scheduled stop points from the import schemas
17+
* which are found from the database of this Spring Boot application.
18+
*/
19+
@Component
20+
public class TimingPlaceExportReader {
21+
22+
private static final String NAME = "timingPlaceExportReader";
23+
24+
private final DataSource dataSource;
25+
private final String sql;
26+
27+
@Autowired
28+
public TimingPlaceExportReader(@Qualifier("importerDataSource") final DataSource dataSource,
29+
@Value(TimingPlaceExportMapper.SQL_PATH) final Resource sqlResource) {
30+
this.dataSource = dataSource;
31+
this.sql = ResourceUtil.fromResource(sqlResource);
32+
}
33+
34+
public JdbcCursorItemReader<ImporterTimingPlace> build() {
35+
// The default fetch size seems to be 128 items.
36+
return new JdbcCursorItemReaderBuilder<ImporterTimingPlace>()
37+
.dataSource(dataSource)
38+
.name(NAME)
39+
.sql(sql)
40+
.rowMapper(new TimingPlaceExportMapper())
41+
.build();
42+
}
43+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package fi.hsl.jore.importer.feature.batch.scheduled_stop_point.timing_place;
2+
3+
import fi.hsl.jore.importer.feature.jore4.entity.Jore4TimingPlace;
4+
import fi.hsl.jore.importer.feature.jore4.repository.IJore4TimingPlaceRepository;
5+
import org.springframework.batch.item.ItemWriter;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.stereotype.Component;
8+
9+
import java.util.List;
10+
11+
/**
12+
* Writes the timing place objects to the Jore 4 database.
13+
*/
14+
@Component
15+
public class TimingPlaceExportWriter implements ItemWriter<Jore4TimingPlace> {
16+
17+
private final IJore4TimingPlaceRepository jore4Repository;
18+
19+
@Autowired
20+
public TimingPlaceExportWriter(final IJore4TimingPlaceRepository jore4Repository) {
21+
this.jore4Repository = jore4Repository;
22+
}
23+
24+
@Override
25+
public void write(final List<? extends Jore4TimingPlace> items) throws Exception {
26+
jore4Repository.insert(items);
27+
}
28+
}

0 commit comments

Comments
 (0)