diff --git a/src/main/java/org/mtransit/parser/Constants.java b/src/main/java/org/mtransit/parser/Constants.java index 07f4663..7e3f1be 100644 --- a/src/main/java/org/mtransit/parser/Constants.java +++ b/src/main/java/org/mtransit/parser/Constants.java @@ -30,6 +30,4 @@ public final class Constants { public static final String SPACE_ = " "; - public static final String UUID_SEPARATOR = "-"; - } diff --git a/src/main/java/org/mtransit/parser/MTLog.java b/src/main/java/org/mtransit/parser/MTLog.java index 0505a3d..0de1086 100644 --- a/src/main/java/org/mtransit/parser/MTLog.java +++ b/src/main/java/org/mtransit/parser/MTLog.java @@ -103,6 +103,7 @@ public static void logFatal(@NotNull Throwable t, @NotNull String format, @Nulla } public static void waitForEnter() { + // if (true) return; if (DefaultAgencyTools.IS_CI) { return; } diff --git a/src/main/java/org/mtransit/parser/db/DBUtils.kt b/src/main/java/org/mtransit/parser/db/DBUtils.kt index 4ccfba7..43d3158 100644 --- a/src/main/java/org/mtransit/parser/db/DBUtils.kt +++ b/src/main/java/org/mtransit/parser/db/DBUtils.kt @@ -1,9 +1,11 @@ package org.mtransit.parser.db import org.mtransit.commons.sql.SQLCreateBuilder +import org.mtransit.commons.sql.getStringOrNull import org.mtransit.parser.DefaultAgencyTools import org.mtransit.parser.FileUtils import org.mtransit.parser.MTLog +import org.mtransit.parser.db.SQLUtils.quotesEscape import org.mtransit.parser.gtfs.data.GStopTime import org.mtransit.parser.gtfs.data.GTripStop import org.mtransit.parser.mt.data.MSchedule @@ -24,7 +26,6 @@ object DBUtils { private const val SCHEDULES_TABLE_NAME = "m_schedule" private const val SQL_RESULT_ALIAS = "result" - private const val SQL_NULL = "null" private val IS_USING_FILE_INSTEAD_OF_MEMORY = DefaultAgencyTools.IS_CI @@ -150,7 +151,7 @@ object DBUtils { setInt(idx++, gStopTime.stopSequence) setInt(idx++, gStopTime.arrivalTime) setInt(idx++, gStopTime.departureTime) - setString(idx++, "${gStopTime.stopHeadsign?.let { SQLUtils.quotes(SQLUtils.escape(it)) }}") + setString(idx++, gStopTime.stopHeadsign?.quotesEscape()) setInt(idx++, gStopTime.pickupType.id) setInt(idx++, gStopTime.dropOffType.id) setInt(idx++, gStopTime.timePoint.id) @@ -186,7 +187,7 @@ object DBUtils { "${gStopTime.stopSequence}," + "${gStopTime.arrivalTime}," + "${gStopTime.departureTime}," + - "${gStopTime.stopHeadsign?.let { SQLUtils.quotes(SQLUtils.escape(it)) }}," + + "${gStopTime.stopHeadsign?.quotesEscape()}," + "${gStopTime.pickupType.id}," + "${gStopTime.dropOffType.id}," + "${gStopTime.timePoint.id}" + @@ -231,7 +232,7 @@ object DBUtils { "${mSchedule.pathIdInt}," + "${mSchedule.accessible}," + "${mSchedule.headsignType}," + - "${mSchedule.headsignValue?.let { SQLUtils.quotes(SQLUtils.escape(it)) }}" + + "${mSchedule.headsignValue?.quotesEscape()}" + SQLUtilsCommons.P2 ) insertRowCount++ @@ -276,10 +277,6 @@ object DBUtils { connection.createStatement().use { statement -> val rs = SQLUtils.executeQuery(statement, query) while (rs.next()) { - var stopHeadSign: String? = rs.getString(GStopTime.STOP_HEADSIGN) - if (stopHeadSign == SQL_NULL) { - stopHeadSign = null - } result.add( GStopTime( rs.getInt(GStopTime.TRIP_ID), @@ -287,7 +284,7 @@ object DBUtils { rs.getInt(GStopTime.DEPARTURE_TIME), rs.getInt(GStopTime.STOP_ID), rs.getInt(GStopTime.STOP_SEQUENCE), - stopHeadSign, + rs.getStringOrNull(GStopTime.STOP_HEADSIGN), rs.getInt(GStopTime.PICKUP_TYPE), rs.getInt(GStopTime.DROP_OFF_TYPE), rs.getInt(GStopTime.TIME_POINT), @@ -484,10 +481,6 @@ object DBUtils { connection.createStatement().use { statement -> val rs = SQLUtils.executeQuery(statement, query) while (rs.next()) { - var headsignValue: String? = rs.getString(MSchedule.HEADSIGN_VALUE) - if (headsignValue == SQL_NULL) { - headsignValue = null - } result.add( MSchedule( rs.getLong(MSchedule.ROUTE_ID), @@ -499,7 +492,7 @@ object DBUtils { rs.getInt(MSchedule.PATH_ID), rs.getInt(MSchedule.WHEELCHAIR_BOARDING), rs.getInt(MSchedule.HEADSIGN_TYPE), - headsignValue + rs.getStringOrNull(MSchedule.HEADSIGN_VALUE), ) ) selectRowCount++ diff --git a/src/main/java/org/mtransit/parser/db/SQLUtils.kt b/src/main/java/org/mtransit/parser/db/SQLUtils.kt index fad159b..cc7a019 100644 --- a/src/main/java/org/mtransit/parser/db/SQLUtils.kt +++ b/src/main/java/org/mtransit/parser/db/SQLUtils.kt @@ -39,6 +39,11 @@ object SQLUtils { return "'$string'" } + @JvmName("quotesExt") + fun String.quotes() = quotes(this) + + fun String.quotesEscape() = escape(this).quotes() + @JvmStatic fun execute(statement: Statement, query: String): Boolean { if (org.mtransit.parser.Constants.LOG_SQL) { diff --git a/src/main/java/org/mtransit/parser/gtfs/GAgencyTools.java b/src/main/java/org/mtransit/parser/gtfs/GAgencyTools.java index 93a05b2..66a9656 100644 --- a/src/main/java/org/mtransit/parser/gtfs/GAgencyTools.java +++ b/src/main/java/org/mtransit/parser/gtfs/GAgencyTools.java @@ -129,6 +129,7 @@ public interface GAgencyTools { @NotNull String cleanRouteLongName(@NotNull String routeLongName); + @SuppressWarnings("DeprecatedIsStillUsed") @Deprecated boolean allowGTFSIdOverride(); diff --git a/src/main/java/org/mtransit/parser/gtfs/GReader.java b/src/main/java/org/mtransit/parser/gtfs/GReader.java index aacbd67..3a2578f 100644 --- a/src/main/java/org/mtransit/parser/gtfs/GReader.java +++ b/src/main/java/org/mtransit/parser/gtfs/GReader.java @@ -23,7 +23,6 @@ import org.mtransit.parser.gtfs.data.GSpec; import org.mtransit.parser.gtfs.data.GStop; import org.mtransit.parser.gtfs.data.GStopTime; -import org.mtransit.parser.gtfs.data.GTimePoint; import org.mtransit.parser.gtfs.data.GTrip; import java.io.BufferedReader; @@ -63,16 +62,16 @@ public static GSpec readGtfsZipFile(@NotNull String gtfsFile, try { // AGENCY if (!calendarsOnly) { - readFile(agencyTools, gtfsDir, GAgency.FILENAME, true, line -> + readFile(gtfsDir, GAgency.FILENAME, true, line -> processAgency(agencyTools, gSpec, line) ); } // CALENDAR DATES - boolean hasCalendarDates = readFile(agencyTools, gtfsDir, GCalendarDate.FILENAME, false, line -> + boolean hasCalendarDates = readFile(gtfsDir, GCalendarDate.FILENAME, false, line -> processCalendarDate(agencyTools, gSpec, line) ); // CALENDAR - boolean hasCalendars = readFile(agencyTools, gtfsDir, GCalendar.FILENAME, false, line -> + boolean hasCalendars = readFile(gtfsDir, GCalendar.FILENAME, false, line -> processCalendar(agencyTools, gSpec, line) ); boolean hasCalendar = hasCalendarDates || hasCalendars; @@ -81,25 +80,25 @@ public static GSpec readGtfsZipFile(@NotNull String gtfsFile, } // ROUTES if (!calendarsOnly) { - readFile(agencyTools, gtfsDir, GRoute.FILENAME, true, line -> + readFile(gtfsDir, GRoute.FILENAME, true, line -> processRoute(agencyTools, gSpec, line) ); } // TRIPS if (!calendarsOnly) { - readFile(agencyTools, gtfsDir, GTrip.FILENAME, true, line -> + readFile(gtfsDir, GTrip.FILENAME, true, line -> processTrip(agencyTools, gSpec, line) ); } // FREQUENCIES if (!calendarsOnly && !routeTripCalendarsOnly) { - readFile(agencyTools, gtfsDir, GFrequency.FILENAME, false, line -> + readFile(gtfsDir, GFrequency.FILENAME, false, line -> processFrequency(agencyTools, gSpec, line) ); } // STOPS if (!calendarsOnly && !routeTripCalendarsOnly) { - readFile(agencyTools, gtfsDir, GStop.FILENAME, true, line -> + readFile(gtfsDir, GStop.FILENAME, true, line -> processStop(agencyTools, gSpec, line) ); } @@ -108,7 +107,7 @@ public static GSpec readGtfsZipFile(@NotNull String gtfsFile, MTLog.log("- IDs: %d", GIDs.count()); DBUtils.setAutoCommit(false); final PreparedStatement insertStopTimePrepared = DBUtils.prepareInsertStopTime(false); - readFile(agencyTools, gtfsDir, GStopTime.FILENAME, false, + readFile(gtfsDir, GStopTime.FILENAME, false, line -> processStopTime(agencyTools, gSpec, line, insertStopTimePrepared), columnNames -> { if (!columnNames.contains(GStopTime.PICKUP_TYPE)) { @@ -140,17 +139,15 @@ public static GSpec readGtfsZipFile(@NotNull String gtfsFile, } private static boolean readFile( - @NotNull final GAgencyTools agencyTools, @NotNull String gtfsDir, @NotNull String fileName, boolean fileRequired, @NotNull LineProcessor lineProcessor ) { - return readFile(agencyTools, gtfsDir, fileName, fileRequired, lineProcessor, null); + return readFile(gtfsDir, fileName, fileRequired, lineProcessor, null); } private static boolean readFile( - @NotNull final GAgencyTools agencyTools, @NotNull String gtfsDir, @NotNull String fileName, boolean fileRequired, @@ -180,6 +177,7 @@ private static boolean readFile( private static final Pattern QUOTE_ = Pattern.compile("\""); + @SuppressWarnings("unused") private static void readCsv(String filename, BufferedReader reader, LineProcessor lineProcessor) throws IOException { readCsv(filename, reader, lineProcessor, null); @@ -264,17 +262,7 @@ private static void readCsv(String filename, BufferedReader reader, private static void processStopTime(GAgencyTools agencyTools, GSpec gSpec, HashMap line, PreparedStatement insertStopTimePrepared) { try { - final GStopTime gStopTime = new GStopTime( - line.get(GStopTime.TRIP_ID), - line.get(GStopTime.ARRIVAL_TIME).trim(), - line.get(GStopTime.DEPARTURE_TIME).trim(), - line.get(GStopTime.STOP_ID).trim(), - Integer.parseInt(line.get(GStopTime.STOP_SEQUENCE).trim()), - line.get(GStopTime.STOP_HEADSIGN), - GPickupType.parse(line.get(GStopTime.PICKUP_TYPE)), - GDropOffType.parse(line.get(GStopTime.DROP_OFF_TYPE)), - GTimePoint.parse(line.get(GStopTime.TIME_POINT)) - ); + final GStopTime gStopTime = GStopTime.fromLine(line); if (agencyTools.excludeTripNullable(gSpec.getTrip(gStopTime.getTripIdInt()))) { return; } @@ -389,7 +377,7 @@ private static void processTrip(GAgencyTools agencyTools, GSpec gSpec, HashMap) = GStopTime( + line[TRIP_ID] ?: throw MTLog.Fatal("Invalid GStopTime from $line!"), + line[ARRIVAL_TIME]?.trim() ?: throw MTLog.Fatal("Invalid GStopTime from $line!"), + line[DEPARTURE_TIME]?.trim() ?: throw MTLog.Fatal("Invalid GStopTime from $line!"), + line[STOP_ID]?.trim() ?: throw MTLog.Fatal("Invalid GStopTime from $line!"), + line[STOP_SEQUENCE]?.trim()?.toInt() ?: throw MTLog.Fatal("Invalid GStopTime from $line!"), + line[STOP_HEADSIGN]?.takeIf { it.isNotBlank() }, + GPickupType.parse(line[PICKUP_TYPE]), + GDropOffType.parse(line[DROP_OFF_TYPE]), + GTimePoint.parse(line[TIME_POINT]), + ) + + private const val UID_SEPARATOR = "0" // int IDs can be negative + @JvmStatic fun getNewUID( tripIdInt: Int, stopIdInt: Int, stopSequence: Int - ) = "${tripIdInt}0${stopIdInt}0${stopSequence}".toLong() + ) = "${tripIdInt}$UID_SEPARATOR${stopIdInt}$UID_SEPARATOR${stopSequence}".toLong() fun Iterable.minStopSequence(): Int { return this.minOfOrNull { it.stopSequence } ?: 0 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 be920da..edbd1b7 100644 --- a/src/main/java/org/mtransit/parser/gtfs/data/GTrip.kt +++ b/src/main/java/org/mtransit/parser/gtfs/data/GTrip.kt @@ -25,13 +25,13 @@ data class GTrip( tripShortName: String?, wheelchairBoarding: Int?, ) : this( - GIDs.getInt(routeId), - GIDs.getInt(serviceId), - GIDs.getInt(tripId), - GDirectionId.parse(directionId), - tripHeadsign, - tripShortName, - GWheelchairBoardingType.parse(wheelchairBoarding), + routeIdInt = GIDs.getInt(routeId), + serviceIdInt = GIDs.getInt(serviceId), + tripIdInt = GIDs.getInt(tripId), + directionIdE = GDirectionId.parse(directionId), + tripHeadsign = tripHeadsign, + tripShortName = tripShortName, + wheelchairAccessible = GWheelchairBoardingType.parse(wheelchairBoarding), ) val directionId: Int? diff --git a/src/main/java/org/mtransit/parser/gtfs/data/GTripStop.kt b/src/main/java/org/mtransit/parser/gtfs/data/GTripStop.kt index 8502d78..5411691 100644 --- a/src/main/java/org/mtransit/parser/gtfs/data/GTripStop.kt +++ b/src/main/java/org/mtransit/parser/gtfs/data/GTripStop.kt @@ -80,12 +80,14 @@ data class GTripStop( const val STOP_ID = "stop_id" const val STOP_SEQUENCE = "stop_sequence" + private const val UID_SEPARATOR = "+" // int IDs can be negative + @JvmStatic fun getNewUID( tripUID: String, stopIdInt: Int, stopSequence: Int - ) = "${tripUID}-${stopIdInt}-${stopSequence}" + ) = "${tripUID}$UID_SEPARATOR${stopIdInt}$UID_SEPARATOR${stopSequence}" @JvmStatic fun getNewUID( @@ -93,7 +95,7 @@ data class GTripStop( tripIdInt: Int, stopIdInt: Int, stopSequence: Int - ) = "${routeIdInt}-${tripIdInt}-${stopIdInt}-${stopSequence}" + ) = "${routeIdInt}$UID_SEPARATOR${tripIdInt}$UID_SEPARATOR${stopIdInt}$UID_SEPARATOR${stopSequence}" @Suppress("unused") @JvmStatic diff --git a/src/main/java/org/mtransit/parser/mt/data/MFrequency.kt b/src/main/java/org/mtransit/parser/mt/data/MFrequency.kt index c241aad..16908c2 100644 --- a/src/main/java/org/mtransit/parser/mt/data/MFrequency.kt +++ b/src/main/java/org/mtransit/parser/mt/data/MFrequency.kt @@ -1,7 +1,7 @@ package org.mtransit.parser.mt.data import org.mtransit.parser.Constants -import org.mtransit.parser.db.SQLUtils +import org.mtransit.parser.db.SQLUtils.quotesEscape import org.mtransit.parser.gtfs.GAgencyTools import org.mtransit.parser.gtfs.data.GIDs @@ -29,7 +29,7 @@ data class MFrequency( val uID by lazy { getNewUID(serviceIdInt, tripId, startTime, endTime) } fun toFile(agencyTools: GAgencyTools) = buildString { - append(SQLUtils.quotes(SQLUtils.escape(getCleanServiceId(agencyTools)))) // service ID + append(getCleanServiceId(agencyTools).quotesEscape()) // service ID append(Constants.COLUMN_SEPARATOR) // append(tripId) // trip ID append(Constants.COLUMN_SEPARATOR) // @@ -75,12 +75,15 @@ data class MFrequency( } companion object { + + private const val UID_SEPARATOR = "+" // int IDs can be negative + @JvmStatic fun getNewUID( serviceIdInt: Int, tripId: Long, startTime: Int, endTime: Int - ) = "${serviceIdInt}-${tripId}-${startTime}-${endTime}" + ) = "${serviceIdInt}$UID_SEPARATOR${tripId}$UID_SEPARATOR${startTime}$UID_SEPARATOR${endTime}" } } \ No newline at end of file diff --git a/src/main/java/org/mtransit/parser/mt/data/MRoute.kt b/src/main/java/org/mtransit/parser/mt/data/MRoute.kt index 899ddcd..bdf54ed 100644 --- a/src/main/java/org/mtransit/parser/mt/data/MRoute.kt +++ b/src/main/java/org/mtransit/parser/mt/data/MRoute.kt @@ -3,7 +3,8 @@ package org.mtransit.parser.mt.data import org.mtransit.commons.FeatureFlags import org.mtransit.commons.GTFSCommons import org.mtransit.parser.Constants -import org.mtransit.parser.db.SQLUtils +import org.mtransit.parser.db.SQLUtils.quotes +import org.mtransit.parser.db.SQLUtils.quotesEscape import org.mtransit.parser.gtfs.GAgencyTools import kotlin.math.max @@ -38,11 +39,11 @@ data class MRoute( fun toFile() = buildString { append(id.toString()) // ID append(Constants.COLUMN_SEPARATOR) // - append(SQLUtils.quotes(SQLUtils.escape(shortName ?: Constants.EMPTY))) // short name + append((shortName ?: Constants.EMPTY).quotesEscape()) // short name append(Constants.COLUMN_SEPARATOR) // - append(SQLUtils.quotes(SQLUtils.escape(longName))) // long name + append(longName.quotesEscape()) // long name append(Constants.COLUMN_SEPARATOR) // - append(SQLUtils.quotes(color ?: Constants.EMPTY)) // color + append((color ?: Constants.EMPTY).quotes()) // color if (FeatureFlags.F_EXPORT_GTFS_ID_HASH_INT) { append(Constants.COLUMN_SEPARATOR) // originalIdHash?.let { append(it) } // original ID hash diff --git a/src/main/java/org/mtransit/parser/mt/data/MSchedule.kt b/src/main/java/org/mtransit/parser/mt/data/MSchedule.kt index 43f2967..1a0fff3 100644 --- a/src/main/java/org/mtransit/parser/mt/data/MSchedule.kt +++ b/src/main/java/org/mtransit/parser/mt/data/MSchedule.kt @@ -5,7 +5,8 @@ import org.mtransit.parser.Constants import org.mtransit.parser.DefaultAgencyTools import org.mtransit.parser.MTLog import org.mtransit.parser.Pair -import org.mtransit.parser.db.SQLUtils +import org.mtransit.parser.db.SQLUtils.quotes +import org.mtransit.parser.db.SQLUtils.quotesEscape import org.mtransit.parser.gtfs.GAgencyTools import org.mtransit.parser.gtfs.data.GIDs @@ -33,14 +34,14 @@ data class MSchedule( pathIdInt: Int, accessible: Int, ) : this( - routeId, - serviceIdInt, - tripId, - stopId, - (times.first ?: 0), - (times.second ?: 0), - pathIdInt, - accessible, + routeId = routeId, + serviceIdInt = serviceIdInt, + tripId = tripId, + stopId = stopId, + arrival = (times.first ?: 0), + departure = (times.second ?: 0), + pathIdInt = pathIdInt, + accessible = accessible, ) @Deprecated(message = "Not memory efficient") @@ -104,7 +105,7 @@ data class MSchedule( } fun toFileNewServiceIdAndTripId(agencyTools: GAgencyTools) = buildString { - append(SQLUtils.quotes(SQLUtils.escape(getCleanServiceId(agencyTools)))) // service ID + append(getCleanServiceId(agencyTools).quotesEscape()) // service ID append(Constants.COLUMN_SEPARATOR) // // no route ID, just for file split append(tripId) // trip ID @@ -120,12 +121,12 @@ data class MSchedule( append(Constants.COLUMN_SEPARATOR) // } if (DefaultAgencyTools.EXPORT_PATH_ID) { - append(SQLUtils.quotes(_pathId)) // original trip ID + append(_pathId.quotesEscape()) // original trip ID append(Constants.COLUMN_SEPARATOR) // } append(if (headsignType < 0) Constants.EMPTY else headsignType) // HEADSIGN TYPE append(Constants.COLUMN_SEPARATOR) // - append(SQLUtils.quotes(headsignValue ?: Constants.EMPTY)) // HEADSIGN STRING + append((headsignValue ?: Constants.EMPTY).quotesEscape()) // HEADSIGN STRING if (FeatureFlags.F_ACCESSIBILITY_PRODUCER) { append(Constants.COLUMN_SEPARATOR) // append(accessible) @@ -154,11 +155,11 @@ data class MSchedule( if (headsignType == MTrip.HEADSIGN_TYPE_NO_PICKUP) { append(MTrip.HEADSIGN_TYPE_NO_PICKUP) // HEADSIGN TYPE append(Constants.COLUMN_SEPARATOR) // - append(SQLUtils.quotes(Constants.EMPTY)) // HEADSIGN STRING + append(Constants.EMPTY.quotes()) // HEADSIGN STRING } else { append(if (headsignType < 0) Constants.EMPTY else headsignType) // HEADSIGN TYPE append(Constants.COLUMN_SEPARATOR) // - append(SQLUtils.quotes(headsignValue ?: Constants.EMPTY)) // HEADSIGN STRING + append((headsignValue ?: Constants.EMPTY).quotesEscape()) // HEADSIGN STRING } if (FeatureFlags.F_ACCESSIBILITY_PRODUCER) { append(Constants.COLUMN_SEPARATOR) // @@ -227,12 +228,14 @@ data class MSchedule( const val HEADSIGN_TYPE = "headsign_type" const val HEADSIGN_VALUE = "headsign_value" + private const val UID_SEPARATOR = "+" // int IDs can be negative + @JvmStatic fun getNewUID( serviceIdInt: Int, tripId: Long, stopId: Int, departure: Int - ) = "${serviceIdInt}-${tripId}-${stopId}-${departure}" + ) = "${serviceIdInt}$UID_SEPARATOR${tripId}$UID_SEPARATOR${stopId}$UID_SEPARATOR${departure}" } } \ No newline at end of file diff --git a/src/main/java/org/mtransit/parser/mt/data/MServiceDate.kt b/src/main/java/org/mtransit/parser/mt/data/MServiceDate.kt index 1e24906..eb4dd27 100644 --- a/src/main/java/org/mtransit/parser/mt/data/MServiceDate.kt +++ b/src/main/java/org/mtransit/parser/mt/data/MServiceDate.kt @@ -2,7 +2,7 @@ package org.mtransit.parser.mt.data import org.mtransit.commons.FeatureFlags import org.mtransit.parser.Constants -import org.mtransit.parser.db.SQLUtils +import org.mtransit.parser.db.SQLUtils.quotesEscape import org.mtransit.parser.gtfs.GAgencyTools import org.mtransit.parser.gtfs.data.GIDs @@ -35,15 +35,14 @@ data class MServiceDate( return agencyTools.cleanServiceId(_serviceId) } - override fun compareTo(other: MServiceDate): Int { - val cd = calendarDate - other.calendarDate - return if (cd != 0) { - cd - } else _serviceId.compareTo(other._serviceId, ignoreCase = true) // SORT BY real service ID - } + override fun compareTo(other: MServiceDate): Int = compareBy( + MServiceDate::calendarDate, + MServiceDate::_serviceId, + MServiceDate::exceptionType, + ).compare(this, other) fun toFile(agencyTools: GAgencyTools) = buildString { - append(SQLUtils.quotes(SQLUtils.escape(getCleanServiceId(agencyTools)))) // service ID + append(getCleanServiceId(agencyTools).quotesEscape()) // service ID append(Constants.COLUMN_SEPARATOR) append(calendarDate) // calendar date if (FeatureFlags.F_EXPORT_SERVICE_EXCEPTION_TYPE) { diff --git a/src/main/java/org/mtransit/parser/mt/data/MStop.kt b/src/main/java/org/mtransit/parser/mt/data/MStop.kt index b6df2a5..aa242c3 100644 --- a/src/main/java/org/mtransit/parser/mt/data/MStop.kt +++ b/src/main/java/org/mtransit/parser/mt/data/MStop.kt @@ -3,7 +3,7 @@ package org.mtransit.parser.mt.data import org.mtransit.commons.FeatureFlags import org.mtransit.commons.GTFSCommons import org.mtransit.parser.Constants -import org.mtransit.parser.db.SQLUtils +import org.mtransit.parser.db.SQLUtils.quotesEscape data class MStop( val id: Int, @@ -44,9 +44,9 @@ data class MStop( fun toFile() = buildString { append(id) // ID append(Constants.COLUMN_SEPARATOR) // - append(SQLUtils.quotes(SQLUtils.escape(code))) // code + append(code.quotesEscape()) // code append(Constants.COLUMN_SEPARATOR) // - append(SQLUtils.quotes(SQLUtils.escape(name))) // name + append(name.quotesEscape()) // name append(Constants.COLUMN_SEPARATOR) // append(lat) // latitude append(Constants.COLUMN_SEPARATOR) // diff --git a/src/main/java/org/mtransit/parser/mt/data/MTrip.kt b/src/main/java/org/mtransit/parser/mt/data/MTrip.kt index 043e17d..f78b130 100644 --- a/src/main/java/org/mtransit/parser/mt/data/MTrip.kt +++ b/src/main/java/org/mtransit/parser/mt/data/MTrip.kt @@ -2,7 +2,7 @@ package org.mtransit.parser.mt.data import org.mtransit.parser.Constants import org.mtransit.parser.MTLog -import org.mtransit.parser.db.SQLUtils +import org.mtransit.parser.db.SQLUtils.quotesEscape @Suppress("unused") data class MTrip( @@ -179,7 +179,7 @@ data class MTrip( append(Constants.COLUMN_SEPARATOR) // append(headsignType) // HEADSIGN TYPE append(Constants.COLUMN_SEPARATOR) // - append(SQLUtils.quotes(SQLUtils.escape(headsignValue))) // HEADSIGN STRING + append(headsignValue.quotesEscape()) // HEADSIGN STRING append(Constants.COLUMN_SEPARATOR) // append(routeId) // ROUTE ID } diff --git a/src/main/java/org/mtransit/parser/mt/data/MTripStop.kt b/src/main/java/org/mtransit/parser/mt/data/MTripStop.kt index 76c8b57..0bdfa12 100644 --- a/src/main/java/org/mtransit/parser/mt/data/MTripStop.kt +++ b/src/main/java/org/mtransit/parser/mt/data/MTripStop.kt @@ -63,6 +63,8 @@ data class MTripStop( companion object { + private const val UID_SEPARATOR = "+" // int IDs can be negative + @Suppress("unused") @JvmStatic fun containsStopIds(mainList: List, otherList: List): Boolean { @@ -85,6 +87,6 @@ data class MTripStop( fun getNewUID( tripId: Long, stopId: Int - ) = "${tripId}-${stopId}" + ) = "${tripId}$UID_SEPARATOR${stopId}" } } \ No newline at end of file diff --git a/src/test/java/org/mtransit/parser/mt/data/MServiceDateTest.kt b/src/test/java/org/mtransit/parser/mt/data/MServiceDateTest.kt new file mode 100644 index 0000000..c56cef3 --- /dev/null +++ b/src/test/java/org/mtransit/parser/mt/data/MServiceDateTest.kt @@ -0,0 +1,66 @@ +package org.mtransit.parser.mt.data + +import org.junit.Assert.assertEquals +import org.junit.Test +import org.mtransit.parser.gtfs.data.GIDs + +class MServiceDateTest { + + @Suppress("UNUSED_CHANGED_VALUE") + @Test + fun `verify compareTo`() { + val serviceDates = mutableListOf( + MServiceDate(GIDs.getInt("3"), 20240218, 0), + // 20240219 + MServiceDate(GIDs.getInt("1"), 20240219, 2), + MServiceDate(GIDs.getInt("1"), 20240219, 0), + MServiceDate(GIDs.getInt("4"), 20240219, 1), + // + MServiceDate(GIDs.getInt("1"), 20240220, 0), + MServiceDate(GIDs.getInt("401"), 20240220, 1), + MServiceDate(GIDs.getInt("4501"), 20240220, 1), + MServiceDate(GIDs.getInt("501"), 20240220, 1), + MServiceDate(GIDs.getInt("1"), 20240221, 0), + // ... + MServiceDate(GIDs.getInt("1"), 20240328, 0), + MServiceDate(GIDs.getInt("401"), 20240328, 1), + MServiceDate(GIDs.getInt("4401"), 20240328, 1), + MServiceDate(GIDs.getInt("501"), 20240328, 1), + // 20240329 + MServiceDate(GIDs.getInt("1"), 20240329, 2), + MServiceDate(GIDs.getInt("4"), 20240329, 1), + MServiceDate(GIDs.getInt("1"), 20240329, 0), + // + MServiceDate(GIDs.getInt("2"), 20240330, 0), + ) + serviceDates.shuffle() + val listSize = serviceDates.size + + val result = serviceDates.sorted(); + + assertEquals(listSize, result.size) + var idx = 0 + assertEquals(MServiceDate(GIDs.getInt("3"), 20240218, 0), result[idx++]) + // 20240219 + assertEquals(MServiceDate(GIDs.getInt("1"), 20240219, 0), result[idx++]) + assertEquals(MServiceDate(GIDs.getInt("1"), 20240219, 2), result[idx++]) + assertEquals(MServiceDate(GIDs.getInt("4"), 20240219, 1), result[idx++]) + // + assertEquals(MServiceDate(GIDs.getInt("1"), 20240220, 0), result[idx++]) + assertEquals(MServiceDate(GIDs.getInt("401"), 20240220, 1), result[idx++]) + assertEquals(MServiceDate(GIDs.getInt("4501"), 20240220, 1), result[idx++]) + assertEquals(MServiceDate(GIDs.getInt("501"), 20240220, 1), result[idx++]) + assertEquals(MServiceDate(GIDs.getInt("1"), 20240221, 0), result[idx++]) + // ... + assertEquals(MServiceDate(GIDs.getInt("1"), 20240328, 0), result[idx++]) + assertEquals(MServiceDate(GIDs.getInt("401"), 20240328, 1), result[idx++]) + assertEquals(MServiceDate(GIDs.getInt("4401"), 20240328, 1), result[idx++]) + assertEquals(MServiceDate(GIDs.getInt("501"), 20240328, 1), result[idx++]) + // 20240329 + assertEquals(MServiceDate(GIDs.getInt("1"), 20240329, 0), result[idx++]) + assertEquals(MServiceDate(GIDs.getInt("1"), 20240329, 2), result[idx++]) + assertEquals(MServiceDate(GIDs.getInt("4"), 20240329, 1), result[idx++]) + // + assertEquals(MServiceDate(GIDs.getInt("2"), 20240330, 0), result[idx++]) + } +} \ No newline at end of file