Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion src/main/java/org/mtransit/parser/DefaultAgencyTools.java
Original file line number Diff line number Diff line change
Expand Up @@ -695,7 +695,17 @@ public boolean allowGTFSIdOverride() {

@Override
public boolean mergeRouteLongName(@NotNull MRoute mRoute, @NotNull MRoute mRouteToMerge) {
return mRoute.mergeLongName(mRouteToMerge);
final String mergedRouteLongName = mergeRouteLongNamesOrNull(mRoute.getLongName(), mRouteToMerge.getLongName());
if (mergedRouteLongName != null) {
mRoute.setLongName(mergedRouteLongName);
}
return mergedRouteLongName != null;
}

@Nullable
@Override
public String mergeRouteLongNamesOrNull(@Nullable String routeLongName1, @Nullable String routeLongName2) {
return GRoute.mergeRouteLongNames(routeLongName1, routeLongName2);
}

@Nullable
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/org/mtransit/parser/gtfs/GAgencyTools.java
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,9 @@ public interface GAgencyTools {

boolean mergeRouteLongName(@NotNull MRoute mRoute, @NotNull MRoute mRouteToMerge);

@Nullable
String mergeRouteLongNamesOrNull(@Nullable String routeLongName1, @Nullable String routeLongName2);

@Nullable
String getRouteColor(@NotNull GRoute gRoute);

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/mtransit/parser/gtfs/GReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -533,7 +533,7 @@ private static void processRoute(GAgencyTools agencyTools, GSpec gSpec, HashMap<
return; // ignore if route already exists with same values
}
if (previousGRoute != null && previousGRoute.equalsExceptMergeable(gRoute)) {
final String mergedRouteLongName = GRoute.mergeRouteLongNames(previousGRoute.getRouteLongName(), gRoute.getRouteLongName());
final String mergedRouteLongName = agencyTools.mergeRouteLongNamesOrNull(previousGRoute.getRouteLongName(), gRoute.getRouteLongName());
final String mergedRouteColor = GRoute.mergeRouteColors(previousGRoute.getRouteColor(), gRoute.getRouteColor());
final Integer mergedRouteSortOrder = GRoute.mergeRouteSortOrders(previousGRoute.getRouteSortOrder(), gRoute.getRouteSortOrder());
if (mergedRouteLongName != null) { // merge successful
Expand Down
17 changes: 9 additions & 8 deletions src/main/java/org/mtransit/parser/gtfs/data/GRoute.kt
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ data class GRoute(
?: throw MTLog.Fatal("Invalid GRoute.$ROUTE_ID from $line!"),
originalRouteId = line[ROUTE_ID] ?: throw MTLog.Fatal("Invalid GRoute.$ROUTE_ID from $line!"),
routeShortName = line[ROUTE_SHORT_NAME]?.trim()
?.let { it.takeIf { it.isNotEmpty() }?.let { agencyTools?.cleanRouteShortName(it) } ?: it }
?.let { rsn -> rsn.takeIf { it.isNotEmpty() }?.let { agencyTools?.cleanRouteShortName(it) } ?: rsn }
?.takeUnless { agencyTools?.useRouteIdForRouteShortName() == true }
?: line[ROUTE_ID]?.trim()?.let { agencyTools?.cleanRouteOriginalId(it) ?: it }
?: EMPTY,
Expand Down Expand Up @@ -214,7 +214,8 @@ data class GRoute(
)
}

private const val SLASH_: String = " / "
private const val SLASH_ = " / "
private const val SLASH= "/"

@JvmStatic
fun mergeRouteLongNames(routeLongName1: String?, routeLongName2: String?): String? {
Expand Down Expand Up @@ -242,11 +243,11 @@ data class GRoute(
routeLongName2.dropLast(suffix.length) +
suffix
}
return if (routeLongName1 > routeLongName2) {
routeLongName2 + SLASH_ + routeLongName1
} else {
routeLongName1 + SLASH_ + routeLongName2
}
val routeLongName1Split = routeLongName1.split(SLASH)
val routeLongName2Split = routeLongName2.split(SLASH)
val routeLongNamesSplit = (routeLongName1Split + routeLongName2Split)
.map { it.trim() }.filter { it.isNotBlank() }.distinct().sorted()
return routeLongNamesSplit.joinToString(SLASH_)
}

@JvmStatic
Expand Down Expand Up @@ -278,4 +279,4 @@ data class GRoute(
return null // -1 // not merged < route sort order not used at the moment
}
}
}
}
46 changes: 1 addition & 45 deletions src/main/java/org/mtransit/parser/mt/data/MRoute.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import org.mtransit.commons.sql.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

data class MRoute(
val id: Long,
Expand Down Expand Up @@ -60,45 +59,6 @@ data class MRoute(
}
}

@Suppress("SameReturnValue")
fun mergeLongName(mRouteToMerge: MRoute?): Boolean {
if (mRouteToMerge == null || mRouteToMerge.longName.isEmpty()) {
return true
} else if (longName.isEmpty()) {
longName = mRouteToMerge.longName
return true
} else if (mRouteToMerge.longName.contains(longName)) {
longName = mRouteToMerge.longName
return true
} else if (longName.contains(mRouteToMerge.longName)) {
return true
}
val prefix = longName.commonPrefixWith(mRouteToMerge.longName)
val maxLength = max(longName.length, mRouteToMerge.longName.length)
if (prefix.length > maxLength / 2) {
longName = prefix +
longName.substring(prefix.length) +
SLASH +
mRouteToMerge.longName.substring(prefix.length)
return true
}
val suffix = longName.commonSuffixWith(mRouteToMerge.longName)
if (suffix.length > maxLength / 2) {
longName = longName.substring(0, longName.length - suffix.length) +
SLASH +
mRouteToMerge.longName.substring(0, mRouteToMerge.longName.length - suffix.length) +
suffix
return true
}
return if (longName > mRouteToMerge.longName) {
longName = mRouteToMerge.longName + SLASH + longName
true
} else {
longName = longName + SLASH + mRouteToMerge.longName
true
}
}

@Suppress("unused")
fun simpleMergeLongName(mRouteToMerge: MRoute?): Boolean {
@Suppress("RedundantIf")
Expand All @@ -114,8 +74,4 @@ data class MRoute(
false // not simple
}
}

companion object {
private const val SLASH = " / "
}
}
}
37 changes: 22 additions & 15 deletions src/test/java/org/mtransit/parser/mt/data/MRouteTest.kt
Original file line number Diff line number Diff line change
@@ -1,35 +1,42 @@
package org.mtransit.parser.mt.data

