@golemio/pid 2.12.11 → 2.13.0-rc.1284374518

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/db/example/12_metro_line_A_gtfs_trips.sql +1 -2
  2. package/db/migrations/postgresql/20240418133218-detailed-stop-times.js +53 -0
  3. package/db/migrations/postgresql/sqls/20240418133218-detailed-stop-times-down.sql +263 -0
  4. package/db/migrations/postgresql/sqls/20240418133218-detailed-stop-times-up.sql +174 -0
  5. package/dist/integration-engine/vehicle-positions/workers/gtfs-rt/helpers/VehicleDescriptor.d.ts +0 -2
  6. package/dist/integration-engine/vehicle-positions/workers/gtfs-rt/helpers/VehicleDescriptor.js +1 -4
  7. package/dist/integration-engine/vehicle-positions/workers/gtfs-rt/helpers/VehicleDescriptor.js.map +1 -1
  8. package/dist/integration-engine/vehicle-positions/workers/gtfs-rt/helpers/VehicleIdGenerator.d.ts +1 -1
  9. package/dist/integration-engine/vehicle-positions/workers/gtfs-rt/helpers/VehicleIdGenerator.js +1 -1
  10. package/dist/integration-engine/vehicle-positions/workers/gtfs-rt/helpers/VehicleIdGenerator.js.map +1 -1
  11. package/dist/integration-engine/vehicle-positions/workers/gtfs-rt/tasks/GenerateFilesTask.d.ts +1 -0
  12. package/dist/integration-engine/vehicle-positions/workers/gtfs-rt/tasks/GenerateFilesTask.js +33 -13
  13. package/dist/integration-engine/vehicle-positions/workers/gtfs-rt/tasks/GenerateFilesTask.js.map +1 -1
  14. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/data-access/TripsRepository.d.ts +2 -3
  15. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/data-access/TripsRepository.js +13 -24
  16. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/data-access/TripsRepository.js.map +1 -1
  17. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/data-access/cache/PublicStopTimeCacheRepository.d.ts +4 -1
  18. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/data-access/cache/PublicStopTimeCacheRepository.js +39 -2
  19. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/data-access/cache/PublicStopTimeCacheRepository.js.map +1 -1
  20. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/data-access/interfaces/TripRepositoryInterfaces.d.ts +1 -1
  21. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/VPUtils.d.ts +4 -0
  22. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/VPUtils.js +5 -1
  23. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/VPUtils.js.map +1 -1
  24. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/gtfs-trip-run/GTFSTripMetroRunManager.d.ts +1 -0
  25. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/gtfs-trip-run/GTFSTripMetroRunManager.js +4 -0
  26. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/gtfs-trip-run/GTFSTripMetroRunManager.js.map +1 -1
  27. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/public-api/PublicCacheTripsFilter.js +3 -3
  28. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/public-api/PublicCacheTripsFilter.js.map +1 -1
  29. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/tasks/RefreshPublicStopTimeCacheTask.js +4 -1
  30. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/tasks/RefreshPublicStopTimeCacheTask.js.map +1 -1
  31. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/tasks/RefreshPublicTripCacheTask.js +1 -1
  32. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/tasks/RefreshPublicTripCacheTask.js.map +1 -1
  33. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/transformations/PublicApiTripTransformation.d.ts +0 -2
  34. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/transformations/PublicApiTripTransformation.js +3 -8
  35. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/transformations/PublicApiTripTransformation.js.map +1 -1
  36. package/dist/output-gateway/public/service/helpers/trip-scope/strategy/StopTimesTripScopeHandler.d.ts +1 -0
  37. package/dist/output-gateway/public/service/helpers/trip-scope/strategy/StopTimesTripScopeHandler.js +18 -0
  38. package/dist/output-gateway/public/service/helpers/trip-scope/strategy/StopTimesTripScopeHandler.js.map +1 -1
  39. package/dist/schema-definitions/vehicle-positions/models/views/PublicStopTimeModel.d.ts +3 -0
  40. package/dist/schema-definitions/vehicle-positions/models/views/PublicStopTimeModel.js +12 -0
  41. package/dist/schema-definitions/vehicle-positions/models/views/PublicStopTimeModel.js.map +1 -1
  42. package/dist/schema-definitions/vehicle-positions/models/views/index.d.ts +0 -1
  43. package/dist/schema-definitions/vehicle-positions/models/views/index.js +0 -1
  44. package/dist/schema-definitions/vehicle-positions/models/views/index.js.map +1 -1
  45. package/dist/schema-definitions/vehicle-positions/models/views/interfaces/IPublicStopTimeDto.d.ts +3 -0
  46. package/dist/schema-definitions/vehicle-positions/redis/interfaces/IPublicStopTimeCacheDto.d.ts +3 -0
  47. package/dist/schema-definitions/vehicle-positions/redis/schemas/PublicStopTimeCacheDtoSchema.js +26 -1
  48. package/dist/schema-definitions/vehicle-positions/redis/schemas/PublicStopTimeCacheDtoSchema.js.map +1 -1
  49. package/package.json +2 -2
  50. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/data-access/views/StopTimeDelayPredictionRepository.d.ts +0 -7
  51. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/data-access/views/StopTimeDelayPredictionRepository.js +0 -19
  52. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/data-access/views/StopTimeDelayPredictionRepository.js.map +0 -1
  53. package/dist/schema-definitions/vehicle-positions/models/views/StopTimeDelayPredictionModel.d.ts +0 -13
  54. package/dist/schema-definitions/vehicle-positions/models/views/StopTimeDelayPredictionModel.js +0 -41
  55. package/dist/schema-definitions/vehicle-positions/models/views/StopTimeDelayPredictionModel.js.map +0 -1
  56. package/dist/schema-definitions/vehicle-positions/models/views/interfaces/IStopTimeDelayPredictionDto.d.ts +0 -9
  57. package/dist/schema-definitions/vehicle-positions/models/views/interfaces/IStopTimeDelayPredictionDto.js +0 -3
  58. package/dist/schema-definitions/vehicle-positions/models/views/interfaces/IStopTimeDelayPredictionDto.js.map +0 -1
