@golemio/public-transport 0.1.0-dev.2918247179 → 0.1.0-dev.2922113447
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.
- package/db/migrations/postgresql/20261007000000-add-color-to-gtfs-feeds.js +53 -0
- package/db/migrations/postgresql/20261007000000-widen-gtfs-stop-id-columns.js +53 -0
- package/db/migrations/postgresql/sqls/20261007000000-add-color-to-gtfs-feeds-down.sql +1 -0
- package/db/migrations/postgresql/sqls/20261007000000-add-color-to-gtfs-feeds-up.sql +17 -0
- package/db/migrations/postgresql/sqls/20261007000000-widen-gtfs-stop-id-columns-down.sql +7 -0
- package/db/migrations/postgresql/sqls/20261007000000-widen-gtfs-stop-id-columns-up.sql +11 -0
- package/dist/integration-engine/gtfs/GtfsFacade.js +28 -4
- package/dist/integration-engine/gtfs/GtfsFacade.js.map +1 -1
- package/dist/integration-engine/gtfs/data-access/precomputed/DeparturesRepository.js +1 -2
- package/dist/integration-engine/gtfs/data-access/precomputed/DeparturesRepository.js.map +1 -1
- package/dist/integration-engine/gtfs/data-access/precomputed/ServicesCalendarRepository.js +54 -51
- package/dist/integration-engine/gtfs/data-access/precomputed/ServicesCalendarRepository.js.map +1 -1
- package/dist/integration-engine/gtfs/workers/timetables/tasks/ImportGtfsFromStorageTask.d.ts +2 -1
- package/dist/integration-engine/gtfs/workers/timetables/tasks/ImportGtfsFromStorageTask.js +30 -17
- package/dist/integration-engine/gtfs/workers/timetables/tasks/ImportGtfsFromStorageTask.js.map +1 -1
- package/dist/output-gateway/shared/data-access/GtfsFeedRepository.d.ts +3 -1
- package/dist/output-gateway/shared/data-access/GtfsFeedRepository.js +2 -1
- package/dist/output-gateway/shared/data-access/GtfsFeedRepository.js.map +1 -1
- package/dist/schema-definitions/gtfs/interfaces/IGtfsFeedDto.d.ts +1 -0
- package/dist/schema-definitions/gtfs/models/GtfsFeedDto.d.ts +5 -0
- package/dist/schema-definitions/gtfs/models/GtfsFeedDto.js +2 -0
- package/dist/schema-definitions/gtfs/models/GtfsFeedDto.js.map +1 -1
- package/dist/schema-definitions/gtfs/models/precomputed/DeparturesModel.js +3 -3
- package/dist/schema-definitions/gtfs/models/precomputed/DeparturesModel.js.map +1 -1
- package/docs/follow-ups.md +17 -0
- package/docs/implementation_documentation.md +7 -0
- package/docs/openapi-output.yaml +7 -0
- package/package.json +1 -1
|
@@ -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', '20261007000000-add-color-to-gtfs-feeds-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', '20261007000000-add-color-to-gtfs-feeds-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,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', '20261007000000-widen-gtfs-stop-id-columns-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', '20261007000000-widen-gtfs-stop-id-columns-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 @@
|
|
|
1
|
+
ALTER TABLE public_transport.gtfs_feeds DROP COLUMN color;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
-- Per-feed display colour (#rrggbb) used by the map for stops of the feed. NULL means the map
|
|
2
|
+
-- falls back to its default colour, so a newly added feed only needs this column set.
|
|
3
|
+
ALTER TABLE public_transport.gtfs_feeds
|
|
4
|
+
ADD COLUMN color varchar(7) NULL
|
|
5
|
+
CONSTRAINT gtfs_feeds_color_check CHECK (color ~ '^#[0-9A-Fa-f]{6}$');
|
|
6
|
+
|
|
7
|
+
-- Backfill the colours previously hardcoded in the map; codes missing in an environment are skipped.
|
|
8
|
+
UPDATE public_transport.gtfs_feeds f
|
|
9
|
+
SET color = v.color
|
|
10
|
+
FROM (VALUES
|
|
11
|
+
('pid', '#dc301b'),
|
|
12
|
+
('kodis', '#c00000'),
|
|
13
|
+
('ids-jmk', '#007e00'),
|
|
14
|
+
('idzk', '#00437d'),
|
|
15
|
+
('poved', '#008837')
|
|
16
|
+
) AS v(code, color)
|
|
17
|
+
WHERE f.code = v.code;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
-- Narrowing back fails if any stored stop id exceeds the old limits -- clear such feeds first.
|
|
2
|
+
ALTER TABLE public_transport.gtfs_precomputed_departures
|
|
3
|
+
ALTER COLUMN stop_id TYPE varchar(25),
|
|
4
|
+
ALTER COLUMN next_stop_id TYPE varchar(30),
|
|
5
|
+
ALTER COLUMN last_stop_id TYPE varchar(30);
|
|
6
|
+
|
|
7
|
+
ALTER TABLE public_transport.vehiclepositions_stop_times_history ALTER COLUMN gtfs_stop_id TYPE varchar(20);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
-- Widen GTFS stop id copies to match their source gtfs_stops.stop_id (varchar(255)): new feeds use
|
|
2
|
+
-- composite stop ids such as "105_1_Z115+117+120+121+122+123" (30 chars), which overflow the
|
|
3
|
+
-- PID-sized limits below. ALTER on the partitioned parents cascades to all attached partitions;
|
|
4
|
+
-- tmp tables are recreated per import via LIKE parent. Widening varchar is metadata-only (no rewrite)
|
|
5
|
+
-- and no view depends on these columns.
|
|
6
|
+
ALTER TABLE public_transport.gtfs_precomputed_departures
|
|
7
|
+
ALTER COLUMN stop_id TYPE varchar(255),
|
|
8
|
+
ALTER COLUMN next_stop_id TYPE varchar(255),
|
|
9
|
+
ALTER COLUMN last_stop_id TYPE varchar(255);
|
|
10
|
+
|
|
11
|
+
ALTER TABLE public_transport.vehiclepositions_stop_times_history ALTER COLUMN gtfs_stop_id TYPE varchar(255);
|
|
@@ -31,6 +31,18 @@ const FeedTableSuffix_1 = require("./helpers/FeedTableSuffix");
|
|
|
31
31
|
const SourceTableSuffixEnum_1 = require("./helpers/SourceTableSuffixEnum");
|
|
32
32
|
const GtfsContainerToken_1 = require("./ioc/GtfsContainerToken");
|
|
33
33
|
const HelperTypes_1 = require("./workers/timetables/tasks/helpers/HelperTypes");
|
|
34
|
+
// Tables a feed may legitimately leave empty: optional GTFS files (an absent file is swapped in as an
|
|
35
|
+
// empty table, see ImportGtfsFromStorageTask) and the calendar pair, of which the GTFS spec requires
|
|
36
|
+
// only one -- CALENDAR_MODELS must hold at least one row between them.
|
|
37
|
+
const EMPTY_ALLOWED_MODELS = [
|
|
38
|
+
"calendar",
|
|
39
|
+
"calendar_dates",
|
|
40
|
+
"route_sub_agencies",
|
|
41
|
+
"run_numbers",
|
|
42
|
+
"shapes",
|
|
43
|
+
"transfers",
|
|
44
|
+
];
|
|
45
|
+
const CALENDAR_MODELS = ["calendar", "calendar_dates"];
|
|
34
46
|
let GtfsFacade = class GtfsFacade {
|
|
35
47
|
constructor(gtfsRepository, gtfsMetadataRepository, departureRepository, databaseConnector) {
|
|
36
48
|
this.gtfsRepository = gtfsRepository;
|
|
@@ -40,11 +52,13 @@ let GtfsFacade = class GtfsFacade {
|
|
|
40
52
|
this.name = this.constructor.name;
|
|
41
53
|
this.checkSavedTmpTables = async (dataset, version, feedCode) => {
|
|
42
54
|
const tables = await this.gtfsMetadataRepository.getAllSaved(dataset, version, feedCode);
|
|
43
|
-
const
|
|
55
|
+
const tableSuffix = (0, FeedTableSuffix_1.feedTableSuffix)(SourceTableSuffixEnum_1.SourceTableSuffixEnum.Tmp, feedCode);
|
|
56
|
+
const modelByTmpTableName = new Map();
|
|
44
57
|
for (const table of tables) {
|
|
45
|
-
const
|
|
46
|
-
|
|
58
|
+
const modelName = table.dataValues.tn;
|
|
59
|
+
modelByTmpTableName.set(gtfs_1.Gtfs[modelName].pgTableName + tableSuffix, modelName);
|
|
47
60
|
}
|
|
61
|
+
const tablesArray = [...modelByTmpTableName.keys()].map((tableName) => `'${tableName}'`);
|
|
48
62
|
const connection = this.databaseConnector.getConnection();
|
|
49
63
|
const result = await connection.query(`
|
|
50
64
|
SELECT table_name AS name, count_rows(table_schema, table_name) AS total
|
|
@@ -55,9 +69,19 @@ let GtfsFacade = class GtfsFacade {
|
|
|
55
69
|
AND table_schema = '${const_1.PG_SCHEMA}';
|
|
56
70
|
`, { type: sequelize_1.default.QueryTypes.SELECT });
|
|
57
71
|
helpers_1.log.info(`Datasets: total rows for ${dataset}: ${JSON.stringify(result)}`);
|
|
58
|
-
if (!result || !result.length
|
|
72
|
+
if (!result || !result.length) {
|
|
59
73
|
throw new golemio_errors_1.GeneralError("Empty table found", this.constructor.name);
|
|
60
74
|
}
|
|
75
|
+
const rowsByModel = new Map(result.map((table) => [modelByTmpTableName.get(table.name), Number(table.total)]));
|
|
76
|
+
for (const [modelName, total] of rowsByModel) {
|
|
77
|
+
if (total === 0 && !(modelName && EMPTY_ALLOWED_MODELS.includes(modelName))) {
|
|
78
|
+
throw new golemio_errors_1.GeneralError(`Empty table found: ${modelName}`, this.constructor.name);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const calendarTotals = CALENDAR_MODELS.map((modelName) => rowsByModel.get(modelName)).filter((total) => total !== undefined);
|
|
82
|
+
if (calendarTotals.length > 0 && calendarTotals.every((total) => total === 0)) {
|
|
83
|
+
throw new golemio_errors_1.GeneralError("Empty calendar found: a feed needs rows in calendar or calendar_dates.", this.constructor.name);
|
|
84
|
+
}
|
|
61
85
|
};
|
|
62
86
|
// Note: the partition swap (replaceStaticTables/replacePrecomputedTables) commits per-table
|
|
63
87
|
// internally (see GtfsRepository.replaceAllTable / the gtfs_hotswap procedure) and therefore cannot
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GtfsFacade.js","sourceRoot":"","sources":["../../../src/integration-engine/gtfs/GtfsFacade.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,2DAM0C;AAC1C,sCAAiF;AACjF,0DAAuC;AACvC,wDAAmD;AAGnD,wEAAqE;AACrE,2EAAoE;AACpE,6EAAwE;AACxE,oFAAuE;AACvE,iEAAwE;AACxE,qEAAkE;AAClE,iEAA8D;AAC9D,+DAA4D;AAC5D,2EAAwE;AACxE,iEAA8D;AAC9D,gFAAuF;
|
|
1
|
+
{"version":3,"file":"GtfsFacade.js","sourceRoot":"","sources":["../../../src/integration-engine/gtfs/GtfsFacade.ts"],"names":[],"mappings":"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"}
|
|
@@ -63,7 +63,7 @@ let DeparturesRepository = class DeparturesRepository extends models_1.PostgresM
|
|
|
63
63
|
t2.trip_headsign,
|
|
64
64
|
t2.trip_short_name,
|
|
65
65
|
t2.wheelchair_accessible,
|
|
66
|
-
|
|
66
|
+
t4.service_id,
|
|
67
67
|
t4.date,
|
|
68
68
|
t5.route_short_name,
|
|
69
69
|
coalesce(t5.route_type, :defaultRouteType) AS route_type,
|
|
@@ -90,7 +90,6 @@ let DeparturesRepository = class DeparturesRepository extends models_1.PostgresM
|
|
|
90
90
|
LEFT JOIN gtfs_trips${entitySuffix} t2 ON t.trip_id = t2.trip_id
|
|
91
91
|
INNER JOIN gtfs_precomputed_services_calendar${precomputedTmpSuffix} t4 ON t2.service_id = t4.service_id
|
|
92
92
|
INNER JOIN gtfs_precomputed_minmax_stop_sequences${precomputedTmpSuffix} t1 ON t.trip_id = t1.trip_id
|
|
93
|
-
LEFT JOIN gtfs_calendar${entitySuffix} t3 ON t2.service_id = t3.service_id
|
|
94
93
|
LEFT JOIN gtfs_stops${entitySuffix} t0 ON t.stop_id = t0.stop_id
|
|
95
94
|
LEFT JOIN gtfs_routes${entitySuffix} t5 ON t2.route_id = t5.route_id
|
|
96
95
|
-- gtfs_cis_stops is PID-only and only ever has an _actual_pid partition (no per-feed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeparturesRepository.js","sourceRoot":"","sources":["../../../../../src/integration-engine/gtfs/data-access/precomputed/DeparturesRepository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,uEAA4D;AAG5D,gEAAuC;AAEvC,wFAA+D;AAE/D,wEAAqE;AAErE,yEAAqF;AACrF,6EAAwE;AACxE,mFAAkF;AAClF,mEAAoE;AACpE,iEAAwE;AACxE,mEAAgE;AAChE,+EAA4E;AAGrE,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,sBAAa;IACnD,YACoC,MAA6B,EACnC,MAAuB;QAEjD,KAAK,CACD,sBAAsB,EACtB;YACI,WAAW,EAAE,6BAAe,CAAC,UAAU;YACvC,QAAQ,EAAE,iBAAS;YACnB,yBAAyB,EAAE,6BAAe,CAAC,cAAc;YACzD,kBAAkB,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC;YACtD,UAAU,EAAE,YAAY;SAC3B,EACD,IAAI,uCAAmB,CAAC,sBAAsB,EAAE,6BAAe,CAAC,UAAU,CAAC,CAC9E,CAAC;QAbsC,WAAM,GAAN,MAAM,CAAe;QAC3B,WAAM,GAAN,MAAM,CAAS;QAe9C,sBAAiB,GAAG,KAAK,EAC5B,iBAAwC,EACxC,QAAgB,EAChB,MAAc,EACD,EAAE;YACf,MAAM,SAAS,GAAG,6BAAe,CAAC,UAAU,CAAC;YAC7C,MAAM,YAAY,GAAG,SAAS,GAAG,IAAA,iCAAe,EAAC,6CAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YACtF,MAAM,YAAY,GAAG,IAAA,iCAAe,EAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YAClE,MAAM,oBAAoB,GAAG,IAAA,iCAAe,EAAC,6CAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAElF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;YACpE,MAAM,qBAAqB,GACvB,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,4EAA4E,CAAC,CAAC,CAAC,EAAE,CAAC;YAE3G,4BAA4B;YAC5B,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCA2Cc,YAAY;sCACR,YAAY;+DACa,oBAAoB;mEAChB,oBAAoB;
|
|
1
|
+
{"version":3,"file":"DeparturesRepository.js","sourceRoot":"","sources":["../../../../../src/integration-engine/gtfs/data-access/precomputed/DeparturesRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,66 +19,69 @@ class ServicesCalendarRepository extends models_1.PostgresModel {
|
|
|
19
19
|
}, new golemio_validator_1.JSONSchemaValidator("ServicesCalendarRepositoryValidator", gtfs_1.Gtfs.servicesCalendar.outputJsonSchema));
|
|
20
20
|
this.populate = async (sourceTableSuffix, feedCode, feedId) => {
|
|
21
21
|
const entitySuffix = (0, FeedTableSuffix_1.feedTableSuffix)(sourceTableSuffix, feedCode);
|
|
22
|
+
// A service runs on a date when calendar.txt schedules it (weekday within start..end) and no
|
|
23
|
+
// exception_type=2 removes it, OR when calendar_dates.txt adds it (exception_type=1). The second
|
|
24
|
+
// branch must not depend on gtfs_calendar: the GTFS spec allows a feed to define services in
|
|
25
|
+
// calendar_dates.txt alone (same semantics as the get_service_ids_from_gtfs_calendar SQL function).
|
|
22
26
|
const sql = `
|
|
23
|
-
|
|
24
|
-
dates.date,
|
|
25
|
-
date_part('day', dates.date - to_char(timezone('Europe/Prague', now()), 'YYYY-MM-DD')::timestamp) AS day_diff,
|
|
26
|
-
service_id,
|
|
27
|
-
:feedId AS feed_id
|
|
28
|
-
FROM (
|
|
27
|
+
WITH dates AS (
|
|
29
28
|
SELECT
|
|
30
29
|
date_trunc('day', dd.dd)::date AS date
|
|
31
30
|
FROM generate_series(
|
|
32
31
|
( SELECT (CURRENT_TIMESTAMP - interval '1 day') )::date,
|
|
33
32
|
( SELECT (CURRENT_TIMESTAMP + interval '2 days') )::date,
|
|
34
33
|
'1 day'
|
|
35
|
-
) dd(dd)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
AND
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
) AND (
|
|
65
|
-
NOT service_id IN (
|
|
66
|
-
SELECT service_id
|
|
67
|
-
FROM "${const_1.PG_SCHEMA}".gtfs_calendar_dates${entitySuffix} calendar_dates
|
|
68
|
-
WHERE (
|
|
69
|
-
exception_type = 2
|
|
70
|
-
AND dates.date = calendar_dates.date::date
|
|
71
|
-
)
|
|
72
|
-
)
|
|
73
|
-
)) OR service_id IN (
|
|
74
|
-
SELECT service_id
|
|
75
|
-
FROM "${const_1.PG_SCHEMA}".gtfs_calendar_dates${entitySuffix} calendar_dates
|
|
76
|
-
WHERE
|
|
77
|
-
calendar_dates.exception_type = 1
|
|
78
|
-
AND dates.date = calendar_dates.date::date
|
|
34
|
+
) dd(dd)
|
|
35
|
+
), services AS (
|
|
36
|
+
SELECT dates.date, calendar.service_id
|
|
37
|
+
FROM dates
|
|
38
|
+
INNER JOIN "${const_1.PG_SCHEMA}".gtfs_calendar${entitySuffix} calendar
|
|
39
|
+
ON dates.date >= calendar.start_date::date
|
|
40
|
+
AND dates.date <= calendar.end_date::date
|
|
41
|
+
WHERE (
|
|
42
|
+
(
|
|
43
|
+
btrim(to_char(dates.date::timestamptz, 'day')) = 'monday'
|
|
44
|
+
AND calendar.monday = 1
|
|
45
|
+
) OR (
|
|
46
|
+
btrim(to_char(dates.date::timestamptz, 'day')) = 'tuesday'
|
|
47
|
+
AND calendar.tuesday = 1
|
|
48
|
+
) OR (
|
|
49
|
+
btrim(to_char(dates.date::timestamptz, 'day')) = 'wednesday'
|
|
50
|
+
AND calendar.wednesday = 1
|
|
51
|
+
) OR (
|
|
52
|
+
btrim(to_char(dates.date::timestamptz, 'day')) = 'thursday'
|
|
53
|
+
AND calendar.thursday = 1
|
|
54
|
+
) OR (
|
|
55
|
+
btrim(to_char(dates.date::timestamptz, 'day')) = 'friday'
|
|
56
|
+
AND calendar.friday = 1
|
|
57
|
+
) OR (
|
|
58
|
+
btrim(to_char(dates.date::timestamptz, 'day')) = 'saturday'
|
|
59
|
+
AND calendar.saturday = 1
|
|
60
|
+
) OR (
|
|
61
|
+
btrim(to_char(dates.date::timestamptz, 'day')) = 'sunday'
|
|
62
|
+
AND calendar.sunday = 1
|
|
79
63
|
)
|
|
64
|
+
) AND NOT EXISTS (
|
|
65
|
+
SELECT 1
|
|
66
|
+
FROM "${const_1.PG_SCHEMA}".gtfs_calendar_dates${entitySuffix} calendar_dates
|
|
67
|
+
WHERE calendar_dates.service_id = calendar.service_id
|
|
68
|
+
AND calendar_dates.exception_type = 2
|
|
69
|
+
AND calendar_dates.date::date = dates.date
|
|
80
70
|
)
|
|
81
|
-
|
|
71
|
+
UNION
|
|
72
|
+
SELECT dates.date, calendar_dates.service_id
|
|
73
|
+
FROM dates
|
|
74
|
+
INNER JOIN "${const_1.PG_SCHEMA}".gtfs_calendar_dates${entitySuffix} calendar_dates
|
|
75
|
+
ON calendar_dates.date::date = dates.date
|
|
76
|
+
WHERE calendar_dates.exception_type = 1
|
|
77
|
+
)
|
|
78
|
+
SELECT
|
|
79
|
+
services.date,
|
|
80
|
+
date_part('day', services.date - to_char(timezone('Europe/Prague', now()), 'YYYY-MM-DD')::timestamp) AS day_diff,
|
|
81
|
+
services.service_id,
|
|
82
|
+
:feedId AS feed_id
|
|
83
|
+
FROM services
|
|
84
|
+
ORDER BY services.date
|
|
82
85
|
`;
|
|
83
86
|
try {
|
|
84
87
|
const tmpTable = gtfs_1.Gtfs.servicesCalendar.pgTableName + (0, FeedTableSuffix_1.feedTableSuffix)(SourceTableSuffixEnum_1.SourceTableSuffixEnum.Tmp, feedCode);
|
package/dist/integration-engine/gtfs/data-access/precomputed/ServicesCalendarRepository.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServicesCalendarRepository.js","sourceRoot":"","sources":["../../../../../src/integration-engine/gtfs/data-access/precomputed/ServicesCalendarRepository.ts"],"names":[],"mappings":";;;AAAA,gEAAuC;AACvC,8DAAiC;AACjC,2EAAoE;AACpE,yEAAqF;AACrF,mFAAkF;AAClF,mEAAgE;AAChE,+EAA4E;AAE5E,MAAa,0BAA2B,SAAQ,sBAAa;IACzD;QACI,KAAK,CACD,4BAA4B,EAC5B;YACI,yBAAyB,EAAE,WAAI,CAAC,gBAAgB,CAAC,yBAAyB;YAC1E,WAAW,EAAE,WAAI,CAAC,gBAAgB,CAAC,WAAW;YAC9C,QAAQ,EAAE,iBAAS;YACnB,UAAU,EAAE,YAAY;YACxB,kBAAkB,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC;SACzD,EACD,IAAI,uCAAmB,CAAC,qCAAqC,EAAE,WAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CACzG,CAAC;QAGC,aAAQ,GAAG,KAAK,EAAE,iBAAwC,EAAE,QAAgB,EAAE,MAAc,EAAiB,EAAE;YAClH,MAAM,YAAY,GAAG,IAAA,iCAAe,EAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YAClE,MAAM,GAAG,GAAG
|
|
1
|
+
{"version":3,"file":"ServicesCalendarRepository.js","sourceRoot":"","sources":["../../../../../src/integration-engine/gtfs/data-access/precomputed/ServicesCalendarRepository.ts"],"names":[],"mappings":";;;AAAA,gEAAuC;AACvC,8DAAiC;AACjC,2EAAoE;AACpE,yEAAqF;AACrF,mFAAkF;AAClF,mEAAgE;AAChE,+EAA4E;AAE5E,MAAa,0BAA2B,SAAQ,sBAAa;IACzD;QACI,KAAK,CACD,4BAA4B,EAC5B;YACI,yBAAyB,EAAE,WAAI,CAAC,gBAAgB,CAAC,yBAAyB;YAC1E,WAAW,EAAE,WAAI,CAAC,gBAAgB,CAAC,WAAW;YAC9C,QAAQ,EAAE,iBAAS;YACnB,UAAU,EAAE,YAAY;YACxB,kBAAkB,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC;SACzD,EACD,IAAI,uCAAmB,CAAC,qCAAqC,EAAE,WAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CACzG,CAAC;QAGC,aAAQ,GAAG,KAAK,EAAE,iBAAwC,EAAE,QAAgB,EAAE,MAAc,EAAiB,EAAE;YAClH,MAAM,YAAY,GAAG,IAAA,iCAAe,EAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YAClE,6FAA6F;YAC7F,iGAAiG;YACjG,6FAA6F;YAC7F,oGAAoG;YACpG,MAAM,GAAG,GAAG;;;;;;;;;;;;8BAYU,iBAAS,kBAAkB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BA4BzC,iBAAS,wBAAwB,YAAY;;;;;;;;8BAQ3C,iBAAS,wBAAwB,YAAY;;;;;;;;;;;SAWlE,CAAC;YAEF,IAAI,CAAC;gBACD,MAAM,QAAQ,GAAG,WAAI,CAAC,gBAAgB,CAAC,WAAW,GAAG,IAAA,iCAAe,EAAC,6CAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAE1G,MAAM,IAAI,CAAC,cAAc,CAAC,SAAU,CAAC,KAAK,CAAC,gBAAgB,iBAAS,KAAK,QAAQ,IAAI,GAAG,GAAG,EAAE;oBACzF,YAAY,EAAE,EAAE,MAAM,EAAE;iBAC3B,CAAC,CAAC;YACP,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,aAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACf,MAAM,GAAG,CAAC;YACd,CAAC;QACL,CAAC,CAAC;IA/EF,CAAC;CAgFJ;AA7FD,gEA6FC"}
|
package/dist/integration-engine/gtfs/workers/timetables/tasks/ImportGtfsFromStorageTask.d.ts
CHANGED
|
@@ -24,7 +24,8 @@ export declare class ImportGtfsFromStorageTask extends AbstractTask<IImportGtfsF
|
|
|
24
24
|
/**
|
|
25
25
|
* Downloads "gtfs-static/<feedCode>.zip" from blob storage, unzips it, validates the required GTFS file set
|
|
26
26
|
* and pipes each ingested file into the same Redis staging namespace the FTP download path uses,
|
|
27
|
-
* so the downstream transformAndSaveData tasks read both paths' files identically.
|
|
27
|
+
* so the downstream transformAndSaveData tasks read both paths' files identically. Also lists the known
|
|
28
|
+
* files absent from the zip, whose tables get replaced with empty ones.
|
|
28
29
|
*/
|
|
29
30
|
private stageFeedFilesFromStorage;
|
|
30
31
|
}
|
|
@@ -37,24 +37,22 @@ const node_os_1 = __importDefault(require("node:os"));
|
|
|
37
37
|
const constants_1 = require("../constants");
|
|
38
38
|
const HelperTypes_1 = require("./helpers/HelperTypes");
|
|
39
39
|
const ImportGtfsFromStorageSchema_1 = require("./schema/ImportGtfsFromStorageSchema");
|
|
40
|
-
// The GTFS spec's
|
|
41
|
-
const REQUIRED_GTFS_FILES = [
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
"routes.txt",
|
|
46
|
-
"stop_times.txt",
|
|
47
|
-
"stops.txt",
|
|
48
|
-
"trips.txt",
|
|
49
|
-
];
|
|
40
|
+
// The GTFS spec's required files -- every feed must carry these, regardless of IDS region.
|
|
41
|
+
const REQUIRED_GTFS_FILES = ["agency.txt", "routes.txt", "stop_times.txt", "stops.txt", "trips.txt"];
|
|
42
|
+
// Conditionally required by the GTFS spec: a feed must carry at least one of them (e.g. feeds defining
|
|
43
|
+
// every service date explicitly ship calendar_dates.txt alone).
|
|
44
|
+
const CALENDAR_GTFS_FILES = ["calendar.txt", "calendar_dates.txt"];
|
|
50
45
|
// Present in some feeds but not universally (e.g. IDS JMK ships none of these) -- ingested
|
|
51
|
-
// when included in the zip,
|
|
46
|
+
// when included in the zip, replaced with an empty table otherwise. feed_info.txt has no corresponding gtfs_*
|
|
52
47
|
// table/transformation yet (follow-up), so it's never ingested even when present.
|
|
53
48
|
// run_numbers.txt is not a GTFS file at all -- it's the ROPID run-numbers crosswalk (normally
|
|
54
49
|
// FTP-only, see DownloadDatasetsTask), included here so a feed can bundle its own equivalent
|
|
55
50
|
// in the same zip and get the richer run-based matching (see TripScheduleRepository.populate).
|
|
56
51
|
const OPTIONAL_GTFS_FILES = ["feed_info.txt", "route_sub_agencies.txt", "run_numbers.txt", "shapes.txt", "transfers.txt"];
|
|
57
|
-
const KNOWN_GTFS_FILES = [...REQUIRED_GTFS_FILES, ...OPTIONAL_GTFS_FILES];
|
|
52
|
+
const KNOWN_GTFS_FILES = [...REQUIRED_GTFS_FILES, ...CALENDAR_GTFS_FILES, ...OPTIONAL_GTFS_FILES];
|
|
53
|
+
// Known files without a gtfs_* table -- never staged, never swapped.
|
|
54
|
+
const UNSTORED_GTFS_FILES = ["feed_info.txt"];
|
|
55
|
+
const toModelName = (fileName) => fileName.replace(/\.txt$/, "");
|
|
58
56
|
const datasetForFile = (fileName) => fileName === "run_numbers.txt" ? DatasetEnum_1.DatasetEnum.RUN_NUMBERS : DatasetEnum_1.DatasetEnum.GTFS;
|
|
59
57
|
// Feed zips live under one folder in the blob container: "gtfs-static/<feedCode>.zip".
|
|
60
58
|
const STORAGE_FOLDER = "gtfs-static";
|
|
@@ -80,7 +78,8 @@ let ImportGtfsFromStorageTask = class ImportGtfsFromStorageTask extends workers_
|
|
|
80
78
|
/**
|
|
81
79
|
* Downloads "gtfs-static/<feedCode>.zip" from blob storage, unzips it, validates the required GTFS file set
|
|
82
80
|
* and pipes each ingested file into the same Redis staging namespace the FTP download path uses,
|
|
83
|
-
* so the downstream transformAndSaveData tasks read both paths' files identically.
|
|
81
|
+
* so the downstream transformAndSaveData tasks read both paths' files identically. Also lists the known
|
|
82
|
+
* files absent from the zip, whose tables get replaced with empty ones.
|
|
84
83
|
*/
|
|
85
84
|
this.stageFeedFilesFromStorage = async (feedCode) => {
|
|
86
85
|
const blobKey = `${STORAGE_FOLDER}/${feedCode}.zip`;
|
|
@@ -104,17 +103,21 @@ let ImportGtfsFromStorageTask = class ImportGtfsFromStorageTask extends workers_
|
|
|
104
103
|
if (missing.length > 0) {
|
|
105
104
|
throw new golemio_errors_1.GeneralError(`Feed zip "${blobKey}" is missing required GTFS file(s): ${missing.join(", ")}`, this.constructor.name);
|
|
106
105
|
}
|
|
106
|
+
if (!CALENDAR_GTFS_FILES.some((name) => foundNames.has(name))) {
|
|
107
|
+
throw new golemio_errors_1.GeneralError(`Feed zip "${blobKey}" is missing a calendar: it needs ${CALENDAR_GTFS_FILES.join(" or ")}.`, this.constructor.name);
|
|
108
|
+
}
|
|
107
109
|
for (const file of inflated.files) {
|
|
108
|
-
if (file.name
|
|
110
|
+
if (UNSTORED_GTFS_FILES.includes(file.name)) {
|
|
109
111
|
continue;
|
|
110
112
|
}
|
|
111
113
|
const redisKey = `${feedCode}/${file.name}`;
|
|
112
114
|
await this.staticFileRedisRepository.pipeStream(redisKey, node_fs_1.default.createReadStream(file.path));
|
|
113
115
|
// downstream (datasetFileModelMap/GtfsTransformation) keys on the bare model name,
|
|
114
116
|
// e.g. "agency", never the file name "agency.txt"
|
|
115
|
-
stagedFiles.push({ name: file.name
|
|
117
|
+
stagedFiles.push({ name: toModelName(file.name), redisKey, dataset: datasetForFile(file.name) });
|
|
116
118
|
}
|
|
117
|
-
|
|
119
|
+
const absentModels = KNOWN_GTFS_FILES.filter((name) => !foundNames.has(name) && !UNSTORED_GTFS_FILES.includes(name)).map(toModelName);
|
|
120
|
+
return { stagedFiles, absentModels };
|
|
118
121
|
}
|
|
119
122
|
finally {
|
|
120
123
|
if (extractionPath) {
|
|
@@ -127,7 +130,7 @@ let ImportGtfsFromStorageTask = class ImportGtfsFromStorageTask extends workers_
|
|
|
127
130
|
const { feedCode } = data;
|
|
128
131
|
// fail loudly rather than silently provisioning a feed from a stray blob
|
|
129
132
|
await this.feedRepository.getFeedIdByCode(feedCode);
|
|
130
|
-
const files = await this.stageFeedFilesFromStorage(feedCode);
|
|
133
|
+
const { stagedFiles: files, absentModels } = await this.stageFeedFilesFromStorage(feedCode);
|
|
131
134
|
this.logger.info(`Storage import: staged ${files.length} files for feed ${feedCode}`);
|
|
132
135
|
const dbLastModified = await this.metadataRepository.getLastModified(DatasetEnum_1.DatasetEnum.GTFS, feedCode);
|
|
133
136
|
const version = dbLastModified.version + 1;
|
|
@@ -159,6 +162,16 @@ let ImportGtfsFromStorageTask = class ImportGtfsFromStorageTask extends workers_
|
|
|
159
162
|
version,
|
|
160
163
|
}, undefined, feedCode);
|
|
161
164
|
await this.gtfsRepository.createTmpTables(feedCode);
|
|
165
|
+
// A known file absent from the zip still replaces the feed's table -- with the empty tmp table
|
|
166
|
+
// createTmpTables just made -- so a re-import never keeps rows from a file the feed dropped.
|
|
167
|
+
// Recorded under the GTFS dataset (incl. run_numbers) so a feed without run numbers never
|
|
168
|
+
// enters the RUN_NUMBERS dataset bookkeeping.
|
|
169
|
+
for (const modelName of absentModels) {
|
|
170
|
+
await this.metadataRepository.save({ dataset: DatasetEnum_1.DatasetEnum.GTFS, key: modelName, type: RopidMetadataModel_1.MetaTypeEnum.STATE, value: RopidMetadataModel_1.MetaStateEnum.SAVED, version }, undefined, feedCode);
|
|
171
|
+
}
|
|
172
|
+
if (absentModels.length > 0) {
|
|
173
|
+
this.logger.info(`Storage import: replacing absent tables with empty ones for feed ${feedCode}: ${absentModels}`);
|
|
174
|
+
}
|
|
162
175
|
const subscriber = this.gtfsRedisChannel.createSubscriber({
|
|
163
176
|
channelSuffix: node_os_1.default.hostname(),
|
|
164
177
|
maxMessageCount: cachedDatasets.length,
|
package/dist/integration-engine/gtfs/workers/timetables/tasks/ImportGtfsFromStorageTask.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImportGtfsFromStorageTask.js","sourceRoot":"","sources":["../../../../../../src/integration-engine/gtfs/workers/timetables/tasks/ImportGtfsFromStorageTask.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,4EAAyE;AACzE,gFAA6E;AAC7E,wEAAqE;AACrE,oGAAiG;AACjG,8DAA2D;AAC3D,wEAAqE;AACrE,8EAAoG;
|
|
1
|
+
{"version":3,"file":"ImportGtfsFromStorageTask.js","sourceRoot":"","sources":["../../../../../../src/integration-engine/gtfs/workers/timetables/tasks/ImportGtfsFromStorageTask.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Public view of a gtfs_feeds row. `bbox` is the extent of the feed's stops as
|
|
3
|
-
* [minLon, minLat, maxLon, maxLat], null when the feed has no imported stops yet.
|
|
3
|
+
* [minLon, minLat, maxLon, maxLat], null when the feed has no imported stops yet. `color` is the
|
|
4
|
+
* feed's #rrggbb display colour for the map, null when not set.
|
|
4
5
|
*/
|
|
5
6
|
export interface IGtfsFeedOutput {
|
|
6
7
|
code: string;
|
|
7
8
|
name: string;
|
|
8
9
|
timezone: string | null;
|
|
10
|
+
color: string | null;
|
|
9
11
|
bbox: [number, number, number, number] | null;
|
|
10
12
|
}
|
|
11
13
|
/**
|
|
@@ -73,7 +73,7 @@ class GtfsFeedRepository {
|
|
|
73
73
|
this.getAll = async () => {
|
|
74
74
|
try {
|
|
75
75
|
const connection = this.connector.getConnection();
|
|
76
|
-
const rows = await connection.query(`SELECT f.code, f.name, f.timezone, s.min_lon, s.min_lat, s.max_lon, s.max_lat
|
|
76
|
+
const rows = await connection.query(`SELECT f.code, f.name, f.timezone, f.color, s.min_lon, s.min_lat, s.max_lon, s.max_lat
|
|
77
77
|
FROM "${const_1.PG_SCHEMA}".gtfs_feeds f
|
|
78
78
|
LEFT JOIN (
|
|
79
79
|
SELECT feed_id,
|
|
@@ -90,6 +90,7 @@ class GtfsFeedRepository {
|
|
|
90
90
|
code: row.code,
|
|
91
91
|
name: row.name,
|
|
92
92
|
timezone: row.timezone,
|
|
93
|
+
color: row.color,
|
|
93
94
|
bbox: row.min_lon === null || row.min_lat === null || row.max_lon === null || row.max_lat === null
|
|
94
95
|
? null
|
|
95
96
|
: [row.min_lon, row.min_lat, row.max_lon, row.max_lat],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GtfsFeedRepository.js","sourceRoot":"","sources":["../../../../src/output-gateway/shared/data-access/GtfsFeedRepository.ts"],"names":[],"mappings":";;;;;;AAAA,6DAAuC;AAEvC,wEAAqE;AACrE,+DAA+E;AAC/E,6EAAwE;AACxE,oFAA4D;
|
|
1
|
+
{"version":3,"file":"GtfsFeedRepository.js","sourceRoot":"","sources":["../../../../src/output-gateway/shared/data-access/GtfsFeedRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export declare class GtfsFeedDto extends Model<InferAttributes<GtfsFeedDto>, Inf
|
|
|
5
5
|
code: string;
|
|
6
6
|
name: string;
|
|
7
7
|
timezone: CreationOptional<string>;
|
|
8
|
+
color: CreationOptional<string | null>;
|
|
8
9
|
created_at: CreationOptional<Date>;
|
|
9
10
|
updated_at: CreationOptional<Date>;
|
|
10
11
|
static attributeModel: ModelAttributes<GtfsFeedDto>;
|
|
@@ -26,6 +27,10 @@ export declare class GtfsFeedDto extends Model<InferAttributes<GtfsFeedDto>, Inf
|
|
|
26
27
|
type: string;
|
|
27
28
|
nullable: boolean;
|
|
28
29
|
};
|
|
30
|
+
color: {
|
|
31
|
+
type: string;
|
|
32
|
+
nullable: boolean;
|
|
33
|
+
};
|
|
29
34
|
created_at: {
|
|
30
35
|
type: string;
|
|
31
36
|
nullable: boolean;
|
|
@@ -14,6 +14,7 @@ GtfsFeedDto.attributeModel = {
|
|
|
14
14
|
code: { type: sequelize_1.DataTypes.STRING(50), unique: true },
|
|
15
15
|
name: sequelize_1.DataTypes.STRING,
|
|
16
16
|
timezone: sequelize_1.DataTypes.STRING(100),
|
|
17
|
+
color: sequelize_1.DataTypes.STRING(7),
|
|
17
18
|
};
|
|
18
19
|
GtfsFeedDto.jsonSchema = {
|
|
19
20
|
type: "array",
|
|
@@ -24,6 +25,7 @@ GtfsFeedDto.jsonSchema = {
|
|
|
24
25
|
code: { type: "string" },
|
|
25
26
|
name: { type: "string" },
|
|
26
27
|
timezone: { type: "string", nullable: true },
|
|
28
|
+
color: { type: "string", nullable: true },
|
|
27
29
|
created_at: { type: "object", nullable: true },
|
|
28
30
|
updated_at: { type: "object", nullable: true },
|
|
29
31
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GtfsFeedDto.js","sourceRoot":"","sources":["../../../../src/schema-definitions/gtfs/models/GtfsFeedDto.ts"],"names":[],"mappings":";;;AAAA,mEAO6C;AAG7C,MAAa,WACT,SAAQ,iBAAyE;;AADrF,
|
|
1
|
+
{"version":3,"file":"GtfsFeedDto.js","sourceRoot":"","sources":["../../../../src/schema-definitions/gtfs/models/GtfsFeedDto.ts"],"names":[],"mappings":";;;AAAA,mEAO6C;AAG7C,MAAa,WACT,SAAQ,iBAAyE;;AADrF,kCAwCC;AA5BiB,0BAAc,GAAiC;IACzD,OAAO,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,OAAO;QACvB,UAAU,EAAE,IAAI;QAChB,aAAa,EAAE,IAAI;KACtB;IACD,IAAI,EAAE,EAAE,IAAI,EAAE,qBAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;IAClD,IAAI,EAAE,qBAAS,CAAC,MAAM;IACtB,QAAQ,EAAE,qBAAS,CAAC,MAAM,CAAC,GAAG,CAAC;IAC/B,KAAK,EAAE,qBAAS,CAAC,MAAM,CAAC,CAAC,CAAC;CAC7B,CAAC;AAEY,sBAAU,GAAG;IACvB,IAAI,EAAE,OAAO;IACb,KAAK,EAAE;QACH,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACR,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC3B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC5C,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YACzC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC9C,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;SACjD;QACD,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;KACxC;CACJ,CAAC"}
|
|
@@ -20,7 +20,7 @@ DeparturesModel.attributeModel = {
|
|
|
20
20
|
departure_time: sequelize_1.DataTypes.STRING(20),
|
|
21
21
|
departure_datetime: sequelize_1.DataTypes.DATE,
|
|
22
22
|
stop_id: {
|
|
23
|
-
type: sequelize_1.DataTypes.STRING(
|
|
23
|
+
type: sequelize_1.DataTypes.STRING(255),
|
|
24
24
|
allowNull: false,
|
|
25
25
|
},
|
|
26
26
|
stop_name: sequelize_1.DataTypes.STRING(100),
|
|
@@ -52,9 +52,9 @@ DeparturesModel.attributeModel = {
|
|
|
52
52
|
is_regional: sequelize_1.DataTypes.CHAR(1),
|
|
53
53
|
is_substitute_transport: sequelize_1.DataTypes.CHAR(1),
|
|
54
54
|
next_stop_sequence: sequelize_1.DataTypes.SMALLINT,
|
|
55
|
-
next_stop_id: sequelize_1.DataTypes.STRING(
|
|
55
|
+
next_stop_id: sequelize_1.DataTypes.STRING(255),
|
|
56
56
|
last_stop_sequence: sequelize_1.DataTypes.SMALLINT,
|
|
57
|
-
last_stop_id: sequelize_1.DataTypes.STRING(
|
|
57
|
+
last_stop_id: sequelize_1.DataTypes.STRING(255),
|
|
58
58
|
cis_stop_group_id: sequelize_1.DataTypes.INTEGER,
|
|
59
59
|
trip_headsign_icons: sequelize_1.DataTypes.TEXT,
|
|
60
60
|
trip_connections: sequelize_1.DataTypes.JSONB,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeparturesModel.js","sourceRoot":"","sources":["../../../../../src/schema-definitions/gtfs/models/precomputed/DeparturesModel.ts"],"names":[],"mappings":";;;AACA,mEAAwF;AACxF,uEAA+D;AAG/D,MAAa,eAAgB,SAAQ,iBAAsB;;AAA3D,0CAiOC;AAhOiB,0BAAU,GAAG,6BAA6B,CAAC;AAwC3C,8BAAc,GAAqC;IAC7D,aAAa,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,QAAQ;QACxB,SAAS,EAAE,KAAK;KACnB;IACD,aAAa,EAAE,qBAAS,CAAC,MAAM,CAAC,EAAE,CAAC;IACnC,WAAW,EAAE,qBAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9B,aAAa,EAAE,qBAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,YAAY,EAAE,qBAAS,CAAC,MAAM,CAAC,EAAE,CAAC;IAClC,gBAAgB,EAAE,qBAAS,CAAC,IAAI;IAChC,cAAc,EAAE,qBAAS,CAAC,MAAM,CAAC,EAAE,CAAC;IACpC,kBAAkB,EAAE,qBAAS,CAAC,IAAI;IAClC,OAAO,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"DeparturesModel.js","sourceRoot":"","sources":["../../../../../src/schema-definitions/gtfs/models/precomputed/DeparturesModel.ts"],"names":[],"mappings":"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"}
|
package/docs/follow-ups.md
CHANGED
|
@@ -219,3 +219,20 @@ Left as is:
|
|
|
219
219
|
- **Nothing kicks off the self-rescheduling loops on deploy**: send one `{}` to `refreshPublicTripCache` (it
|
|
220
220
|
fans out to every feed) and one to `refreshPublicStopTimeCache`, or add backup crons. A feed seeded later
|
|
221
221
|
starts with the next `{}`.
|
|
222
|
+
|
|
223
|
+
## 14. OG GTFS `?date=` filters ignore calendar_dates
|
|
224
|
+
|
|
225
|
+
**Trigger: the first feed defining services in calendar_dates.txt alone (or relying on its exceptions)
|
|
226
|
+
served through the OG GTFS API.**
|
|
227
|
+
|
|
228
|
+
The import and the precomputed services calendar follow the GTFS spec (`calendar.txt` and/or
|
|
229
|
+
`calendar_dates.txt`, see `ServicesCalendarRepository.populate`), but the OG `?date=` filters do not:
|
|
230
|
+
`GTFSCalendarModel`'s `forDate` scope checks only `gtfs_calendar` (start..end + weekday flag). It backs
|
|
231
|
+
`/services?date=` and, through the `service` association, `/trips?date=` and `/stoptimes?date=`. Effects:
|
|
232
|
+
|
|
233
|
+
- services that exist only in `calendar_dates` are invisible (no `gtfs_calendar` row to match);
|
|
234
|
+
- exception dates are wrong for every feed, PID included (exception_type=2 dates still listed,
|
|
235
|
+
exception_type=1 dates missing).
|
|
236
|
+
|
|
237
|
+
Fix: resolve the date's service ids the spec way (e.g. via the `get_service_ids_from_gtfs_calendar` SQL
|
|
238
|
+
function or `gtfs_precomputed_services_calendar` inside its window) and update the OpenAPI docs.
|
|
@@ -1485,6 +1485,13 @@ Worker má na starost stahování VYMI (JIS) událostí a infotextů, jejich tra
|
|
|
1485
1485
|
|
|
1486
1486
|
### GTFS v1
|
|
1487
1487
|
|
|
1488
|
+
#### _/v1/public-transport/gtfs/feeds_
|
|
1489
|
+
|
|
1490
|
+
- zdrojové tabulky
|
|
1491
|
+
- `gtfs_feeds`, `gtfs_stops` (bbox zastávek feedu)
|
|
1492
|
+
- `color` je barva feedu v mapě (`#rrggbb`, sloupec `gtfs_feeds.color`); u nového feedu stačí vyplnit
|
|
1493
|
+
`name` a `color`, mapa z nich sestaví popisek (`KÓD – název`) i barvu zastávek bez úpravy kódu
|
|
1494
|
+
|
|
1488
1495
|
#### _/v1/public-transport/gtfs/services_
|
|
1489
1496
|
|
|
1490
1497
|
- zdrojové tabulky
|
package/docs/openapi-output.yaml
CHANGED
|
@@ -2455,6 +2455,7 @@ components:
|
|
|
2455
2455
|
- code
|
|
2456
2456
|
- name
|
|
2457
2457
|
- timezone
|
|
2458
|
+
- color
|
|
2458
2459
|
- bbox
|
|
2459
2460
|
properties:
|
|
2460
2461
|
code:
|
|
@@ -2467,6 +2468,12 @@ components:
|
|
|
2467
2468
|
type: string
|
|
2468
2469
|
nullable: true
|
|
2469
2470
|
example: Europe/Prague
|
|
2471
|
+
color:
|
|
2472
|
+
type: string
|
|
2473
|
+
nullable: true
|
|
2474
|
+
description: Display colour of the feed on the map (#rrggbb). Null when not set.
|
|
2475
|
+
pattern: "^#[0-9A-Fa-f]{6}$"
|
|
2476
|
+
example: "#dc301b"
|
|
2470
2477
|
bbox:
|
|
2471
2478
|
type: array
|
|
2472
2479
|
nullable: true
|