import org.junit.Assert.assertEquals
import org.junit.Test
import org.mtransit.commons.CommonsApp
import org.mtransit.parser.gtfs.data.GRoute
import kotlin.test.BeforeTest
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotNull

class MRouteTest {

companion object {
private const val ROUTE_TYPE: Int = 0
}

@BeforeTest
fun setUp() {
CommonsApp.setup(false)
}

@Test
fun testMergeLongName_CommonPrefix() {
// Arrange
val route1 = MRoute(1L, "RSN", "Jasper Pl - CN Tower", "000000", "1", ROUTE_TYPE)
val route2 = MRoute(1L, "RSN", "Jasper Pl - Downtown", "000000", "1", ROUTE_TYPE)
// Act
val result = route1.mergeLongName(route2)
// Assert
assertEquals(true, result)
assertEquals("Jasper Pl - CN Tower / Downtown", route1.longName)

val result = GRoute.mergeRouteLongNames(route1.longName, route2.longName)

assertNotNull(result)
assertEquals("Jasper Pl - CN Tower / Downtown", result)
}

@Test
fun testMergeLongName_CommonSuffix() {
// Arrange
val route1 = MRoute(1L, "RSN", "CN Tower - Jasper Pl", "000000", "1", ROUTE_TYPE)
val route2 = MRoute(1L, "RSN", "Downtown - Jasper Pl", "000000", "1", ROUTE_TYPE)
// Act
val result = route1.mergeLongName(route2)
// Assert
assertEquals(true, result)
assertEquals("CN Tower / Downtown - Jasper Pl", route1.longName)

val result = GRoute.mergeRouteLongNames(route1.longName, route2.longName)

assertNotNull(result)
assertEquals("CN Tower / Downtown - Jasper Pl", result)
}
}
}