From c76ade0039ad72fe532f89e431dcb1395ea7c383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Thu, 23 Jul 2026 15:37:01 -0400 Subject: [PATCH 1/2] Auto enable direction splitter when `trips.txt` doesn't have `direction_id` column - #81 --- .../java/org/mtransit/parser/DefaultAgencyTools.java | 11 +++++++++-- .../java/org/mtransit/parser/gtfs/GAgencyTools.java | 2 +- src/main/java/org/mtransit/parser/gtfs/GReader.java | 9 +++++++-- src/main/java/org/mtransit/parser/gtfs/data/GTrip.kt | 2 +- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java index b23120d6..6e82bc55 100644 --- a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java +++ b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java @@ -966,13 +966,20 @@ public void forgetOriginalTripId(@NotNull String gOriginalTripId) { this.tripIdToCleanupTripId.remove(gOriginalTripId); } + private boolean directionSplitterUseful = false; // opt-in feature + @Override - public boolean directionSplitterEnabled() { - return Configs.getRouteConfig().isDirectionSplitterEnabled(getTodayDateInt()); + public void setDirectionSplitterUseful(boolean enabled) { + this.directionSplitterUseful = enabled; } @Override public boolean directionSplitterEnabled(long routeId) { + if (Configs.getRouteConfig().getDirectionSplitterDisabledUntil().isEmpty()) { + if (this.directionSplitterUseful) { + return true; + } + } return Configs.getRouteConfig().isDirectionSplitterEnabled(getTodayDateInt(), routeId); } diff --git a/src/main/java/org/mtransit/parser/gtfs/GAgencyTools.java b/src/main/java/org/mtransit/parser/gtfs/GAgencyTools.java index d24a5c9e..db0a7b5d 100644 --- a/src/main/java/org/mtransit/parser/gtfs/GAgencyTools.java +++ b/src/main/java/org/mtransit/parser/gtfs/GAgencyTools.java @@ -202,7 +202,7 @@ public interface GAgencyTools { void forgetOriginalTripId(@NotNull String gTripOriginalId); - boolean directionSplitterEnabled(); + void setDirectionSplitterUseful(boolean enabled); boolean directionSplitterEnabled(long routeId); diff --git a/src/main/java/org/mtransit/parser/gtfs/GReader.java b/src/main/java/org/mtransit/parser/gtfs/GReader.java index a085c0e4..c00953d6 100644 --- a/src/main/java/org/mtransit/parser/gtfs/GReader.java +++ b/src/main/java/org/mtransit/parser/gtfs/GReader.java @@ -106,8 +106,13 @@ public static GSpec readGtfsZipFile( if (!calendarsOnly) { GTFSDataBase.setAutoCommit(false); final PreparedStatement insertTripsPrepared = USE_PREPARED_STATEMENT ? GTFSDataBase.prepareInsertTrip(agencyTools.allowDuplicateKeyError()) : null; - readFile(gtfsDir, GTrip.FILENAME, true, line -> - processTrip(agencyTools, gSpec, line, insertTripsPrepared, skipDataCleanup) + readFile(gtfsDir, GTrip.FILENAME, true, + line -> processTrip(agencyTools, gSpec, line, insertTripsPrepared, skipDataCleanup), + columnNames -> { + if (!columnNames.contains(GTrip.DIRECTION_ID)) { + agencyTools.setDirectionSplitterUseful(true); // direction IDs not provided + } + } ); if (insertTripsPrepared != null) { GTFSDataBase.executePreparedStatement(insertTripsPrepared); diff --git a/src/main/java/org/mtransit/parser/gtfs/data/GTrip.kt b/src/main/java/org/mtransit/parser/gtfs/data/GTrip.kt index 9fdd85bc..9cd08bc7 100644 --- a/src/main/java/org/mtransit/parser/gtfs/data/GTrip.kt +++ b/src/main/java/org/mtransit/parser/gtfs/data/GTrip.kt @@ -136,7 +136,7 @@ data class GTrip( internal const val SERVICE_ID = "service_id" private const val TRIP_HEADSIGN = "trip_headsign" private const val TRIP_SHORT_NAME = "trip_short_name" - private const val DIRECTION_ID = "direction_id" + internal const val DIRECTION_ID = "direction_id" private const val BLOCK_ID = "block_id" private const val SHAPE_ID = "shape_id" private const val WHEELCHAIR_ACCESSIBLE = "wheelchair_accessible" From 6210de5f4edda01be479e6949495909ab7e4b76d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Thu, 23 Jul 2026 16:03:58 -0400 Subject: [PATCH 2/2] PR comments --- src/main/java/org/mtransit/parser/DefaultAgencyTools.java | 4 +++- .../java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java index 6e82bc55..923dd699 100644 --- a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java +++ b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java @@ -975,7 +975,9 @@ public void setDirectionSplitterUseful(boolean enabled) { @Override public boolean directionSplitterEnabled(long routeId) { - if (Configs.getRouteConfig().getDirectionSplitterDisabledUntil().isEmpty()) { + if (Configs.getRouteConfig().getDirectionSplitterEnabled() == null // not set + && !Configs.getRouteConfig().getDirectionSplitterDisabledUntil().containsKey(routeId) // not disabled for this route + ) { if (this.directionSplitterUseful) { return true; } diff --git a/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt b/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt index 5263b902..6fbb04ff 100644 --- a/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt +++ b/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt @@ -99,7 +99,7 @@ data class RouteConfig( @SerialName("direction_headsign_ignore_trip_headsign") val directionHeadsignIgnoreTripHeadsign: Boolean = false, // OPT-IN feature @SerialName("direction_splitter_enabled") - val directionSplitterEnabled: Boolean = false, // OPT-IN feature + val directionSplitterEnabled: Boolean? = null, // OPT-IN feature @SerialName("direction_splitter_disabled_until") val directionSplitterDisabledUntil: Map = emptyMap(), // OPT-IN feature @SerialName("direction_finder_enabled") @@ -475,7 +475,7 @@ data class RouteConfig( @JvmOverloads fun isDirectionSplitterEnabled(todayDate: Int, routeId: Long? = null) = - directionSplitterEnabled && !isAllowedUntil(directionSplitterDisabledUntil[routeId], todayDate) + directionSplitterEnabled == true && !isAllowedUntil(directionSplitterDisabledUntil[routeId], todayDate) fun isDirectionIdOverrideEnabled(todayDate: Int, routeId: Long) = directionIdOverrideEnabled[routeId] == true || isAllowedUntil(directionIdOverrideEnabledUntil[routeId], todayDate)