@@ -97,8 +97,7 @@ INSERT INTO ropidgtfs_run_numbers_actual (route_id,run_number,service_id,trip_id
97
97
  ('L991',5,'1111111-1','991_78_220321',3,NULL,NULL,'2022-10-24 10:23:04.722+02',NULL,NULL,'2022-10-24 10:23:04.722+02',NULL),
98
98
  ('L991',5,'1111111-1','991_124_201230',3,NULL,NULL,'2022-10-24 10:23:04.722+02',NULL,NULL,'2022-10-24 10:23:04.722+02',NULL),
99
99
  ('L991',8,'1111111-3','991_124_201230',3,NULL,NULL,'2022-10-24 10:23:04.722+02',NULL,NULL,'2022-10-24 10:23:04.722+02',NULL),
100
- ('L991',9,'1111111-1','991_294_220901',3,NULL,NULL,'2022-10-24 10:23:04.722+02',NULL,NULL,'2022-10-24 10:23:04.722+02',NULL),
101
- ('L991',17,'1111111-3','991_294_220901',3,NULL,NULL,'2022-10-24 10:23:04.722+02',NULL,NULL,'2022-10-24 10:23:04.722+02',NULL);
100
+ ('L991',9,'1111111-1','991_294_220901',3,NULL,NULL,'2022-10-24 10:23:04.722+02',NULL,NULL,'2022-10-24 10:23:04.722+02',NULL);
102
101
 
103
102
  WITH init_values AS (
104
103
  SELECT CAST(current_date - INTERVAL '1 day' + INTERVAL '10 hour' AS TIMESTAMP WITH TIME ZONE) AT TIME ZONE 'Europe/Prague' AS origin_datetime
@@ -0,0 +1,53 @@
1
+ 'use strict';
2
+
3
+ var dbm;
4
+ var type;
5
+ var seed;
6
+ var fs = require('fs');
7
+ var path = require('path');
8
+ var Promise;
9
+
10
+ /**
11
+ * We receive the dbmigrate dependency from dbmigrate initially.
12
+ * This enables us to not have to rely on NODE_PATH.
13
+ */
14
+ exports.setup = function(options, seedLink) {
15
+ dbm = options.dbmigrate;
16
+ type = dbm.dataType;
17
+ seed = seedLink;
18
+ Promise = options.Promise;
19
+ };
20
+
21
+ exports.up = function(db) {
22
+ var filePath = path.join(__dirname, 'sqls', '20240418133218-detailed-stop-times-up.sql');
23
+ return new Promise( function( resolve, reject ) {
24
+ fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
25
+ if (err) return reject(err);
26
+ console.log('received data: ' + data);
27
+
28
+ resolve(data);
29
+ });
30
+ })
31
+ .then(function(data) {
32
+ return db.runSql(data);
33
+ });
34
+ };
35
+
36
+ exports.down = function(db) {
37
+ var filePath = path.join(__dirname, 'sqls', '20240418133218-detailed-stop-times-down.sql');
38
+ return new Promise( function( resolve, reject ) {
39
+ fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
40
+ if (err) return reject(err);
41
+ console.log('received data: ' + data);
42
+
43
+ resolve(data);
44
+ });
45
+ })
46
+ .then(function(data) {
47
+ return db.runSql(data);
48
+ });
49
+ };
50
+
51
+ exports._meta = {
52
+ "version": 1
53
+ };
@@ -0,0 +1,263 @@
1
+ drop view v_public_vehiclepositions_combined_stop_times;
2
+
3
+ drop view v_public_vehiclepositions_future_stop_times;
4
+
5
+ drop view v_public_vehiclepositions_past_stop_times;
6
+
7
+ -- history view
8
+ create view v_public_vehiclepositions_past_stop_times as
9
+ select
10
+ trips_id as rt_trip_id,
11
+ last_stop_sequence as stop_sequence,
12
+ min(delay_stop_arrival) as stop_arr_delay,
13
+ max(delay_stop_departure) as stop_dep_delay
14
+ from
15
+ (
16
+ select
17
+ trips_id,
18
+ last_stop_sequence,
19
+ delay_stop_arrival,
20
+ delay_stop_departure,
21
+ row_number() over seq as rn
22
+ from
23
+ vehiclepositions_positions rt_position
24
+ where
25
+ (
26
+ delay_stop_arrival is not null
27
+ or delay_stop_departure is not null
28
+ )
29
+ and state_position in ('on_track', 'at_stop', 'after_track') window seq as (
30
+ partition by trips_id,
31
+ last_stop_sequence,
32
+ state_position
33
+ order by
34
+ id
35
+ )
36
+ ) as sub
37
+ where
38
+ rn = 1
39
+ group by
40
+ trips_id,
41
+ last_stop_sequence
42
+ order by
43
+ trips_id,
44
+ last_stop_sequence;
45
+
46
+ -- prediction view
47
+ create view v_public_vehiclepositions_future_stop_times as with recursive stop_times as (
48
+ select
49
+ rst.trip_id,
50
+ vt.id as trips_id,
51
+ vt.provider_source_type,
52
+ vp.delay,
53
+ coalesce(vp.last_stop_sequence, 1) as initial_stop_sequence,
54
+ vp.state_position,
55
+ rst.stop_sequence,
56
+ rst.computed_dwell_time_seconds,
57
+ case
58
+ when vp.last_stop_sequence is null then vp.delay
59
+ else vp.delay_stop_arrival
60
+ end as arrival_delay_seconds,
61
+ case
62
+ when vp.last_stop_sequence is null then predict_delay_seconds(
63
+ vp.delay,
64
+ rst.computed_dwell_time_seconds,
65
+ vt.provider_source_type
66
+ )
67
+ when vp.state_position = 'at_stop' then case
68
+ when vt.provider_source_type = '1' then greatest(0, vp.delay)
69
+ else vp.delay
70
+ end
71
+ else vp.delay_stop_departure
72
+ end as departure_delay_seconds
73
+ from
74
+ ropidgtfs_stop_times rst
75
+ join vehiclepositions_trips vt on vt.gtfs_trip_id = rst.trip_id
76
+ join vehiclepositions_positions vp on vp.id = vt.last_position_id
77
+ and (
78
+ vp.valid_to is null
79
+ or vp.valid_to >= now()
80
+ )
81
+ and vp.state_position in ('on_track', 'at_stop')
82
+ where
83
+ vt.gtfs_trip_id is not null
84
+ and rst.stop_sequence = coalesce(vp.last_stop_sequence, 1)
85
+ union
86
+ all
87
+ select
88
+ rst.trip_id,
89
+ previous_row.trips_id as trips_id,
90
+ previous_row.provider_source_type,
91
+ previous_row.delay,
92
+ previous_row.initial_stop_sequence,
93
+ previous_row.state_position,
94
+ rst.stop_sequence,
95
+ rst.computed_dwell_time_seconds,
96
+ case
97
+ when rst.stop_sequence - previous_row.initial_stop_sequence = 1
98
+ and previous_row.state_position != 'at_stop' then previous_row.delay
99
+ else previous_row.departure_delay_seconds
100
+ end as arrival_delay_seconds,
101
+ predict_delay_seconds(
102
+ case
103
+ when rst.stop_sequence - previous_row.initial_stop_sequence = 1
104
+ and previous_row.state_position != 'at_stop' then previous_row.delay
105
+ else previous_row.departure_delay_seconds
106
+ end,
107
+ rst.computed_dwell_time_seconds,
108
+ previous_row.provider_source_type
109
+ ) as departure_delay_seconds
110
+ from
111
+ stop_times previous_row
112
+ join ropidgtfs_stop_times rst on rst.trip_id = previous_row.trip_id
113
+ and rst.stop_sequence = previous_row.stop_sequence + 1
114
+ )
115
+ select
116
+ trips_id as rt_trip_id,
117
+ stop_sequence,
118
+ coalesce(arrival_delay_seconds, 0) as stop_arr_delay,
119
+ coalesce(departure_delay_seconds, 0) as stop_dep_delay
120
+ from
121
+ stop_times
122
+ order by
123
+ trip_id,
124
+ stop_sequence;
125
+
126
+ -- combined view
127
+ create view v_public_vehiclepositions_combined_stop_times as
128
+ select
129
+ distinct on (rt_trip_id, stop_sequence) stop_times.rt_trip_id,
130
+ vt.gtfs_trip_id,
131
+ stop_times.stop_sequence,
132
+ stop_times.stop_arr_delay,
133
+ stop_times.stop_dep_delay,
134
+ vt.gtfs_route_type,
135
+ vt.gtfs_route_short_name,
136
+ vt.run_number,
137
+ vt.internal_run_number,
138
+ vt.provider_source_type,
139
+ vt.cis_trip_number,
140
+ vt.vehicle_registration_number
141
+ from
142
+ (
143
+ select
144
+ *
145
+ from
146
+ v_public_vehiclepositions_future_stop_times prediction
147
+ union
148
+ all
149
+ select
150
+ *
151
+ from
152
+ v_public_vehiclepositions_past_stop_times history
153
+ ) as stop_times
154
+ join vehiclepositions_trips vt on vt.id = stop_times.rt_trip_id
155
+ join vehiclepositions_positions vp on vt.last_position_id = vp.id
156
+ and (
157
+ vp.valid_to is null
158
+ or vp.valid_to >= now()
159
+ )
160
+ and vp.state_position != 'after_track'
161
+ order by
162
+ rt_trip_id,
163
+ stop_sequence;
164
+
165
+ -- old view
166
+ create view v_vehiclepositions_stop_time_delay_prediction as with recursive stop_times as (
167
+ select
168
+ vt.id,
169
+ rst.trip_id,
170
+ vt.provider_source_type,
171
+ vp.delay,
172
+ coalesce(vp.last_stop_sequence, 1) as initial_stop_sequence,
173
+ vp.state_position,
174
+ rst.stop_sequence,
175
+ rst.stop_id,
176
+ rs.platform_code,
177
+ vcs.cis_stop_platform_code,
178
+ rst.computed_dwell_time_seconds,
179
+ case
180
+ when vp.last_stop_sequence is null then vp.delay
181
+ else vp.delay_stop_arrival
182
+ end as arrival_delay_seconds,
183
+ case
184
+ when vp.last_stop_sequence is null then predict_delay_seconds(
185
+ vp.delay,
186
+ rst.computed_dwell_time_seconds,
187
+ vt.provider_source_type
188
+ )
189
+ when vp.state_position = 'at_stop' then case
190
+ when vt.provider_source_type = '1' then greatest(0, vp.delay)
191
+ else vp.delay
192
+ end
193
+ else vp.delay_stop_departure
194
+ end as departure_delay_seconds
195
+ from
196
+ ropidgtfs_stop_times rst
197
+ inner join vehiclepositions_trips vt on vt.gtfs_trip_id = rst.trip_id
198
+ inner join vehiclepositions_positions vp on vp.id = vt.last_position_id
199
+ and (
200
+ vp.valid_to is null
201
+ or vp.valid_to >= now()
202
+ )
203
+ left join ropidgtfs_stops rs on rs.stop_id = rst.stop_id
204
+ left join ropidgtfs_cis_stops rcs on rcs.id = rs.computed_cis_stop_id
205
+ left join vehiclepositions_cis_stops vcs on vcs.rt_trip_id = vt.id
206
+ and vcs.cis_stop_group_id = rcs.cis
207
+ where
208
+ vt.gtfs_trip_id is not null
209
+ and rst.stop_sequence = coalesce(vp.last_stop_sequence, 1)
210
+ union
211
+ all
212
+ select
213
+ previous_row.id,
214
+ rst.trip_id,
215
+ previous_row.provider_source_type,
216
+ previous_row.delay,
217
+ previous_row.initial_stop_sequence,
218
+ previous_row.state_position,
219
+ rst.stop_sequence,
220
+ rst.stop_id,
221
+ rs.platform_code,
222
+ vcs.cis_stop_platform_code,
223
+ rst.computed_dwell_time_seconds,
224
+ case
225
+ when rst.stop_sequence - previous_row.initial_stop_sequence = 1
226
+ and previous_row.state_position != 'at_stop' then previous_row.delay
227
+ else previous_row.departure_delay_seconds
228
+ end as arrival_delay_seconds,
229
+ predict_delay_seconds(
230
+ case
231
+ when rst.stop_sequence - previous_row.initial_stop_sequence = 1
232
+ and previous_row.state_position != 'at_stop' then previous_row.delay
233
+ else previous_row.departure_delay_seconds
234
+ end,
235
+ rst.computed_dwell_time_seconds,
236
+ previous_row.provider_source_type
237
+ ) as departure_delay_seconds
238
+ from
239
+ stop_times previous_row
240
+ inner join ropidgtfs_stop_times rst on rst.trip_id = previous_row.trip_id
241
+ and rst.stop_sequence = previous_row.stop_sequence + 1
242
+ left join ropidgtfs_stops rs on rs.stop_id = rst.stop_id
243
+ left join ropidgtfs_cis_stops rcs on rcs.id = rs.computed_cis_stop_id
244
+ left join vehiclepositions_cis_stops vcs on vcs.rt_trip_id = previous_row.id
245
+ and vcs.cis_stop_group_id = rcs.cis
246
+ )
247
+ select
248
+ trip_id,
249
+ stop_sequence,
250
+ stop_id,
251
+ platform_code,
252
+ cis_stop_platform_code,
253
+ arrival_delay_seconds,
254
+ departure_delay_seconds
255
+ from
256
+ stop_times
257
+ order by
258
+ trip_id,
259
+ stop_sequence;
260
+
261
+ comment on view v_vehiclepositions_stop_time_delay_prediction is '
262
+ This view contains the predicted delay of a vehicle at each stop.
263
+ ';
@@ -0,0 +1,174 @@
1
+ -- history view
2
+ create
3
+ or replace view v_public_vehiclepositions_past_stop_times as
4
+ select
5
+ trips_id as rt_trip_id,
6
+ last_stop_sequence as stop_sequence,
7
+ min(delay_stop_arrival) as stop_arr_delay,
8
+ max(delay_stop_departure) as stop_dep_delay,
9
+ last_stop_id as stop_id
10
+ from
11
+ (
12
+ select
13
+ trips_id,
14
+ last_stop_id,
15
+ last_stop_sequence,
16
+ delay_stop_arrival,
17
+ delay_stop_departure,
18
+ row_number() over seq as rn
19
+ from
20
+ vehiclepositions_positions rt_position
21
+ where
22
+ (
23
+ delay_stop_arrival is not null
24
+ or delay_stop_departure is not null
25
+ )
26
+ and state_position in ('on_track', 'at_stop', 'after_track') window seq as (
27
+ partition by trips_id,
28
+ last_stop_sequence,
29
+ state_position
30
+ order by
31
+ id
32
+ )
33
+ ) as sub
34
+ where
35
+ rn = 1
36
+ group by
37
+ trips_id,
38
+ last_stop_sequence,
39
+ last_stop_id
40
+ order by
41
+ trips_id,
42
+ last_stop_sequence;
43
+
44
+ -- prediction view
45
+ create
46
+ or replace view v_public_vehiclepositions_future_stop_times as with recursive stop_times as (
47
+ select
48
+ rst.trip_id,
49
+ vt.id as trips_id,
50
+ vt.provider_source_type,
51
+ vp.delay,
52
+ coalesce(vp.last_stop_sequence, 1) as initial_stop_sequence,
53
+ vp.state_position,
54
+ rst.stop_id,
55
+ rst.stop_sequence,
56
+ rst.computed_dwell_time_seconds,
57
+ case
58
+ when vp.last_stop_sequence is null then vp.delay
59
+ else vp.delay_stop_arrival
60
+ end as arrival_delay_seconds,
61
+ case
62
+ when vp.last_stop_sequence is null then predict_delay_seconds(
63
+ vp.delay,
64
+ rst.computed_dwell_time_seconds,
65
+ vt.provider_source_type
66
+ )
67
+ when vp.state_position = 'at_stop' then case
68
+ when vt.provider_source_type = '1' then greatest(0, vp.delay)
69
+ else vp.delay
70
+ end
71
+ else vp.delay_stop_departure
72
+ end as departure_delay_seconds
73
+ from
74
+ ropidgtfs_stop_times rst
75
+ join vehiclepositions_trips vt on vt.gtfs_trip_id = rst.trip_id
76
+ join vehiclepositions_positions vp on vp.id = vt.last_position_id
77
+ and (
78
+ vp.valid_to is null
79
+ or vp.valid_to >= now()
80
+ )
81
+ and vp.state_position in ('on_track', 'at_stop')
82
+ where
83
+ vt.gtfs_trip_id is not null
84
+ and rst.stop_sequence = coalesce(vp.last_stop_sequence, 1)
85
+ union
86
+ all
87
+ select
88
+ rst.trip_id,
89
+ previous_row.trips_id as trips_id,
90
+ previous_row.provider_source_type,
91
+ previous_row.delay,
92
+ previous_row.initial_stop_sequence,
93
+ previous_row.state_position,
94
+ rst.stop_id,
95
+ rst.stop_sequence,
96
+ rst.computed_dwell_time_seconds,
97
+ case
98
+ when rst.stop_sequence - previous_row.initial_stop_sequence = 1
99
+ and previous_row.state_position != 'at_stop' then previous_row.delay
100
+ else previous_row.departure_delay_seconds
101
+ end as arrival_delay_seconds,
102
+ predict_delay_seconds(
103
+ case
104
+ when rst.stop_sequence - previous_row.initial_stop_sequence = 1
105
+ and previous_row.state_position != 'at_stop' then previous_row.delay
106
+ else previous_row.departure_delay_seconds
107
+ end,
108
+ rst.computed_dwell_time_seconds,
109
+ previous_row.provider_source_type
110
+ ) as departure_delay_seconds
111
+ from
112
+ stop_times previous_row
113
+ join ropidgtfs_stop_times rst on rst.trip_id = previous_row.trip_id
114
+ and rst.stop_sequence = previous_row.stop_sequence + 1
115
+ )
116
+ select
117
+ trips_id as rt_trip_id,
118
+ stop_sequence,
119
+ coalesce(arrival_delay_seconds, 0) as stop_arr_delay,
120
+ coalesce(departure_delay_seconds, 0) as stop_dep_delay,
121
+ stop_id
122
+ from
123
+ stop_times
124
+ order by
125
+ trip_id,
126
+ stop_sequence;
127
+
128
+ -- combined view
129
+ create
130
+ or replace view v_public_vehiclepositions_combined_stop_times as
131
+ select
132
+ distinct on (rt_trip_id, stop_sequence) stop_times.rt_trip_id,
133
+ vt.gtfs_trip_id,
134
+ stop_times.stop_sequence,
135
+ stop_times.stop_arr_delay,
136
+ stop_times.stop_dep_delay,
137
+ vt.gtfs_route_type,
138
+ vt.gtfs_route_short_name,
139
+ vt.run_number,
140
+ vt.internal_run_number,
141
+ vt.provider_source_type,
142
+ vt.cis_trip_number,
143
+ vt.vehicle_registration_number,
144
+ stop_times.stop_id,
145
+ vcs.cis_stop_platform_code,
146
+ rs.platform_code
147
+ from
148
+ (
149
+ select
150
+ *
151
+ from
152
+ v_public_vehiclepositions_future_stop_times prediction
153
+ union
154
+ all
155
+ select
156
+ *
157
+ from
158
+ v_public_vehiclepositions_past_stop_times history
159
+ ) as stop_times
160
+ join vehiclepositions_trips vt on vt.id = stop_times.rt_trip_id
161
+ join vehiclepositions_positions vp on vt.last_position_id = vp.id
162
+ and (
163
+ vp.valid_to is null
164
+ or vp.valid_to >= now()
165
+ )
166
+ and vp.state_position != 'after_track'
167
+ left join ropidgtfs_stops rs on rs.stop_id = stop_times.stop_id
168
+ left join vehiclepositions_cis_stops vcs on vcs.rt_trip_id = stop_times.rt_trip_id
169
+ order by
170
+ rt_trip_id,
171
+ stop_sequence;
172
+
173
+ -- old view
174
+ drop view v_vehiclepositions_stop_time_delay_prediction;
@@ -1,7 +1,5 @@
1
1
  import { IGtfsRtTripDto } from "../../../../../schema-definitions/vehicle-positions/models/interfaces/IGtfsRtTripDto";
