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/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..d07c342 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,72 @@ 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" + 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_DIRECTION_SQL_DROP = SQLUtils.getSQLDropIfExistsQuery(T_DIRECTION) + 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 + const val T_TRIP_OTHER_COLUMNS_COUNT = 1 - @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_CREATE = SQLCreateBuilder.getNew(T_TRIP).apply { + 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) + 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() - // endregion Direction + @JvmStatic + val T_TRIP_SQL_INSERT = SQLInsertBuilder.getNew(T_TRIP).apply { + appendColumn(T_TRIP_K_ROUTE_ID) + appendColumn(T_TRIP_K_DIRECTION_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 + val T_TRIP_SQL_DROP = SQLUtils.getSQLDropIfExistsQuery(T_TRIP) + + // endregion // region Trip IDs @@ -185,24 +220,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 +231,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 +239,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 +275,12 @@ 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