Skip to content

Commit

Permalink
#278 monitor route analysis - wip
Browse files Browse the repository at this point in the history
  • Loading branch information
vmarc committed Jan 14, 2024
1 parent d5b3069 commit 5e977b8
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 42 deletions.
Expand Up @@ -71,47 +71,61 @@ class MonitorRouteElementAnalyzer(wayMembers: Seq[WayMember]) {
case _ =>
}

val previousElementOption = elements.lastOption
finalizeCurrentElement() match {
case None =>
case Some(element) =>
if (element.isLoop) {
val elementNodeIds = element.fragments.zipWithIndex.flatMap { case (fragment, index) =>
if (index == 0) {
Seq(fragment.startNode.id, fragment.endNode.id)
}
else {
Seq(fragment.endNode.id)
}
previousElementOption match {
case Some(previousElement) => if (previousElement.startNodeId == element.endNodeId) {
contextEndNodeId = Some(previousElement.endNodeId)
true
}

val splitNodeIdOption = elementNodeIds.find { nodeId =>
nodeId == contextCurrentWayMember.startNode.id || nodeId == contextCurrentWayMember.endNode.id
}

splitNodeIdOption match {
case None => // no connection, leave the loop as-is
case Some(splitNodeId) =>
// split
val fragments1 = element.fragments.takeWhile(fragment => fragment.startNode.id != splitNodeId)
val fragments2 = element.fragments.drop(fragments1.length)

val oppositeDirection = elementDirection match {
case Some(ElementDirection.Down) => Some(ElementDirection.Up)
case Some(ElementDirection.Up) => Some(ElementDirection.Down)
case _ => None
}
val element1 = MonitorRouteElement.from(fragments1, elementDirection)
val element2 = MonitorRouteElement.from(fragments2, oppositeDirection)

debug(s" split element1: direction=${element1.direction}, fragments: ${element1.fragments.map(_.string).mkString(", ")}")
debug(s" split element2: direction=${element2.direction}, fragments: ${element2.fragments.map(_.string).mkString(", ")}")

elements.remove(elements.length - 1)
elements.addOne(element1)
elements.addOne(element2)
contextEndNodeId = Some(splitNodeId)
else {
false
}
case None => true
}

// if (isLoop) {
//
//
// val elementNodeIds = element.fragments.zipWithIndex.flatMap { case (fragment, index) =>
// if (index == 0) {
// Seq(fragment.startNode.id, fragment.endNode.id)
// }
// else {
// Seq(fragment.endNode.id)
// }
// }
//
// val splitNodeIdOption = elementNodeIds.find { nodeId =>
// nodeId == contextCurrentWayMember.startNode.id || nodeId == contextCurrentWayMember.endNode.id
// }
//
// splitNodeIdOption match {
// case None => // no connection, leave the loop as-is
// case Some(splitNodeId) =>
// // split
// val fragments1 = element.fragments.takeWhile(fragment => fragment.startNode.id != splitNodeId)
// val fragments2 = element.fragments.drop(fragments1.length)
//
// val oppositeDirection = elementDirection match {
// case Some(ElementDirection.Down) => Some(ElementDirection.Up)
// case Some(ElementDirection.Up) => Some(ElementDirection.Down)
// case _ => None
// }
// val element1 = MonitorRouteElement.from(fragments1, elementDirection)
// val element2 = MonitorRouteElement.from(fragments2, oppositeDirection)
//
// debug(s" split element1: direction=${element1.direction}, fragments: ${element1.fragments.map(_.string).mkString(", ")}")
// debug(s" split element2: direction=${element2.direction}, fragments: ${element2.fragments.map(_.string).mkString(", ")}")
//
// elements.remove(elements.length - 1)
// elements.addOne(element1)
// elements.addOne(element2)
// contextEndNodeId = Some(splitNodeId)
// }
// }
}

elementDirection = None
Expand Down Expand Up @@ -260,7 +274,7 @@ class MonitorRouteElementAnalyzer(wayMembers: Seq[WayMember]) {
// switch
finalizeCurrentElement()
elementDirection = Some(ElementDirection.Up)
addFragment(contextCurrentWayMember)
addFragmentReversed(contextCurrentWayMember)
}
else {
finalizeCurrentGroup()
Expand All @@ -269,13 +283,13 @@ class MonitorRouteElementAnalyzer(wayMembers: Seq[WayMember]) {
}
}
}
else {
else { // direction Up
findPreviousFragment() match {
case None => throw new Exception("illegal state?")
case Some(previousFragment) =>

if (contextCurrentWayMember.endNode.id == previousFragment.startNode.id) {
addFragment(contextCurrentWayMember)
addFragmentReversed(contextCurrentWayMember)
}
else {
currentElementFragments.headOption match {
Expand Down
Expand Up @@ -158,14 +158,14 @@ class MonitorRouteElementAnalyzerTest extends UnitTest {
)
}

test("forward") {
test("forward/backward") {
val result = analyze(
new MonitorRouteTestData() {
memberWay(11, "", 1, 2)
memberWay(12, "forward", 2, 3)
memberWay(13, "forward", 3, 8)
memberWay(14, "forward", 8, 7)
memberWay(15, "forward", 7, 2)
memberWay(14, "backward", 2, 7)
memberWay(15, "backward", 7, 8)
memberWay(16, "", 8, 9)
}
).shouldMatchTo(
Expand All @@ -180,7 +180,51 @@ class MonitorRouteElementAnalyzerTest extends UnitTest {
)
}

test("forward and gap") {
test("forward/backward 2") { // TODO further investigate deviation from reference
val result = analyze(
new MonitorRouteTestData() {
memberWay(11, "", 1, 2)
memberWay(12, "forward", 2, 3)
memberWay(13, "forward", 3, 8)
memberWay(14, "backward", 2, 7)
memberWay(15, "forward", 8, 7)
memberWay(16, "", 8, 9)
}
).shouldMatchTo(
Seq(
Seq(
"1>2",
"2>3>8 (Down)",
"8>7>2 (Up)",
"8>9",
)
)
)
}

test("forward") { // TODO further investigate deviation from reference
val result = analyze(
new MonitorRouteTestData() {
memberWay(11, "", 1, 2)
memberWay(12, "forward", 2, 3)
memberWay(13, "forward", 3, 8)
memberWay(14, "forward", 7, 2)
memberWay(15, "forward", 8, 7)
memberWay(16, "", 8, 9)
}
).shouldMatchTo(
Seq(
Seq(
"1>2",
"2>3>8 (Down)",
"8>7>2 (Up)",
"8>9",
)
)
)
}

test("forward and gap") { // TODO further investigate deviation from reference
val result = analyze(
new MonitorRouteTestData() {
memberWay(11, "", 1, 2)
Expand Down

0 comments on commit 5e977b8

Please sign in to comment.