2
2
  import { IVehicleDescriptor } from "../interfaces/GtfsRealtimeInterfaces";
3
3
  export declare class VehicleDescriptor {
4
- private vehicleIdGenerator;
5
- constructor();
6
4
  getVehicleDescriptor(tripRecord: IGtfsRtTripDto): IVehicleDescriptor;
7
5
  }
@@ -3,12 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VehicleDescriptor = void 0;
4
4
  const VehicleIdGenerator_1 = require("./VehicleIdGenerator");
5
5
  class VehicleDescriptor {
6
- constructor() {
7
- this.vehicleIdGenerator = new VehicleIdGenerator_1.VehicleIdGenerator();
8
- }
9
6
  getVehicleDescriptor(tripRecord) {
10
7
  var _a;
11
- return Object.assign(Object.assign({ id: this.vehicleIdGenerator.getVehicleId(tripRecord.id, tripRecord.gtfs_route_type, tripRecord.provider_source_type, tripRecord.gtfs_route_short_name, tripRecord.cis_trip_number, tripRecord.vehicle_registration_number, tripRecord.run_number, tripRecord.internal_run_number) }, (tripRecord.vehicle_registration_number && {
8
+ return Object.assign(Object.assign({ id: VehicleIdGenerator_1.VehicleIdGenerator.getVehicleId(tripRecord.id, tripRecord.gtfs_route_type, tripRecord.provider_source_type, tripRecord.gtfs_route_short_name, tripRecord.cis_trip_number, tripRecord.vehicle_registration_number, tripRecord.run_number, tripRecord.internal_run_number) }, (tripRecord.vehicle_registration_number && {
12
9
  label: tripRecord.vehicle_registration_number.toString(),
13
10
  })), { ".transit_realtime.ovapiVehicleDescriptor": {
14
11
  wheelchairAccessible: (_a = tripRecord.wheelchair_accessible) !== null && _a !== void 0 ? _a : undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"VehicleDescriptor.js","sourceRoot":"","sources":["../../../../../../src/integration-engine/vehicle-positions/workers/gtfs-rt/helpers/VehicleDescriptor.ts"],"names":[],"mappings":";;;AAEA,6DAA0D;AAE1D,MAAa,iBAAiB;IAE1B;QACI,IAAI,CAAC,kBAAkB,GAAG,IAAI,uCAAkB,EAAE,CAAC;IACvD,CAAC;IACM,oBAAoB,CAAC,UAA0B;;QAClD,qCACI,EAAE,EAAE,IAAI,CAAC,kBAAkB,CAAC,YAAY,CACpC,UAAU,CAAC,EAAE,EACb,UAAU,CAAC,eAAe,EAC1B,UAAU,CAAC,oBAAoB,EAC/B,UAAU,CAAC,qBAAqB,EAChC,UAAU,CAAC,eAAe,EAC1B,UAAU,CAAC,2BAA2B,EACtC,UAAU,CAAC,UAAU,EACrB,UAAU,CAAC,mBAAmB,CACjC,IACE,CAAC,UAAU,CAAC,2BAA2B,IAAI;YAC1C,KAAK,EAAE,UAAU,CAAC,2BAA2B,CAAC,QAAQ,EAAE;SAC3D,CAAC,KACF,0CAA0C,EAAE;gBACxC,oBAAoB,EAAE,MAAA,UAAU,CAAC,qBAAqB,mCAAI,SAAS;gBACnE,WAAW,EAAE,UAAU,CAAC,kBAAkB;oBACtC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,UAAU,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;oBACtF,CAAC,CAAC,SAAS;aAClB,IACH;IACN,CAAC;CACJ;AA5BD,8CA4BC"}
1
+ {"version":3,"file":"VehicleDescriptor.js","sourceRoot":"","sources":["../../../../../../src/integration-engine/vehicle-positions/workers/gtfs-rt/helpers/VehicleDescriptor.ts"],"names":[],"mappings":";;;AAEA,6DAA0D;AAE1D,MAAa,iBAAiB;IACnB,oBAAoB,CAAC,UAA0B;;QAClD,qCACI,EAAE,EAAE,uCAAkB,CAAC,YAAY,CAC/B,UAAU,CAAC,EAAE,EACb,UAAU,CAAC,eAAe,EAC1B,UAAU,CAAC,oBAAoB,EAC/B,UAAU,CAAC,qBAAqB,EAChC,UAAU,CAAC,eAAe,EAC1B,UAAU,CAAC,2BAA2B,EACtC,UAAU,CAAC,UAAU,EACrB,UAAU,CAAC,mBAAmB,CACjC,IACE,CAAC,UAAU,CAAC,2BAA2B,IAAI;YAC1C,KAAK,EAAE,UAAU,CAAC,2BAA2B,CAAC,QAAQ,EAAE;SAC3D,CAAC,KACF,0CAA0C,EAAE;gBACxC,oBAAoB,EAAE,MAAA,UAAU,CAAC,qBAAqB,mCAAI,SAAS;gBACnE,WAAW,EAAE,UAAU,CAAC,kBAAkB;oBACtC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,UAAU,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;oBACtF,CAAC,CAAC,SAAS;aAClB,IACH;IACN,CAAC;CACJ;AAxBD,8CAwBC"}
@@ -1,5 +1,5 @@
1
1
  import { GTFSRouteTypeEnum } from "../../../../../helpers/RouteTypeEnums";
2
2
  import { ProviderSourceTypeEnum } from "../../vehicle-positions/helpers/ProviderSourceTypeEnum";
3
3
  export declare class VehicleIdGenerator {
4
- getVehicleId(trip_id: string, gtfs_route_type: GTFSRouteTypeEnum | null, provider_source_type: ProviderSourceTypeEnum, gtfs_route_short_name: string | null, cis_trip_number: number | null, vehicle_registration_number: number | null, run_number: number | null, internal_run_number: number | null): string;
4
+ static getVehicleId(trip_id: string, gtfs_route_type: GTFSRouteTypeEnum | null, provider_source_type: ProviderSourceTypeEnum, gtfs_route_short_name: string | null, cis_trip_number: number | null, vehicle_registration_number: number | null, run_number: number | null, internal_run_number: number | null): string;
5
5
  }
@@ -4,7 +4,7 @@ exports.VehicleIdGenerator = void 0;
4
4
  const RouteTypeEnums_1 = require("../../../../../helpers/RouteTypeEnums");
5
5
  const ProviderSourceTypeEnum_1 = require("../../vehicle-positions/helpers/ProviderSourceTypeEnum");
6
6
  class VehicleIdGenerator {
7
- getVehicleId(trip_id, gtfs_route_type, provider_source_type, gtfs_route_short_name, cis_trip_number, vehicle_registration_number, run_number, internal_run_number) {
7
+ static getVehicleId(trip_id, gtfs_route_type, provider_source_type, gtfs_route_short_name, cis_trip_number, vehicle_registration_number, run_number, internal_run_number) {
8
8
  if (gtfs_route_type === RouteTypeEnums_1.GTFSRouteTypeEnum.TRAIN) {
9
9
  return "train-" + cis_trip_number;
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"VehicleIdGenerator.js","sourceRoot":"","sources":["../../../../../../src/integration-engine/vehicle-positions/workers/gtfs-rt/helpers/VehicleIdGenerator.ts"],"names":[],"mappings":";;;AAAA,0EAA+D;AAC/D,mGAAwH;AAExH,MAAa,kBAAkB;IACpB,YAAY,CACf,OAAe,EACf,eAAyC,EACzC,oBAA4C,EAC5C,qBAAoC,EACpC,eAA8B,EAC9B,2BAA0C,EAC1C,UAAyB,EACzB,mBAAkC;QAElC,IAAI,eAAe,KAAK,kCAAiB,CAAC,KAAK,EAAE;YAC7C,OAAO,QAAQ,GAAG,eAAe,CAAC;SACrC;QAED,IAAI,eAAe,KAAK,kCAAiB,CAAC,KAAK,EAAE;YAC7C,OAAO,SAAS,qBAAqB,IAAI,mBAAmB,IAAI,UAAU,EAAE,CAAC;SAChF;QAED,IAAI,oBAAoB,KAAK,+CAAsB,CAAC,cAAc,EAAE;YAChE,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;YAClD,OAAO,WAAW,eAAe,IAAI,cAAc,EAAE,CAAC;SACzD;QAED,OAAO,UAAU,GAAG,eAAe,GAAG,GAAG,GAAG,2BAA2B,CAAC;IAC5E,CAAC;CACJ;AA1BD,gDA0BC"}
1
+ {"version":3,"file":"VehicleIdGenerator.js","sourceRoot":"","sources":["../../../../../../src/integration-engine/vehicle-positions/workers/gtfs-rt/helpers/VehicleIdGenerator.ts"],"names":[],"mappings":";;;AAAA,0EAA+D;AAC/D,mGAAwH;AAExH,MAAa,kBAAkB;IACpB,MAAM,CAAC,YAAY,CACtB,OAAe,EACf,eAAyC,EACzC,oBAA4C,EAC5C,qBAAoC,EACpC,eAA8B,EAC9B,2BAA0C,EAC1C,UAAyB,EACzB,mBAAkC;QAElC,IAAI,eAAe,KAAK,kCAAiB,CAAC,KAAK,EAAE;YAC7C,OAAO,QAAQ,GAAG,eAAe,CAAC;SACrC;QAED,IAAI,eAAe,KAAK,kCAAiB,CAAC,KAAK,EAAE;YAC7C,OAAO,SAAS,qBAAqB,IAAI,mBAAmB,IAAI,UAAU,EAAE,CAAC;SAChF;QAED,IAAI,oBAAoB,KAAK,+CAAsB,CAAC,cAAc,EAAE;YAChE,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;YAClD,OAAO,WAAW,eAAe,IAAI,cAAc,EAAE,CAAC;SACzD;QAED,OAAO,UAAU,GAAG,eAAe,GAAG,GAAG,GAAG,2BAA2B,CAAC;IAC5E,CAAC;CACJ;AA1BD,gDA0BC"}
@@ -3,6 +3,7 @@ export declare class GenerateFilesTask extends AbstractEmptyTask {
3
3
  readonly queueName = "generateFiles";
4
4
  readonly queueTtl: number;
5
5
  private readonly logger;
6
+ private readonly stopTimeRepository;
6
7
  private readonly tripsRepository;
7
8
  private readonly gtfsRtRedisRepository;
8
9
  private readonly alertsGenerator;
@@ -24,9 +24,11 @@ exports.GenerateFilesTask = void 0;
24
24
  const RouteTypeEnums_1 = require("../../../../../helpers/RouteTypeEnums");
25
25
  const ropid_vymi_1 = require("../../../../ropid-vymi");
26
26
  const Di_1 = require("../../../ioc/Di");
27
+ const VPContainerToken_1 = require("../../../ioc/VPContainerToken");
27
28
  const TripsRepository_1 = require("../../vehicle-positions/data-access/TripsRepository");
28
29
  const ioc_1 = require("@golemio/core/dist/integration-engine/ioc");
29
30
  const workers_1 = require("@golemio/core/dist/integration-engine/workers");
31
+ const golemio_errors_1 = require("@golemio/core/dist/shared/golemio-errors");
30
32
  const ovapi_gtfs_realtime_bindings_1 = require("@golemio/ovapi-gtfs-realtime-bindings");
31
33
  const GtfsRtRedisRepository_1 = require("../data-access/GtfsRtRedisRepository");
32
34
  const AlertsGenerator_1 = require("../helpers/AlertsGenerator");
@@ -38,6 +40,7 @@ class GenerateFilesTask extends workers_1.AbstractEmptyTask {
38
40
  this.queueName = "generateFiles";
39
41
  this.queueTtl = 20 * 1000; // 20 seconds
40
42
  this.logger = Di_1.VPContainer.resolve(ioc_1.ContainerToken.Logger);
43
+ this.stopTimeRepository = Di_1.VPContainer.resolve(VPContainerToken_1.VPContainerToken.PublicStopTimeCacheRepository);
41
44
  this.tripsRepository = new TripsRepository_1.TripsRepository();
42
45
  this.gtfsRtRedisRepository = new GtfsRtRedisRepository_1.GtfsRtRedisRepository();
43
46
  const vymiEventsRepository = new ropid_vymi_1.RopidVYMIEventsModel();
@@ -47,13 +50,22 @@ class GenerateFilesTask extends workers_1.AbstractEmptyTask {
47
50
  }
48
51
  execute() {
49
52
  return __awaiter(this, void 0, void 0, function* () {
50
- const tripData = yield this.tripsRepository.findAllForGTFSRt();
53
+ const startDateTime = new Date();
54
+ const tripData = yield this.tripsRepository.findAllForGTFSRt(startDateTime);
51
55
  const feedHeader = this.createFeedHeader();
52
56
  const updatesMessage = ovapi_gtfs_realtime_bindings_1.transit_realtime.FeedMessage.create({ header: feedHeader });
53
57
  const positionsMessage = ovapi_gtfs_realtime_bindings_1.transit_realtime.FeedMessage.create({ header: feedHeader });
54
58
  const pidFeedMessage = ovapi_gtfs_realtime_bindings_1.transit_realtime.FeedMessage.create({ header: feedHeader });
59
+ const vehicleDescriptors = tripData.map((tripRecord) => this.vehicleDescriptor.getVehicleDescriptor(tripRecord));
60
+ const vehicleIds = [];
61
+ for (const { id } of vehicleDescriptors) {
62
+ if (typeof id === "string") {
63
+ vehicleIds.push(id);
64
+ }
65
+ }
66
+ const stopTimes = yield this.stopTimeRepository.getPublicStopTimeCache(vehicleIds);
55
67
  const gtfsTripIdMap = {};
56
- for (const tripRecord of Object.values(tripData)) {
68
+ for (const tripRecord of tripData) {
57
69
  const tripDescriptor = {
58
70
  scheduleRelationship: tripRecord.last_position.is_canceled
59
71
  ? ovapi_gtfs_realtime_bindings_1.transit_realtime.TripDescriptor.ScheduleRelationship.CANCELED
@@ -85,7 +97,14 @@ class GenerateFilesTask extends workers_1.AbstractEmptyTask {
85
97
  positionsMessage.entity.push(positionsMessageEntity);
86
98
  // single feed for trip updates and vehicle positions
87
99
  const feedMessageEntity = structuredClone(positionsMessageEntity);
88
- const stopTimeUpdates = this.generateStopTimeUpdate(tripRecord.stop_times, tripRecord.gtfs_route_type);
100
+ let stopTimeUpdates = [];
101
+ if (typeof vehicleDescriptor.id === "string") {
102
+ const stopTimesForVehicle = stopTimes.get(vehicleDescriptor.id);
103
+ stopTimeUpdates = this.generateStopTimeUpdate(tripRecord.gtfs_route_type, stopTimesForVehicle);
104
+ }
105
+ else {
106
+ this.logger.error(new golemio_errors_1.GeneralError(`Cannot get stopTimeUpdates for trip with unknown vehicleId and gtfsTripId '${tripRecord.gtfs_trip_id}'`, this.constructor.name, undefined, undefined, "pid"));
107
+ }
89
108
  const shouldSkipTripUpdate = stopTimeUpdates.every((el) => el.scheduleRelationship === ovapi_gtfs_realtime_bindings_1.transit_realtime.TripUpdate.StopTimeUpdate.ScheduleRelationship.NO_DATA ||
90
109
  gtfsTripIdMap[tripRecord.gtfs_trip_id]);
91
110
  if (!shouldSkipTripUpdate) {
@@ -176,22 +195,23 @@ class GenerateFilesTask extends workers_1.AbstractEmptyTask {
176
195
  }
177
196
  return entity;
178
197
  }
179
- generateStopTimeUpdate(stopTimeEvents, routeType) {
198
+ generateStopTimeUpdate(routeType, stopTimes) {
199
+ var _a, _b;
180
200
  const stopTimeUpdates = [];
181
- for (const stopTimeEvent of stopTimeEvents) {
182
- const scheduledTrack = stopTimeEvent.platform_code;
183
- let actualTrack = stopTimeEvent.platform_code;
201
+ for (const stopTime of stopTimes) {
202
+ const scheduledTrack = stopTime.platform_code;
203
+ let actualTrack = stopTime.platform_code;
184
204
  if (routeType === RouteTypeEnums_1.GTFSRouteTypeEnum.TRAIN) {
185
- actualTrack = stopTimeEvent.cis_stop_platform_code;
205
+ actualTrack = stopTime.cis_stop_platform_code;
186
206
  }
187
207
  stopTimeUpdates.push(Object.assign(Object.assign({ arrival: {
188
- delay: stopTimeEvent.arrival_delay_seconds,
208
+ delay: (_a = stopTime.arr_delay) !== null && _a !== void 0 ? _a : stopTime.dep_delay,
189
209
  }, departure: {
190
- delay: stopTimeEvent.departure_delay_seconds,
191
- } }, (stopTimeEvent.arrival_delay_seconds === null &&
192
- stopTimeEvent.departure_delay_seconds === null && {
210
+ delay: (_b = stopTime.dep_delay) !== null && _b !== void 0 ? _b : stopTime.arr_delay,
211
+ } }, (stopTime.arr_delay === null &&
212
+ stopTime.dep_delay === null && {
193
213
  scheduleRelationship: ovapi_gtfs_realtime_bindings_1.transit_realtime.TripUpdate.StopTimeUpdate.ScheduleRelationship.NO_DATA,
194
- })), { stopSequence: stopTimeEvent.stop_sequence, stopId: stopTimeEvent.stop_id, ".transit_realtime.ovapiStopTimeUpdate": Object.assign(Object.assign({}, (scheduledTrack && { scheduledTrack })), (actualTrack && { actualTrack })) }));
214
+ })), { stopSequence: stopTime.sequence, stopId: stopTime.stop_id, ".transit_realtime.ovapiStopTimeUpdate": Object.assign(Object.assign({}, (scheduledTrack && { scheduledTrack })), (actualTrack && { actualTrack })) }));
195
215
  }
196
216
  return stopTimeUpdates;
197
217
  }