diff --git a/frontend/src/app/api/common/route/route-info-analysis.ts b/frontend/src/app/api/common/route/route-info-analysis.ts index 2e88be8e1..345695d5e 100644 --- a/frontend/src/app/api/common/route/route-info-analysis.ts +++ b/frontend/src/app/api/common/route/route-info-analysis.ts @@ -1,12 +1,9 @@ // this file is generated, please do not modify -import { RouteLocationAnalysis } from '@api/common'; import { RouteMap } from './route-map'; export interface RouteInfoAnalysis { readonly expectedName: string; readonly map: RouteMap; readonly structureStrings: string[]; - readonly geometryDigest: string; - readonly locationAnalysis: RouteLocationAnalysis; } diff --git a/server/src/main/scala/kpn/api/common/route/RouteInfoAnalysis.scala b/server/src/main/scala/kpn/api/common/route/RouteInfoAnalysis.scala index 299088cf0..33d83ca9a 100644 --- a/server/src/main/scala/kpn/api/common/route/RouteInfoAnalysis.scala +++ b/server/src/main/scala/kpn/api/common/route/RouteInfoAnalysis.scala @@ -1,11 +1,7 @@ package kpn.api.common.route -import kpn.api.common.RouteLocationAnalysis - case class RouteInfoAnalysis( expectedName: String, map: RouteMap, structureStrings: Seq[String], - geometryDigest: String, - locationAnalysis: RouteLocationAnalysis ) diff --git a/server/src/main/scala/kpn/core/analysis/RouteMemberWay.scala b/server/src/main/scala/kpn/core/analysis/RouteMemberWay.scala index ab7281f93..2c4dffa68 100644 --- a/server/src/main/scala/kpn/core/analysis/RouteMemberWay.scala +++ b/server/src/main/scala/kpn/core/analysis/RouteMemberWay.scala @@ -4,7 +4,7 @@ import kpn.api.common.data.Element import kpn.api.common.data.Node import kpn.api.common.data.Way import kpn.api.common.route.RouteNetworkNodeInfo -import kpn.server.analyzer.engine.analysis.route.OldRouteNode +import kpn.api.common.route.RouteNode import kpn.server.analyzer.engine.analysis.route.WayAnalyzer case class RouteMemberWay( @@ -17,7 +17,7 @@ case class RouteMemberWay( from: String, to: String, accessible: Boolean, - routeNodes: Seq[OldRouteNode] + routeNodes: Seq[RouteNode] ) extends RouteMember { def memberType: String = "way" @@ -38,12 +38,12 @@ case class RouteMemberWay( def nodes: Seq[RouteNetworkNodeInfo] = routeNodes.map { rn => RouteNetworkNodeInfo( - rn.id, + rn.nodeId, rn.name, rn.alternateName, - rn.longName, - rn.node.latitude, - rn.node.longitude + None, // TODO redesign + "TODO rn.latitude", + "TODO rn.longitude" ) } diff --git a/server/src/main/scala/kpn/core/doc/RouteDetailDoc.scala b/server/src/main/scala/kpn/core/doc/RouteDetailDoc.scala index b53db3c07..b71efc18b 100644 --- a/server/src/main/scala/kpn/core/doc/RouteDetailDoc.scala +++ b/server/src/main/scala/kpn/core/doc/RouteDetailDoc.scala @@ -1,6 +1,7 @@ package kpn.core.doc import kpn.api.base.WithId +import kpn.api.common.RouteLocationAnalysis import kpn.api.common.RouteSummary import kpn.api.common.common.Ref import kpn.api.common.route.RouteEdge @@ -29,6 +30,8 @@ case class RouteDetailDoc( nameDerivedFromNodes: Boolean, nodes: RouteNodes, analysis: RouteInfoAnalysis, + geometryDigest: String, + locationAnalysis: RouteLocationAnalysis, tiles: Seq[String], nodeRefs: Seq[Long], // networkNodeIds elementIds: ElementIds, diff --git a/server/src/main/scala/kpn/core/doc/RouteDoc.scala b/server/src/main/scala/kpn/core/doc/RouteDoc.scala index 1d86db68f..6bb79cb85 100644 --- a/server/src/main/scala/kpn/core/doc/RouteDoc.scala +++ b/server/src/main/scala/kpn/core/doc/RouteDoc.scala @@ -1,6 +1,7 @@ package kpn.core.doc import kpn.api.base.WithId +import kpn.api.common.RouteLocationAnalysis import kpn.api.common.RouteSummary import kpn.api.common.common.Ref import kpn.api.common.route.RouteInfoAnalysis @@ -29,6 +30,7 @@ case class RouteDoc( nameDerivedFromNodes: Boolean, nodes: RouteNodes, analysis: RouteInfoAnalysis, + locationAnalysis: RouteLocationAnalysis, segments: Seq[RouteSegment], paths: Seq[RoutePath], ) extends WithId { diff --git a/server/src/main/scala/kpn/core/tools/analysis/AnalysisStartRouteAnalyzer.scala b/server/src/main/scala/kpn/core/tools/analysis/AnalysisStartRouteAnalyzer.scala index ef58f3c37..5ca855650 100644 --- a/server/src/main/scala/kpn/core/tools/analysis/AnalysisStartRouteAnalyzer.scala +++ b/server/src/main/scala/kpn/core/tools/analysis/AnalysisStartRouteAnalyzer.scala @@ -125,7 +125,7 @@ class AnalysisStartRouteAnalyzer(log: Log, config: AnalysisStartConfiguration)(i key = key, changeType = ChangeType.InitialValue, name = routeDoc.summary.name, - locationAnalysis = routeDoc.analysis.locationAnalysis, + locationAnalysis = routeDoc.locationAnalysis, addedToNetwork = Seq.empty, removedFromNetwork = Seq.empty, before = None, diff --git a/server/src/main/scala/kpn/core/tools/support/location/ResetGeometryDigestTool.scala b/server/src/main/scala/kpn/core/tools/support/location/ResetGeometryDigestTool.scala deleted file mode 100644 index ea92bcfcd..000000000 --- a/server/src/main/scala/kpn/core/tools/support/location/ResetGeometryDigestTool.scala +++ /dev/null @@ -1,32 +0,0 @@ -package kpn.core.tools.support.location - -import kpn.database.base.Database -import kpn.database.util.Mongo - -object ResetGeometryDigestTool { - def main(args: Array[String]): Unit = { - Mongo.executeIn("kpn-prod") { database => - new ResetGeometryDigestTool(database).run() - } - println("Done") - } -} - -class ResetGeometryDigestTool(database: Database) { - - def run(): Unit = { - val routes = new RoutesWithoutLocationQuery(database).execute() - routes.zipWithIndex.foreach { case (route, index) => - println(s"${index + 1}/${routes.size} ${route._id} ${route.name}") - database.routes.findById(route._id) match { - case None => - case Some(route) => - database.routes.save( - route.copy( - analysis = route.analysis.copy(geometryDigest = "") - ) - ) - } - } - } -} diff --git a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/RouteDetailDocBuilder.scala b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/RouteDetailDocBuilder.scala index 146464bd2..30c46c3c6 100644 --- a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/RouteDetailDocBuilder.scala +++ b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/RouteDetailDocBuilder.scala @@ -48,14 +48,9 @@ class RouteDetailDocBuilder(context: RouteDetailAnalysisContext) { ) } - val length: Long = context.ways.map(_.length).sum + val length: Long = context.relation.wayMembers.map(_.way.length).sum - val routeWays: Seq[Way] = { - context.routeMembers.flatMap { - case w: RouteMemberWay => Some(w.way) - case _ => None - } - } + val routeWays: Seq[Way] = context.relation.wayMembers.map(_.way) def routeMemberWays: Seq[RouteMemberWay] = { context.routeMembers.flatMap { @@ -71,9 +66,7 @@ class RouteDetailDocBuilder(context: RouteDetailAnalysisContext) { val routeAnalysis = RouteInfoAnalysis( context.expectedName.getOrElse(""), context.routeMap, - new RouteStructureFormatter(context.structure).strings, - context.geometryDigest, - context.locationAnalysis.get + new RouteStructureFormatter(context.oldStructure).strings, ) val lastUpdatedElement: Element = { @@ -119,6 +112,8 @@ class RouteDetailDocBuilder(context: RouteDetailAnalysisContext) { nameDerivedFromNodes, context.nodes.toRouteNodes, routeAnalysis, + context.geometryDigest, + context._locationAnalysis.get, context.tiles, routeAnalysis.map.nodeIds, context.elementIds, @@ -175,11 +170,11 @@ class RouteDetailDocBuilder(context: RouteDetailAnalysisContext) { private def buildPaths: Seq[RouteDetailPath] = { Seq( - context.newStructure.forwardPath.toSeq.map(path => toRouteDetailPath(path, "forward")), - context.newStructure.backwardPath.toSeq.map(path => toRouteDetailPath(path, "backward")), - context.newStructure.startTentaclePaths.zipWithIndex.map { case (path, index) => toRouteDetailPath(path, s"start-tentacle-${index + 1}") }, - context.newStructure.endTentaclePaths.zipWithIndex.map { case (path, index) => toRouteDetailPath(path, s"end-tentacle-${index + 1}") }, - context.newStructure.otherPaths.zipWithIndex.map { case (path, index) => toRouteDetailPath(path, s"other-${index + 1}") }, + context.structure.forwardPath.toSeq.map(path => toRouteDetailPath(path, "forward")), + context.structure.backwardPath.toSeq.map(path => toRouteDetailPath(path, "backward")), + context.structure.startTentaclePaths.zipWithIndex.map { case (path, index) => toRouteDetailPath(path, s"start-tentacle-${index + 1}") }, + context.structure.endTentaclePaths.zipWithIndex.map { case (path, index) => toRouteDetailPath(path, s"end-tentacle-${index + 1}") }, + context.structure.otherPaths.zipWithIndex.map { case (path, index) => toRouteDetailPath(path, s"other-${index + 1}") }, ).flatten } diff --git a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/RouteMainAnalyzer.scala b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/RouteMainAnalyzer.scala index 866b6aef6..2f3939364 100644 --- a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/RouteMainAnalyzer.scala +++ b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/RouteMainAnalyzer.scala @@ -64,6 +64,7 @@ class RouteMainAnalyzer { context.routeDetailDoc.nameDerivedFromNodes, context.routeDetailDoc.nodes, context.routeDetailDoc.analysis, + context.routeDetailDoc.locationAnalysis, segments, paths ) diff --git a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/OldRouteStructureAnalyzer.scala b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/OldRouteStructureAnalyzer.scala index 077babb41..9beb5cb7b 100644 --- a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/OldRouteStructureAnalyzer.scala +++ b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/OldRouteStructureAnalyzer.scala @@ -36,7 +36,7 @@ class OldRouteStructureAnalyzer(context: RouteDetailAnalysisContext) { // val structure = analyzeStructure(context.oldRouteNodeAnalysis) // analyzeStructure2(context.oldRouteNodeAnalysis, structure, context.fragmentMap.all) context.copy( - _structure = Some(RouteStructure()) // TODO redesign - Some(structure), + _oldStructure = Some(RouteStructure()) // TODO redesign - Some(structure), // oldFacts = oldFacts.toSeq, ) } diff --git a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteAnalysisBuilder.scala b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteAnalysisBuilder.scala index 17ed05643..c3c1731e0 100644 --- a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteAnalysisBuilder.scala +++ b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteAnalysisBuilder.scala @@ -36,7 +36,7 @@ class RouteAnalysisBuilder(context: RouteDetailAnalysisContext) { context.unexpectedNodeIds, context.unexpectedRelationIds, context.expectedName.getOrElse(""), - context.structure, + context.oldStructure, context.oldRouteNodeAnalysis, context.nodes.toRouteNodes ) @@ -44,7 +44,7 @@ class RouteAnalysisBuilder(context: RouteDetailAnalysisContext) { RouteDetailAnalysis( context.relation, routeDetail = route, - structure = context.structure, + structure = context.oldStructure, routeNodeAnalysis = context.oldRouteNodeAnalysis, routeMembers = context._routeMembers.get, ways = context._ways.get, @@ -119,8 +119,6 @@ class RouteAnalysisBuilder(context: RouteDetailAnalysisContext) { expectedName, routeMap, new RouteStructureFormatter(structure).strings, - context.geometryDigest, - context.locationAnalysis.get ) val lastUpdatedElement: Element = { @@ -166,6 +164,8 @@ class RouteAnalysisBuilder(context: RouteDetailAnalysisContext) { nameDerivedFromNodes, nodes, routeAnalysis, + context.geometryDigest, + context.locationAnalysis, context.tiles, routeAnalysis.map.nodeIds, context.elementIds, diff --git a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteLocationAnalyzerImpl.scala b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteLocationAnalyzerImpl.scala index f67f32c08..3bc0e1995 100644 --- a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteLocationAnalyzerImpl.scala +++ b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteLocationAnalyzerImpl.scala @@ -15,10 +15,10 @@ import org.springframework.stereotype.Component class RouteLocationAnalyzerImpl(routeRepository: RouteRepository, routeLocator: RouteLocator) extends RouteLocationAnalyzer { def analyze(context: RouteDetailAnalysisContext): RouteDetailAnalysisContext = { - routeRepository.findRouteById(context.relation.id) match { + routeRepository.findRouteDetailById(context.relation.id) match { case Some(route) => - if (route.analysis.geometryDigest == context.geometryDigest) { - context.copy(locationAnalysis = Some(route.analysis.locationAnalysis)) + if (route.geometryDigest == context.geometryDigest) { + context.copy(_locationAnalysis = Some(route.locationAnalysis)) } else { locate(context) @@ -34,7 +34,7 @@ class RouteLocationAnalyzerImpl(routeRepository: RouteRepository, routeLocator: if (routeLocationAnalysis.location.isEmpty && context.country.nonEmpty) { val country = context.country.get.domain context.copy( - locationAnalysis = Some( + _locationAnalysis = Some( RouteLocationAnalysis( location = Some( Location(Seq(country)) @@ -46,7 +46,7 @@ class RouteLocationAnalyzerImpl(routeRepository: RouteRepository, routeLocator: ) } else { - context.copy(locationAnalysis = Some(routeLocationAnalysis)) + context.copy(_locationAnalysis = Some(routeLocationAnalysis)) } } } diff --git a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteMemberAnalyzer.scala b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteMemberAnalyzer.scala index 8edee355e..99888de61 100644 --- a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteMemberAnalyzer.scala +++ b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteMemberAnalyzer.scala @@ -9,8 +9,8 @@ import kpn.core.analysis.RouteMember import kpn.core.analysis.RouteMemberNode import kpn.core.analysis.RouteMemberWay import kpn.core.analysis.TagInterpreter -import kpn.server.analyzer.engine.analysis.route.OldRouteNodeAnalysis import kpn.server.analyzer.engine.analysis.route.domain.RouteDetailAnalysisContext +import kpn.server.analyzer.engine.analysis.route.structure.RouteAnalysisNodes import kpn.server.analyzer.engine.analysis.route.structure.RouteLinkWay object RouteMemberAnalyzer extends RouteAnalyzer { @@ -22,7 +22,7 @@ object RouteMemberAnalyzer extends RouteAnalyzer { class RouteMemberAnalyzer(context: RouteDetailAnalysisContext) { def analyze: RouteDetailAnalysisContext = { - val routeMembers: Seq[RouteMember] = Seq.empty // TODO redesign - analyzeRouteMembers(context.oldRouteNodeAnalysis) + val routeMembers: Seq[RouteMember] = analyzeRouteMembers(context.nodes) if (routeMembers.exists(!_.accessible)) { context.copy(_routeMembers = Some(routeMembers)).withFact(RouteInaccessible) } @@ -31,7 +31,7 @@ class RouteMemberAnalyzer(context: RouteDetailAnalysisContext) { } } - private def analyzeRouteMembers(routeNodeAnalysis: OldRouteNodeAnalysis): Seq[RouteMember] = { + private def analyzeRouteMembers(nodes: RouteAnalysisNodes): Seq[RouteMember] = { // map with key Node.id and value node number val nodeMap: scala.collection.mutable.Map[Long, Int] = scala.collection.mutable.Map.empty val nodeNumberIterator = (1 to 10000).iterator @@ -71,7 +71,7 @@ class RouteMemberAnalyzer(context: RouteDetailAnalysisContext) { n } - val alternateName = routeNodeAnalysis.routeNodes.find(rn => rn.id == node.id).map(_.alternateName) match { + val alternateName = nodes.nodes.find(rn => rn.node.id == node.id).map(_.alternateName) match { case Some(aname) => aname case _ => name } @@ -97,7 +97,7 @@ class RouteMemberAnalyzer(context: RouteDetailAnalysisContext) { else { false } - }.flatMap(n => routeNodeAnalysis.routeNodes.find(_.id == n.id)) + }.flatMap(n => nodes.nodes.find(_.node.id == n.id)) val name = way.tagValue("name").getOrElse("") val fromNode = if (link.link.direction == LinkDirection.Forward) way.nodes.head else way.nodes.last @@ -137,7 +137,7 @@ class RouteMemberAnalyzer(context: RouteDetailAnalysisContext) { from.toString, to.toString, accessible, - wayNetworkNodes + wayNetworkNodes.map(_.toRouteNode) ) } } diff --git a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteStructureAnalyzer.scala b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteStructureAnalyzer.scala index c33bfac0d..0c2456253 100644 --- a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteStructureAnalyzer.scala +++ b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteStructureAnalyzer.scala @@ -81,7 +81,7 @@ class RouteStructureAnalyzer(context: RouteDetailAnalysisContext) { } context.copy( - _newStructure = Some(structure), + _structure = Some(structure), facts = facts.toSeq, ) } diff --git a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/domain/RouteDetailAnalysisContext.scala b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/domain/RouteDetailAnalysisContext.scala index 574b6ebfb..b7958aaaa 100644 --- a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/domain/RouteDetailAnalysisContext.scala +++ b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/domain/RouteDetailAnalysisContext.scala @@ -53,15 +53,15 @@ case class RouteDetailAnalysisContext( expectedName: Option[String] = None, suspiciousWayIds: Option[Seq[Long]] = None, _fragmentMap: Option[FragmentMap] = None, - _structure: Option[RouteStructure] = None, - _newStructure: Option[Structure] = None, + _oldStructure: Option[RouteStructure] = None, + _structure: Option[Structure] = None, _routeMembers: Option[Seq[RouteMember]] = None, _routeMap: Option[RouteMap] = None, _ways: Option[Seq[Way]] = None, allWayNodes: Option[Seq[Node]] = None, streets: Option[Seq[String]] = None, _geometryDigest: Option[String] = None, - locationAnalysis: Option[RouteLocationAnalysis] = None, + _locationAnalysis: Option[RouteLocationAnalysis] = None, lastSurvey: Option[Day] = None, labels: Seq[String] = Seq.empty, _tileAnalysis: Option[RouteTileAnalysis] = None, @@ -181,14 +181,16 @@ case class RouteDetailAnalysisContext( def fragmentMap: FragmentMap = _fragmentMap.getOrElse(throw new PreconditionMissingException) - def structure: RouteStructure = _structure.getOrElse(throw new PreconditionMissingException) + def oldStructure: RouteStructure = _oldStructure.getOrElse(throw new PreconditionMissingException) - def newStructure: Structure = _newStructure.getOrElse(throw new PreconditionMissingException) + def structure: Structure = _structure.getOrElse(throw new PreconditionMissingException) def routeMembers: Seq[RouteMember] = _routeMembers.getOrElse(throw new PreconditionMissingException) def geometryDigest: String = _geometryDigest.getOrElse(throw new PreconditionMissingException) + def locationAnalysis: RouteLocationAnalysis = _locationAnalysis.getOrElse(throw new PreconditionMissingException) + def tileAnalysis: RouteTileAnalysis = _tileAnalysis.getOrElse(throw new PreconditionMissingException) def oldRouteDetailAnalysis: RouteDetailAnalysis = { diff --git a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/structure/Structure.scala b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/structure/Structure.scala index f2885e655..67fed353c 100644 --- a/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/structure/Structure.scala +++ b/server/src/main/scala/kpn/server/analyzer/engine/analysis/route/structure/Structure.scala @@ -6,4 +6,8 @@ case class Structure( startTentaclePaths: Seq[StructurePath], endTentaclePaths: Seq[StructurePath], otherPaths: Seq[StructurePath] -) +) { + def paths: Seq[StructurePath] = { + forwardPath.toSeq ++ backwardPath.toSeq ++ startTentaclePaths ++ endTentaclePaths ++ otherPaths + } +} diff --git a/server/src/main/scala/kpn/server/analyzer/engine/changes/builder/RouteChangeBuilderImpl.scala b/server/src/main/scala/kpn/server/analyzer/engine/changes/builder/RouteChangeBuilderImpl.scala index 57f37c543..4f07cd91e 100644 --- a/server/src/main/scala/kpn/server/analyzer/engine/changes/builder/RouteChangeBuilderImpl.scala +++ b/server/src/main/scala/kpn/server/analyzer/engine/changes/builder/RouteChangeBuilderImpl.scala @@ -73,7 +73,7 @@ class RouteChangeBuilderImpl( key = key, changeType = ChangeType.Create, name = analysisAfter.name, - locationAnalysis = analysisAfter.routeDetail.analysis.locationAnalysis, + locationAnalysis = analysisAfter.routeDetail.locationAnalysis, addedToNetwork = context.networkAfter.map(_.toRef).toSeq, removedFromNetwork = Seq.empty, before = None, @@ -104,7 +104,7 @@ class RouteChangeBuilderImpl( key = key, changeType = ChangeType.Update, name = analysisAfter.name, - locationAnalysis = analysisAfter.routeDetail.analysis.locationAnalysis, + locationAnalysis = analysisAfter.routeDetail.locationAnalysis, addedToNetwork = context.networkAfter.map(_.toRef).toSeq, removedFromNetwork = Seq.empty, before = Some(analysisBefore.toRouteData), @@ -148,10 +148,10 @@ class RouteChangeBuilderImpl( expectedName = "", map = RouteMap(), structureStrings = Seq.empty, - geometryDigest = "", - locationAnalysis = RouteLocationAnalysis(None, Seq.empty, Seq.empty) ), - lastUpdated = context.changeSetContext.changeSet.timestamp + lastUpdated = context.changeSetContext.changeSet.timestamp, + geometryDigest = "", + locationAnalysis = RouteLocationAnalysis(None, Seq.empty, Seq.empty) ) routeRepository.saveRouteDetail(routeDetailDoc) @@ -169,7 +169,7 @@ class RouteChangeBuilderImpl( key = key, changeType = ChangeType.Delete, name = analysisBefore.name, - locationAnalysis = analysisBefore.routeDetail.analysis.locationAnalysis, + locationAnalysis = analysisBefore.routeDetail.locationAnalysis, addedToNetwork = Seq.empty, removedFromNetwork = context.networkBefore.map(_.toRef).toSeq, before = Some(analysisBefore.toRouteData), @@ -227,7 +227,7 @@ class RouteChangeBuilderImpl( key = key, changeType = ChangeType.Update, name = analysisAfter.name, - locationAnalysis = analysisAfter.routeDetail.analysis.locationAnalysis, + locationAnalysis = analysisAfter.routeDetail.locationAnalysis, addedToNetwork = Seq.empty, removedFromNetwork = context.networkBefore.map(_.toRef).toSeq, before = Some(analysisBefore.toRouteData), @@ -272,7 +272,7 @@ class RouteChangeBuilderImpl( key = key, changeType = ChangeType.Update, name = analysisAfter.name, - locationAnalysis = analysisAfter.routeDetail.analysis.locationAnalysis, + locationAnalysis = analysisAfter.routeDetail.locationAnalysis, addedToNetwork = Seq.empty, removedFromNetwork = Seq.empty, before = Some(analysisBefore.toRouteData), diff --git a/server/src/main/scala/kpn/server/analyzer/engine/changes/route/RouteChangeProcessorImpl.scala b/server/src/main/scala/kpn/server/analyzer/engine/changes/route/RouteChangeProcessorImpl.scala index 7be29e4f1..482e1d0f9 100644 --- a/server/src/main/scala/kpn/server/analyzer/engine/changes/route/RouteChangeProcessorImpl.scala +++ b/server/src/main/scala/kpn/server/analyzer/engine/changes/route/RouteChangeProcessorImpl.scala @@ -163,7 +163,7 @@ class RouteChangeProcessorImpl( key = key, changeType = ChangeType.Create, name = afterRouteDetailDoc.summary.name, - locationAnalysis = afterRouteDetailDoc.analysis.locationAnalysis, + locationAnalysis = afterRouteDetailDoc.locationAnalysis, addedToNetwork = addedToNetwork, removedFromNetwork = removedFromNetwork, before = None, @@ -222,7 +222,7 @@ class RouteChangeProcessorImpl( key = key, changeType = ChangeType.Delete, name = routeDetailDoc.summary.name, - locationAnalysis = routeDetailDoc.analysis.locationAnalysis, + locationAnalysis = routeDetailDoc.locationAnalysis, addedToNetwork = addedToNetwork, removedFromNetwork = removedFromNetwork, before = Some(contextBefore.oldToRouteData), @@ -308,7 +308,7 @@ class RouteChangeProcessorImpl( key = key, changeType = ChangeType.Update, name = routeUpdate.after.name, - locationAnalysis = routeDetailDocAfter.analysis.locationAnalysis, + locationAnalysis = routeDetailDocAfter.locationAnalysis, addedToNetwork = addedToNetwork, removedFromNetwork = removedFromNetwork, before = Some(routeUpdate.before.toRouteData), @@ -372,7 +372,7 @@ class RouteChangeProcessorImpl( key = key, changeType = ChangeType.Delete, name = beforeRouteDetailDoc.summary.name, - locationAnalysis = beforeRouteDetailDoc.analysis.locationAnalysis, + locationAnalysis = beforeRouteDetailDoc.locationAnalysis, addedToNetwork = Seq.empty, removedFromNetwork = removedFromNetwork, before = Some(beforeContext.oldToRouteData), diff --git a/server/src/main/scala/kpn/server/api/analysis/pages/route/RouteDetailsPageBuilderImpl.scala b/server/src/main/scala/kpn/server/api/analysis/pages/route/RouteDetailsPageBuilderImpl.scala index e8abbd6c6..b27e2530e 100644 --- a/server/src/main/scala/kpn/server/api/analysis/pages/route/RouteDetailsPageBuilderImpl.scala +++ b/server/src/main/scala/kpn/server/api/analysis/pages/route/RouteDetailsPageBuilderImpl.scala @@ -31,7 +31,7 @@ class RouteDetailsPageBuilderImpl( val changeCount = changeSetRepository.routeChangesCount(routeId) val networkReferences = routeRepository.networkReferences(routeId) val locationCandidateInfos = { - routeDoc.analysis.locationAnalysis.candidates.map { candidate => + routeDoc.locationAnalysis.candidates.map { candidate => val locationNames = candidate.location.names val locationInfos = locationService.toInfos(language, locationNames, locationNames) LocationCandidateInfo(locationInfos, candidate.percentage) diff --git a/server/src/test/scala/kpn/api/common/SharedTestObjects.scala b/server/src/test/scala/kpn/api/common/SharedTestObjects.scala index 9310dd409..f73ea47a5 100644 --- a/server/src/test/scala/kpn/api/common/SharedTestObjects.scala +++ b/server/src/test/scala/kpn/api/common/SharedTestObjects.scala @@ -416,6 +416,8 @@ trait SharedTestObjects extends MockFactory { nameDerivedFromNodes: Boolean = false, nodes: RouteNodes = RouteNodes(), analysis: RouteInfoAnalysis = newRouteInfoAnalysis(), + geometryDigest: String = "", + locationAnalysis: RouteLocationAnalysis = RouteLocationAnalysis(None, Seq.empty, Seq.empty), facts: Seq[Fact] = Seq.empty, tiles: Seq[String] = Seq.empty, elementIds: ElementIds = ElementIds(), @@ -457,6 +459,8 @@ trait SharedTestObjects extends MockFactory { nameDerivedFromNodes, nodes, analysis, + geometryDigest, + locationAnalysis, tiles, analysis.map.nodeIds, elementIds, @@ -620,16 +624,12 @@ trait SharedTestObjects extends MockFactory { def newRouteInfoAnalysis( expectedName: String = "", map: RouteMap = RouteMap(), - structureStrings: Seq[String] = Seq.empty, - geometryDigest: String = "", - locationAnalysis: RouteLocationAnalysis = newRouteLocationAnalysis() + structureStrings: Seq[String] = Seq.empty ): RouteInfoAnalysis = { RouteInfoAnalysis( expectedName, map, - structureStrings, - geometryDigest, - locationAnalysis + structureStrings ) } @@ -992,6 +992,7 @@ trait SharedTestObjects extends MockFactory { nameDerivedFromNodes: Boolean = false, nodes: RouteNodes = RouteNodes(), analysis: RouteInfoAnalysis = newRouteInfoAnalysis(), + locationAnalysis: RouteLocationAnalysis = RouteLocationAnalysis(None, Seq.empty, Seq.empty), segments: Seq[RouteSegment] = Seq.empty, paths: Seq[RoutePath] = Seq.empty, ): RouteDoc = { @@ -1012,6 +1013,7 @@ trait SharedTestObjects extends MockFactory { nameDerivedFromNodes, nodes, analysis, + locationAnalysis, segments, paths ) @@ -1032,6 +1034,8 @@ trait SharedTestObjects extends MockFactory { nameDerivedFromNodes: Boolean = false, nodes: RouteNodes = RouteNodes(), analysis: RouteInfoAnalysis = newRouteInfoAnalysis(), + geometryDigest: String = "", + locationAnalysis: RouteLocationAnalysis = RouteLocationAnalysis(None, Seq.empty, Seq.empty), tiles: Seq[String] = Seq.empty, nodeRefs: Seq[Long] = Seq.empty, elementIds: ElementIds = ElementIds(), @@ -1057,6 +1061,8 @@ trait SharedTestObjects extends MockFactory { nameDerivedFromNodes, nodes, analysis, + geometryDigest, + locationAnalysis, tiles, nodeRefs, elementIds, diff --git a/server/src/test/scala/kpn/server/analyzer/engine/analysis/caseStudies/Issue109_RoundaboutRoute.scala b/server/src/test/scala/kpn/server/analyzer/engine/analysis/caseStudies/Issue109_RoundaboutRoute.scala index 3739b4ed0..ed4758623 100644 --- a/server/src/test/scala/kpn/server/analyzer/engine/analysis/caseStudies/Issue109_RoundaboutRoute.scala +++ b/server/src/test/scala/kpn/server/analyzer/engine/analysis/caseStudies/Issue109_RoundaboutRoute.scala @@ -46,7 +46,7 @@ class Issue109_RoundaboutRoute extends UnitTest with MockFactory { val context = routeAnalyzer.analyze(relation, None).get assert(context.facts.isEmpty) - assert(context.structure.unusedSegments.isEmpty) + assert(context.oldStructure.unusedSegments.isEmpty) context.routeMap.freeNodes.map(_.id).toSet should equal( Set( diff --git a/server/src/test/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteLabelsAnalyzerTest.scala b/server/src/test/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteLabelsAnalyzerTest.scala index f06a41c5c..1e655cc11 100644 --- a/server/src/test/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteLabelsAnalyzerTest.scala +++ b/server/src/test/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteLabelsAnalyzerTest.scala @@ -51,7 +51,7 @@ class RouteLabelsAnalyzerTest extends UnitTest with SharedTestObjects { test("no location analysis - country location is included") { val context = buildContext().copy( - locationAnalysis = Some( + _locationAnalysis = Some( RouteLocationAnalysis( None, Seq.empty, @@ -83,7 +83,7 @@ class RouteLabelsAnalyzerTest extends UnitTest with SharedTestObjects { country = Some(Country.be), lastSurvey = Some(Day(2020, 8)), facts = Seq(Fact.RouteBroken), - locationAnalysis = Some( + _locationAnalysis = Some( RouteLocationAnalysis( None, Seq.empty, diff --git a/server/src/test/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteLocationAnalyzerMock.scala b/server/src/test/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteLocationAnalyzerMock.scala index 94ac7dfd9..629927a11 100644 --- a/server/src/test/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteLocationAnalyzerMock.scala +++ b/server/src/test/scala/kpn/server/analyzer/engine/analysis/route/analyzers/RouteLocationAnalyzerMock.scala @@ -6,6 +6,6 @@ import kpn.server.analyzer.engine.analysis.route.domain.RouteDetailAnalysisConte class RouteLocationAnalyzerMock extends RouteLocationAnalyzer { def analyze(context: RouteDetailAnalysisContext): RouteDetailAnalysisContext = { - context.copy(locationAnalysis = Some(RouteLocationAnalysis(None, Seq.empty, Seq.empty))) + context.copy(_locationAnalysis = Some(RouteLocationAnalysis(None, Seq.empty, Seq.empty))) } } diff --git a/server/src/test/scala/kpn/server/analyzer/engine/analysis/route/structure/RouteDetailAnalysisTestContext.scala b/server/src/test/scala/kpn/server/analyzer/engine/analysis/route/structure/RouteDetailAnalysisTestContext.scala index bd2169aee..5b7b3f878 100644 --- a/server/src/test/scala/kpn/server/analyzer/engine/analysis/route/structure/RouteDetailAnalysisTestContext.scala +++ b/server/src/test/scala/kpn/server/analyzer/engine/analysis/route/structure/RouteDetailAnalysisTestContext.scala @@ -24,11 +24,11 @@ case class RouteDetailAnalysisTestContext(context: RouteDetailAnalysisContext) { def paths: Seq[String] = { Seq( - context.newStructure.forwardPath.map(path => "forward=" + pathToString(path)).toSeq, - context.newStructure.backwardPath.map(path => "backward=" + pathToString(path)).toSeq, - context.newStructure.startTentaclePaths.map(path => "start-tentacle=" + pathToString(path)).toSeq, - context.newStructure.endTentaclePaths.map(path => "end-tentacle=" + pathToString(path)).toSeq, - context.newStructure.otherPaths.map(path => "other=" + pathToString(path)), + context.structure.forwardPath.map(path => "forward=" + pathToString(path)).toSeq, + context.structure.backwardPath.map(path => "backward=" + pathToString(path)).toSeq, + context.structure.startTentaclePaths.map(path => "start-tentacle=" + pathToString(path)).toSeq, + context.structure.endTentaclePaths.map(path => "end-tentacle=" + pathToString(path)).toSeq, + context.structure.otherPaths.map(path => "other=" + pathToString(path)), ).flatten } diff --git a/server/src/test/scala/kpn/server/analyzer/engine/changes/integration/NetworkUpdateRouteTest01.scala b/server/src/test/scala/kpn/server/analyzer/engine/changes/integration/NetworkUpdateRouteTest01.scala index 7444512d1..1cbaec0ac 100644 --- a/server/src/test/scala/kpn/server/analyzer/engine/changes/integration/NetworkUpdateRouteTest01.scala +++ b/server/src/test/scala/kpn/server/analyzer/engine/changes/integration/NetworkUpdateRouteTest01.scala @@ -186,7 +186,6 @@ class NetworkUpdateRouteTest01 extends IntegrationTest { "forward=(01-02 via +<01-02 101>)", "backward=(02-01 via -<01-02 101>)" ), - geometryDigest = "39dfa55283318d31afe5a3ff4a0e3253e2045e43" ) ) ) @@ -285,7 +284,6 @@ class NetworkUpdateRouteTest01 extends IntegrationTest { "forward=(01-02 via +<01-02 101>)", "backward=(02-01 via -<01-02 101>)" ), - geometryDigest = "39dfa55283318d31afe5a3ff4a0e3253e2045e43" ), nodeRefs = Seq( 1001,