From 6d3c7a10b6018adbfcdc4ef938bab2365f0bd124 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Thu, 4 Dec 2025 15:18:41 -0500 Subject: [PATCH 1/4] Vehicles locations --- .../java/org/mtransit/commons/FeatureFlags.kt | 6 ++ .../java/org/mtransit/commons/GTFSCommons.kt | 92 ++++++++----------- 2 files changed, 43 insertions(+), 55 deletions(-) diff --git a/src/main/java/org/mtransit/commons/FeatureFlags.kt b/src/main/java/org/mtransit/commons/FeatureFlags.kt index adcb5f7..e2d499f 100644 --- a/src/main/java/org/mtransit/commons/FeatureFlags.kt +++ b/src/main/java/org/mtransit/commons/FeatureFlags.kt @@ -31,11 +31,17 @@ object FeatureFlags { const val F_EXPORT_SERVICE_ID_INTS = false // const val F_EXPORT_SERVICE_ID_INTS = true // WIP // only marginal gains in APK size because of Android optimizations + const val F_EXPORT_FLATTEN_SERVICE_DATES = false + // const val F_EXPORT_FLATTEN_SERVICE_DATES = true // WIP + const val F_EXPORT_STRINGS = false // const val F_EXPORT_STRINGS = true // WIP // only marginal gains in APK size because of Android optimizations // region Schedule + const val F_EXPORT_SCHEDULE_SORTED_BY_ROUTE_DIRECTION = false + // const val F_EXPORT_SCHEDULE_SORTED_BY_ROUTE_DIRECTION = true // WIP + const val F_EXPORT_SCHEDULE_STRINGS = false // const val F_EXPORT_SCHEDULE_STRINGS = true // WIP diff --git a/src/main/java/org/mtransit/commons/GTFSCommons.kt b/src/main/java/org/mtransit/commons/GTFSCommons.kt index 471f839..207f9a2 100644 --- a/src/main/java/org/mtransit/commons/GTFSCommons.kt +++ b/src/main/java/org/mtransit/commons/GTFSCommons.kt @@ -63,21 +63,6 @@ object GTFSCommons { @JvmField val T_DIRECTION_STRINGS_COLUMN_IDX = intArrayOf(2) - @Deprecated("use T_DIRECTION instead", ReplaceWith("T_DIRECTION")) - const val T_TRIP = T_DIRECTION - - @Deprecated("use T_DIRECTION_K_ID instead", ReplaceWith("T_DIRECTION_K_ID")) - const val T_TRIP_K_ID = T_DIRECTION_K_ID - - @Deprecated("use T_DIRECTION_K_HEADSIGN_TYPE instead", ReplaceWith("T_DIRECTION_K_HEADSIGN_TYPE")) - const val T_TRIP_K_HEADSIGN_TYPE = T_DIRECTION_K_HEADSIGN_TYPE - - @Deprecated("use T_DIRECTION_K_HEADSIGN_VALUE instead", ReplaceWith("T_DIRECTION_K_HEADSIGN_VALUE")) - const val T_TRIP_K_HEADSIGN_VALUE = T_DIRECTION_K_HEADSIGN_VALUE - - @Deprecated("use T_DIRECTION_K_ROUTE_ID instead", ReplaceWith("T_DIRECTION_K_ROUTE_ID")) - const val T_TRIP_K_ROUTE_ID = T_DIRECTION_K_ROUTE_ID - @JvmStatic val T_DIRECTION_SQL_CREATE = SQLCreateBuilder.getNew(T_DIRECTION).apply { appendColumn(T_DIRECTION_K_ID, SQLUtils.INT_PK) @@ -87,10 +72,6 @@ object GTFSCommons { appendForeignKey(T_DIRECTION_K_ROUTE_ID, T_ROUTE, T_ROUTE_K_ID) }.build() - @Deprecated("use T_DIRECTION_SQL_CREATE instead", ReplaceWith("T_DIRECTION_SQL_CREATE")) - @JvmStatic - val T_TRIP_SQL_CREATE = T_DIRECTION_SQL_CREATE - @JvmStatic val T_DIRECTION_SQL_INSERT = SQLInsertBuilder.getNew(T_DIRECTION).apply { appendColumn(T_DIRECTION_K_ID) @@ -99,18 +80,44 @@ object GTFSCommons { appendColumn(T_DIRECTION_K_ROUTE_ID) }.build() - @Deprecated("use T_DIRECTION_SQL_INSERT instead", ReplaceWith("T_DIRECTION_SQL_INSERT")) @JvmStatic - val T_TRIP_SQL_INSERT = T_DIRECTION_SQL_INSERT + val T_DIRECTION_SQL_DROP = SQLUtils.getSQLDropIfExistsQuery(T_DIRECTION) + + // endregion Direction + + // region Trip + + const val T_TRIP = "path" // do not change to avoid breaking compat w/ old modules + const val T_TRIP_K_ROUTE_ID = "route_id" + const val T_TRIP_K_SERVICE_ID = "service_id" + const val T_TRIP_K_ID = SQLUtils.BASE_COLUMNS_ID + const val T_TRIP_K_DIRECTION_ID = "direction_id" + + const val T_TRIP_SAME_COLUMNS_COUNT = 3 + const val T_TRIP_OTHER_COLUMNS_COUNT = 1 @JvmStatic - val T_DIRECTION_SQL_DROP = SQLUtils.getSQLDropIfExistsQuery(T_DIRECTION) + val T_TRIP_SQL_CREATE = SQLCreateBuilder.getNew(T_TRIP).apply { + appendColumn(T_TRIP_K_ID, SQLUtils.INT_PK) + appendColumn(T_TRIP_K_ROUTE_ID, SQLUtils.INT) + appendColumn(T_TRIP_K_SERVICE_ID, SQLUtils.TXT) + appendColumn(T_TRIP_K_DIRECTION_ID, SQLUtils.INT) + appendForeignKey(T_TRIP_K_ROUTE_ID, T_ROUTE, T_ROUTE_K_ID) + appendForeignKey(T_TRIP_K_DIRECTION_ID, T_DIRECTION, T_DIRECTION_K_ID) + }.build() - @Deprecated("use T_DIRECTION_SQL_DROP instead", ReplaceWith("T_DIRECTION_SQL_DROP")) @JvmStatic - val T_TRIP_SQL_DROP = T_DIRECTION_SQL_DROP + val T_TRIP_SQL_INSERT = SQLInsertBuilder.getNew(T_TRIP).apply { + appendColumn(T_TRIP_K_ROUTE_ID) + appendColumn(T_TRIP_K_DIRECTION_ID) + appendColumn(T_TRIP_K_SERVICE_ID) + appendColumn(T_TRIP_K_ID) + }.build() - // endregion Direction + @JvmStatic + val T_TRIP_SQL_DROP = SQLUtils.getSQLDropIfExistsQuery(T_TRIP) + + // endregion // region Trip IDs @@ -185,24 +192,6 @@ object GTFSCommons { const val T_DIRECTION_STOPS_K_STOP_SEQUENCE = "stop_sequence" const val T_DIRECTION_STOPS_K_NO_PICKUP = "decent_only" - @Deprecated("use T_DIRECTION_STOPS instead", ReplaceWith("T_DIRECTION_STOPS")) - const val T_TRIP_STOPS = T_DIRECTION_STOPS - - @Deprecated("use T_DIRECTION_STOPS_K_ID instead", ReplaceWith("T_DIRECTION_STOPS_K_ID")) - const val T_TRIP_STOPS_K_ID = T_DIRECTION_STOPS_K_ID - - @Deprecated("use T_DIRECTION_STOPS_K_DIRECTION_ID instead", ReplaceWith("T_DIRECTION_STOPS_K_DIRECTION_ID")) - const val T_TRIP_STOPS_K_TRIP_ID = T_DIRECTION_STOPS_K_DIRECTION_ID - - @Deprecated("use T_DIRECTION_STOPS_K_STOP_ID instead", ReplaceWith("T_DIRECTION_STOPS_K_STOP_ID")) - const val T_TRIP_STOPS_K_STOP_ID = T_DIRECTION_STOPS_K_STOP_ID - - @Deprecated("use T_DIRECTION_STOPS_K_STOP_SEQUENCE instead", ReplaceWith("T_DIRECTION_STOPS_K_STOP_SEQUENCE")) - const val T_TRIP_STOPS_K_STOP_SEQUENCE = T_DIRECTION_STOPS_K_STOP_SEQUENCE - - @Deprecated("use T_DIRECTION_STOPS_K_NO_PICKUP instead", ReplaceWith("T_DIRECTION_STOPS_K_NO_PICKUP")) - const val T_TRIP_STOPS_K_NO_PICKUP = T_DIRECTION_STOPS_K_NO_PICKUP - @JvmStatic val T_DIRECTION_STOPS_SQL_CREATE = SQLCreateBuilder.getNew(T_DIRECTION_STOPS).apply { appendColumn(T_DIRECTION_STOPS_K_ID, SQLUtils.INT_PK_AUTO) @@ -214,10 +203,6 @@ object GTFSCommons { appendForeignKey(T_DIRECTION_STOPS_K_STOP_ID, T_STOP, T_STOP_K_ID) }.build() - @Deprecated("use T_DIRECTION_STOPS_SQL_CREATE instead", ReplaceWith("T_DIRECTION_STOPS_SQL_CREATE")) - @JvmStatic - val T_TRIP_STOPS_SQL_CREATE = T_DIRECTION_STOPS_SQL_CREATE - @JvmStatic val T_DIRECTION_STOPS_SQL_INSERT = SQLInsertBuilder.getNew(T_DIRECTION_STOPS).apply { appendColumn(T_DIRECTION_STOPS_K_DIRECTION_ID) @@ -226,17 +211,9 @@ object GTFSCommons { appendColumn(T_DIRECTION_STOPS_K_NO_PICKUP) }.build() - @Deprecated("use T_DIRECTION_STOPS_SQL_INSERT instead", ReplaceWith("T_DIRECTION_STOPS_SQL_INSERT")) - @JvmStatic - val T_TRIP_STOPS_SQL_INSERT = T_DIRECTION_STOPS_SQL_INSERT - @JvmStatic val T_DIRECTION_STOPS_SQL_DROP = SQLUtils.getSQLDropIfExistsQuery(T_DIRECTION_STOPS) - @Deprecated("use T_DIRECTION_STOPS_SQL_DROP instead", ReplaceWith("T_DIRECTION_STOPS_SQL_DROP")) - @JvmStatic - val T_TRIP_STOPS_SQL_DROP = T_DIRECTION_STOPS_SQL_DROP - // endregion Direction Stops // region Service IDs @@ -270,6 +247,11 @@ object GTFSCommons { const val T_SERVICE_DATES_K_DATE = "date" const val T_SERVICE_DATES_K_EXCEPTION_TYPE = "exception_type" + @JvmStatic + val T_SERVICE_DATES_SAME_COLUMNS_COUNT = if (FeatureFlags.F_EXPORT_FLATTEN_SERVICE_DATES) 1 else 0 + @JvmStatic + val T_SERVICE_DATES_OTHER_COLUMNS_COUNT = if (FeatureFlags.F_EXPORT_FLATTEN_SERVICE_DATES) 2 else 0 + // https://gtfs.org/documentation/schedule/reference/#calendar_datestxt const val EXCEPTION_TYPE_DEFAULT = 0 // default schedule // added by MT const val EXCEPTION_TYPE_ADDED = 1 From 88d9f65a23f49dd54074a69e6207342b321882e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Fri, 5 Dec 2025 09:35:39 -0500 Subject: [PATCH 2/4] wip --- .../java/org/mtransit/commons/GTFSCommons.kt | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/mtransit/commons/GTFSCommons.kt b/src/main/java/org/mtransit/commons/GTFSCommons.kt index 207f9a2..2c3a4ec 100644 --- a/src/main/java/org/mtransit/commons/GTFSCommons.kt +++ b/src/main/java/org/mtransit/commons/GTFSCommons.kt @@ -90,7 +90,9 @@ object GTFSCommons { const val T_TRIP = "path" // do not change to avoid breaking compat w/ old modules const val T_TRIP_K_ROUTE_ID = "route_id" const val T_TRIP_K_SERVICE_ID = "service_id" - const val T_TRIP_K_ID = SQLUtils.BASE_COLUMNS_ID + const val T_TRIP_K_SERVICE_ID_INT = "service_id_int" + const val T_TRIP_K_TRIP_ID = "trip_id" + const val T_TRIP_K_TRIP_ID_INT = "trip_id_int" const val T_TRIP_K_DIRECTION_ID = "direction_id" const val T_TRIP_SAME_COLUMNS_COUNT = 3 @@ -98,20 +100,43 @@ object GTFSCommons { @JvmStatic val T_TRIP_SQL_CREATE = SQLCreateBuilder.getNew(T_TRIP).apply { - appendColumn(T_TRIP_K_ID, SQLUtils.INT_PK) + if (FeatureFlags.F_EXPORT_TRIP_ID_INTS) { + appendColumn(T_TRIP_K_TRIP_ID_INT, SQLUtils.INT) + } else { + appendColumn(T_TRIP_K_TRIP_ID, SQLUtils.TXT) + } appendColumn(T_TRIP_K_ROUTE_ID, SQLUtils.INT) appendColumn(T_TRIP_K_SERVICE_ID, SQLUtils.TXT) + if (FeatureFlags.F_EXPORT_SERVICE_ID_INTS) { + appendColumn(T_TRIP_K_SERVICE_ID_INT, SQLUtils.INT) + } else { + appendColumn(T_TRIP_K_SERVICE_ID, SQLUtils.TXT) + } appendColumn(T_TRIP_K_DIRECTION_ID, SQLUtils.INT) appendForeignKey(T_TRIP_K_ROUTE_ID, T_ROUTE, T_ROUTE_K_ID) appendForeignKey(T_TRIP_K_DIRECTION_ID, T_DIRECTION, T_DIRECTION_K_ID) + if (FeatureFlags.F_EXPORT_TRIP_ID_INTS) { + appendForeignKey(T_TRIP_K_TRIP_ID_INT, T_TRIP_IDS, T_TRIP_IDS_K_ID_INT) + } + if (FeatureFlags.F_EXPORT_SERVICE_ID_INTS) { + appendForeignKey(T_TRIP_K_SERVICE_ID_INT, T_SERVICE_IDS, T_SERVICE_IDS_K_ID_INT) + } }.build() @JvmStatic val T_TRIP_SQL_INSERT = SQLInsertBuilder.getNew(T_TRIP).apply { appendColumn(T_TRIP_K_ROUTE_ID) appendColumn(T_TRIP_K_DIRECTION_ID) - appendColumn(T_TRIP_K_SERVICE_ID) - appendColumn(T_TRIP_K_ID) + if (FeatureFlags.F_EXPORT_SERVICE_ID_INTS) { + appendColumn(T_TRIP_K_SERVICE_ID_INT) + } else { + appendColumn(T_TRIP_K_SERVICE_ID) + } + if (FeatureFlags.F_EXPORT_TRIP_ID_INTS) { + appendColumn(T_TRIP_K_TRIP_ID_INT) + } else { + appendColumn(T_TRIP_K_TRIP_ID) + } }.build() @JvmStatic From dfce37a7f5bfa7fb4b60529a2cc688bd8d634bc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Fri, 5 Dec 2025 11:19:50 -0500 Subject: [PATCH 3/4] wip --- src/main/java/org/mtransit/commons/CollectionExt.kt | 3 +++ src/main/java/org/mtransit/commons/GTFSCommons.kt | 13 +++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/mtransit/commons/CollectionExt.kt b/src/main/java/org/mtransit/commons/CollectionExt.kt index 8f97507..1212632 100644 --- a/src/main/java/org/mtransit/commons/CollectionExt.kt +++ b/src/main/java/org/mtransit/commons/CollectionExt.kt @@ -58,3 +58,6 @@ inline fun Iterable.dropWhile(minSize: Int = 0, predicate: (T) -> Boolean } return list } + +inline fun Map.mapNotNullToMap(transform: (Map.Entry) -> Pair?): Map = + this.mapNotNull(transform).toMap() diff --git a/src/main/java/org/mtransit/commons/GTFSCommons.kt b/src/main/java/org/mtransit/commons/GTFSCommons.kt index 2c3a4ec..5160927 100644 --- a/src/main/java/org/mtransit/commons/GTFSCommons.kt +++ b/src/main/java/org/mtransit/commons/GTFSCommons.kt @@ -89,10 +89,14 @@ object GTFSCommons { const val T_TRIP = "path" // do not change to avoid breaking compat w/ old modules const val T_TRIP_K_ROUTE_ID = "route_id" - const val T_TRIP_K_SERVICE_ID = "service_id" - const val T_TRIP_K_SERVICE_ID_INT = "service_id_int" - const val T_TRIP_K_TRIP_ID = "trip_id" - const val T_TRIP_K_TRIP_ID_INT = "trip_id_int" + private const val T_TRIP_K_SERVICE_ID = "service_id" + private const val T_TRIP_K_SERVICE_ID_INT = "service_id_int" + @JvmStatic + val T_TRIP_K_SERVICE_ID_OR_INT = if (FeatureFlags.F_EXPORT_SERVICE_ID_INTS) T_TRIP_K_SERVICE_ID_INT else T_TRIP_K_SERVICE_ID + private const val T_TRIP_K_TRIP_ID = "trip_id" + private const val T_TRIP_K_TRIP_ID_INT = "trip_id_int" + @JvmStatic + val T_TRIP_K_TRIP_ID_OR_INT = if (FeatureFlags.F_EXPORT_TRIP_ID_INTS) T_TRIP_K_TRIP_ID_INT else T_TRIP_K_TRIP_ID const val T_TRIP_K_DIRECTION_ID = "direction_id" const val T_TRIP_SAME_COLUMNS_COUNT = 3 @@ -274,6 +278,7 @@ object GTFSCommons { @JvmStatic val T_SERVICE_DATES_SAME_COLUMNS_COUNT = if (FeatureFlags.F_EXPORT_FLATTEN_SERVICE_DATES) 1 else 0 + @JvmStatic val T_SERVICE_DATES_OTHER_COLUMNS_COUNT = if (FeatureFlags.F_EXPORT_FLATTEN_SERVICE_DATES) 2 else 0 From e9c7b800dac3557b1d2531a2e36ec0f8b9ba1b67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Fri, 5 Dec 2025 11:25:43 -0500 Subject: [PATCH 4/4] fix --- src/main/java/org/mtransit/commons/GTFSCommons.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/mtransit/commons/GTFSCommons.kt b/src/main/java/org/mtransit/commons/GTFSCommons.kt index 5160927..d07c342 100644 --- a/src/main/java/org/mtransit/commons/GTFSCommons.kt +++ b/src/main/java/org/mtransit/commons/GTFSCommons.kt @@ -110,7 +110,6 @@ object GTFSCommons { appendColumn(T_TRIP_K_TRIP_ID, SQLUtils.TXT) } appendColumn(T_TRIP_K_ROUTE_ID, SQLUtils.INT) - appendColumn(T_TRIP_K_SERVICE_ID, SQLUtils.TXT) if (FeatureFlags.F_EXPORT_SERVICE_ID_INTS) { appendColumn(T_TRIP_K_SERVICE_ID_INT, SQLUtils.INT) } else {