From 6d3bdb88404f264aaad5a7b560ab844677260d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Wed, 19 Nov 2025 19:40:56 -0500 Subject: [PATCH 1/7] Index strings --- .../java/org/mtransit/commons/FeatureFlags.kt | 3 +++ .../java/org/mtransit/commons/GTFSCommons.kt | 23 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/main/java/org/mtransit/commons/FeatureFlags.kt b/src/main/java/org/mtransit/commons/FeatureFlags.kt index 62a3dc9..2f5519b 100644 --- a/src/main/java/org/mtransit/commons/FeatureFlags.kt +++ b/src/main/java/org/mtransit/commons/FeatureFlags.kt @@ -31,5 +31,8 @@ object FeatureFlags { const val F_EXPORT_SERVICE_ID_INTS = false // const val F_EXPORT_SERVICE_ID_INTS = true // WIP + const val F_EXPORT_STRINGS = false + // const val F_EXPORT_STRINGS = true // WIP + // @formatter:on } \ No newline at end of file diff --git a/src/main/java/org/mtransit/commons/GTFSCommons.kt b/src/main/java/org/mtransit/commons/GTFSCommons.kt index bbb7fdc..5498fc6 100644 --- a/src/main/java/org/mtransit/commons/GTFSCommons.kt +++ b/src/main/java/org/mtransit/commons/GTFSCommons.kt @@ -264,6 +264,29 @@ object GTFSCommons { // endregion Service Dates + // region Strings + + const val T_STRINGS = "strings" + const val T_STRINGS_K_ID = "id" + const val T_STRINGS_K_STRING = "string" + + @JvmStatic + val T_STRINGS_SQL_CREATE = SQLCreateBuilder.getNew(T_STRINGS).apply { + appendColumn(T_STRINGS_K_ID, SQLUtils.INT) // TODO INT_PK_AUTO? + appendColumn(T_STRINGS_K_STRING, SQLUtils.TXT, unique = true) + }.build() + + @JvmStatic + val T_STRINGS_SQL_INSERT = SQLInsertBuilder.getNew(T_STRINGS).apply { + appendColumn(T_STRINGS_K_ID) + appendColumn(T_STRINGS_K_STRING) + }.build() + + @JvmStatic + val T_STRINGS_SQL_DROP = SQLUtils.getSQLDropIfExistsQuery(T_STRINGS) + + // endregion Service IDs + @JvmField val DEFAULT_ID_HASH: Int? = null From cbd9ba96b095df29aa39af7094d8897bd42d7602 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Mon, 24 Nov 2025 08:36:39 -0500 Subject: [PATCH 2/7] column ID name --- src/main/java/org/mtransit/commons/GTFSCommons.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/mtransit/commons/GTFSCommons.kt b/src/main/java/org/mtransit/commons/GTFSCommons.kt index 5498fc6..450c1a8 100644 --- a/src/main/java/org/mtransit/commons/GTFSCommons.kt +++ b/src/main/java/org/mtransit/commons/GTFSCommons.kt @@ -267,7 +267,7 @@ object GTFSCommons { // region Strings const val T_STRINGS = "strings" - const val T_STRINGS_K_ID = "id" + const val T_STRINGS_K_ID = SQLUtils.BASE_COLUMNS_ID const val T_STRINGS_K_STRING = "string" @JvmStatic From 5fbab5692a9dc2f601c37bd57cac8e5ba4099c77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Mon, 24 Nov 2025 10:09:21 -0500 Subject: [PATCH 3/7] add table column strings idx --- src/main/java/org/mtransit/commons/GTFSCommons.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/org/mtransit/commons/GTFSCommons.kt b/src/main/java/org/mtransit/commons/GTFSCommons.kt index 450c1a8..4445aa4 100644 --- a/src/main/java/org/mtransit/commons/GTFSCommons.kt +++ b/src/main/java/org/mtransit/commons/GTFSCommons.kt @@ -23,6 +23,8 @@ object GTFSCommons { const val T_ROUTE_K_COLOR = "color" const val T_ROUTE_K_ORIGINAL_ID_HASH = "o_id_hash" const val T_ROUTE_K_TYPE = "type" + @JvmField + val T_ROUTE_STRINGS_COLUMN_IDX = intArrayOf(1, 2) @JvmStatic val T_ROUTE_SQL_CREATE = SQLCreateBuilder.getNew(T_ROUTE).apply { @@ -56,6 +58,8 @@ object GTFSCommons { const val T_DIRECTION_K_HEADSIGN_TYPE = "headsign_type" const val T_DIRECTION_K_HEADSIGN_VALUE = "headsign_value" // really? const val T_DIRECTION_K_ROUTE_ID = "route_id" + @JvmField + val T_DIRECTION_STRINGS_COLUMN_IDX = intArrayOf(2) @Deprecated("use T_DIRECTION instead", ReplaceWith("T_DIRECTION")) const val T_TRIP = T_DIRECTION @@ -112,6 +116,8 @@ object GTFSCommons { const val T_STOP_K_LNG = "lng" const val T_STOP_K_ACCESSIBLE = "a11y" const val T_STOP_K_ORIGINAL_ID_HASH = "o_id_hash" + @JvmField + val T_STOP_STRINGS_COLUMN_IDX = intArrayOf(2) @JvmStatic val T_STOP_SQL_CREATE = SQLCreateBuilder.getNew(T_STOP).apply { From d2d6f64224efa4c6e1d5044775d2dee92cf92060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Mon, 24 Nov 2025 10:14:48 -0500 Subject: [PATCH 4/7] Strings separator --- src/main/java/org/mtransit/commons/GTFSCommons.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/mtransit/commons/GTFSCommons.kt b/src/main/java/org/mtransit/commons/GTFSCommons.kt index 4445aa4..a3248dd 100644 --- a/src/main/java/org/mtransit/commons/GTFSCommons.kt +++ b/src/main/java/org/mtransit/commons/GTFSCommons.kt @@ -272,6 +272,8 @@ object GTFSCommons { // region Strings + const val STRINGS_SEPARATOR = " " + const val T_STRINGS = "strings" const val T_STRINGS_K_ID = SQLUtils.BASE_COLUMNS_ID const val T_STRINGS_K_STRING = "string" From a9e751d981afb1001163bada4322231435a24c15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Mon, 24 Nov 2025 10:34:38 -0500 Subject: [PATCH 5/7] wip --- src/main/java/org/mtransit/commons/sql/SQLUtils.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/mtransit/commons/sql/SQLUtils.kt b/src/main/java/org/mtransit/commons/sql/SQLUtils.kt index 33264fb..0c18c9d 100644 --- a/src/main/java/org/mtransit/commons/sql/SQLUtils.kt +++ b/src/main/java/org/mtransit/commons/sql/SQLUtils.kt @@ -25,6 +25,7 @@ object SQLUtils { const val LT = "<" const val EQ = "=" const val NE = "!=" + const val COLUMN_SEPARATOR_ = ',' const val COLUMN_SEPARATOR = "," const val LIKE = " LIKE " const val ON = " ON " From 6e2323db0e8a0ba40cbd5cc82eda9f79b1737454 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Mon, 24 Nov 2025 11:05:57 -0500 Subject: [PATCH 6/7] PR comments --- .../java/org/mtransit/commons/GTFSCommons.kt | 18 +++++++++++++++--- .../java/org/mtransit/commons/sql/SQLUtils.kt | 7 ++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/mtransit/commons/GTFSCommons.kt b/src/main/java/org/mtransit/commons/GTFSCommons.kt index a3248dd..e010131 100644 --- a/src/main/java/org/mtransit/commons/GTFSCommons.kt +++ b/src/main/java/org/mtransit/commons/GTFSCommons.kt @@ -23,6 +23,7 @@ object GTFSCommons { const val T_ROUTE_K_COLOR = "color" const val T_ROUTE_K_ORIGINAL_ID_HASH = "o_id_hash" const val T_ROUTE_K_TYPE = "type" + @JvmField val T_ROUTE_STRINGS_COLUMN_IDX = intArrayOf(1, 2) @@ -58,17 +59,22 @@ object GTFSCommons { const val T_DIRECTION_K_HEADSIGN_TYPE = "headsign_type" const val T_DIRECTION_K_HEADSIGN_VALUE = "headsign_value" // really? const val T_DIRECTION_K_ROUTE_ID = "route_id" + @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 @@ -116,6 +122,7 @@ object GTFSCommons { const val T_STOP_K_LNG = "lng" const val T_STOP_K_ACCESSIBLE = "a11y" const val T_STOP_K_ORIGINAL_ID_HASH = "o_id_hash" + @JvmField val T_STOP_STRINGS_COLUMN_IDX = intArrayOf(2) @@ -157,14 +164,19 @@ object GTFSCommons { @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 @@ -280,20 +292,20 @@ object GTFSCommons { @JvmStatic val T_STRINGS_SQL_CREATE = SQLCreateBuilder.getNew(T_STRINGS).apply { - appendColumn(T_STRINGS_K_ID, SQLUtils.INT) // TODO INT_PK_AUTO? + appendColumn(T_STRINGS_K_ID, SQLUtils.INT_PK_AUTO) // SQLite will determine next idx based on largest value in table, even after manual insert w/ custom idx value appendColumn(T_STRINGS_K_STRING, SQLUtils.TXT, unique = true) }.build() @JvmStatic val T_STRINGS_SQL_INSERT = SQLInsertBuilder.getNew(T_STRINGS).apply { - appendColumn(T_STRINGS_K_ID) + appendColumn(T_STRINGS_K_ID) // need to insert known string IDS+Int (Foreign Key used in other tables) appendColumn(T_STRINGS_K_STRING) }.build() @JvmStatic val T_STRINGS_SQL_DROP = SQLUtils.getSQLDropIfExistsQuery(T_STRINGS) - // endregion Service IDs + // endregion Strings @JvmField val DEFAULT_ID_HASH: Int? = null diff --git a/src/main/java/org/mtransit/commons/sql/SQLUtils.kt b/src/main/java/org/mtransit/commons/sql/SQLUtils.kt index 0c18c9d..a8be939 100644 --- a/src/main/java/org/mtransit/commons/sql/SQLUtils.kt +++ b/src/main/java/org/mtransit/commons/sql/SQLUtils.kt @@ -25,7 +25,6 @@ object SQLUtils { const val LT = "<" const val EQ = "=" const val NE = "!=" - const val COLUMN_SEPARATOR_ = ',' const val COLUMN_SEPARATOR = "," const val LIKE = " LIKE " const val ON = " ON " @@ -197,6 +196,12 @@ object SQLUtils { append(P2) } + @JvmName("unquotesUnescapeExt") + fun String.unquotesUnescape() = unquotes(this).unescape() + + @JvmName("unescapeExt") + fun String.unescape() = unescapeString(this) + @JvmStatic fun escapeString(string: String): String { return STRING_DELIMITER + string + STRING_DELIMITER From 4b9dad9db010fdb4fe0279f2e1aaea88a05a397f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Mon, 24 Nov 2025 13:58:54 -0500 Subject: [PATCH 7/7] Update src/main/java/org/mtransit/commons/GTFSCommons.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/main/java/org/mtransit/commons/GTFSCommons.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/mtransit/commons/GTFSCommons.kt b/src/main/java/org/mtransit/commons/GTFSCommons.kt index e010131..22cfb89 100644 --- a/src/main/java/org/mtransit/commons/GTFSCommons.kt +++ b/src/main/java/org/mtransit/commons/GTFSCommons.kt @@ -292,7 +292,7 @@ object GTFSCommons { @JvmStatic val T_STRINGS_SQL_CREATE = SQLCreateBuilder.getNew(T_STRINGS).apply { - appendColumn(T_STRINGS_K_ID, SQLUtils.INT_PK_AUTO) // SQLite will determine next idx based on largest value in table, even after manual insert w/ custom idx value + appendColumn(T_STRINGS_K_ID, SQLUtils.INT_PK_AUTO) // SQLite will determine next ID based on largest value in table, even after manual insert w/ custom ID value appendColumn(T_STRINGS_K_STRING, SQLUtils.TXT, unique = true) }.build()