public static void Run(IConduitNetworkQueryService conduitNetworkQueryService, IMediator CommandBus) { Dictionary <string, ConduitBuildInfo> conduitBuildInfos = new Dictionary <string, ConduitBuildInfo>(); // First find all main conduits. // Format ConduitSpecCode-ConduitNumber-(Marking) - i.e. "G10F-1-BL" // Having no underscores (which are used on single conduits that must connected to multi conduits) foreach (var segmentBuildCode in RouteNetworkBuilder._segmentBuildCodes) { var segmentId = segmentBuildCode.Key; var buildCodes = segmentBuildCode.Value; foreach (var buildCode in buildCodes) { // Single conduits (that is connected to a multi conduit) have "_" in spec code if (buildCode.Contains("_")) { var newConduitBuildInfo = new ConduitBuildInfo(); newConduitBuildInfo.BuildCode = buildCode; newConduitBuildInfo.MultiConduit = false; newConduitBuildInfo.BuildCodeSpecificationCode = "Ø12"; // Create build conduit info object, if not exists if (!conduitBuildInfos.ContainsKey(buildCode)) { conduitBuildInfos.Add(buildCode, newConduitBuildInfo); } var conduitBuildInfo = conduitBuildInfos[buildCode]; // Add segment id to build info object conduitBuildInfo.AddRelatedRouteSegmentIdBuildInfo(segmentId); } else // We're delaing with a multi conduit or single conduit not connected { var newConduitBuildInfo = new ConduitBuildInfo(); newConduitBuildInfo.BuildCode = buildCode; string[] buildCodeSplit = buildCode.Split('-'); newConduitBuildInfo.BuildCodeSpecificationCode = buildCodeSplit[0]; newConduitBuildInfo.BuildCodeConduitId = Int32.Parse(buildCodeSplit[1]); if (buildCode.StartsWith("S")) { newConduitBuildInfo.MultiConduit = false; } else { newConduitBuildInfo.MultiConduit = true; } if (buildCodeSplit.Length > 2) { newConduitBuildInfo.BuildCodeMarking = buildCodeSplit[2]; } // Create build conduit info object, if not exists if (!conduitBuildInfos.ContainsKey(buildCode)) { conduitBuildInfos.Add(buildCode, newConduitBuildInfo); } var conduitBuildInfo = conduitBuildInfos[buildCode]; // Add segment id to build info object conduitBuildInfo.AddRelatedRouteSegmentIdBuildInfo(segmentId); } } } // Sort and validate all conduit build infos foreach (var conduitBuildInfo in conduitBuildInfos) { conduitBuildInfo.Value.Prepare(RouteNetworkBuilder._routeGraph); var registerWalkOfInterestCmd = new RegisterWalkOfInterestCommand(); registerWalkOfInterestCmd.WalkOfInterestId = conduitBuildInfo.Value.WalkOfInterestId; // First create walk of interest registerWalkOfInterestCmd.RouteElementIds = RouteNetworkBuilder._routeGraph.GetNodeLinkPathFromLinkPath(conduitBuildInfo.Value.relatedRouteSegmentIds); CommandBus.Send(registerWalkOfInterestCmd).Wait(); // Create multi conduit if (conduitBuildInfo.Value.MultiConduit) { var placeMultiConduitCommand = new PlaceMultiConduitCommand() { MultiConduitId = conduitBuildInfo.Value.Id, WalkOfInterestId = conduitBuildInfo.Value.WalkOfInterestId, DemoDataSpec = conduitBuildInfo.Key }; CommandBus.Send(placeMultiConduitCommand).Wait(); } // Create single conduit else { var placeSingleConduitCommand = new PlaceSingleConduitCommand() { SingleConduitId = conduitBuildInfo.Value.Id, WalkOfInterestId = conduitBuildInfo.Value.WalkOfInterestId, DemoDataSpec = conduitBuildInfo.Key }; CommandBus.Send(placeSingleConduitCommand).Wait(); } } // Do the cuts and connections HashSet <string> cutAlreadDone = new HashSet <string>(); foreach (var segmentBuildCode in RouteNetworkBuilder._segmentBuildCodes) { var segmentId = segmentBuildCode.Key; var buildCodes = segmentBuildCode.Value; foreach (var buildCode in buildCodes) { // Build codes containing _, is where conduits should be connected to each other if (buildCode.Contains("_") && !cutAlreadDone.Contains(buildCode)) { cutAlreadDone.Add(buildCode); // Extract the different values from build code string string[] buildCodeSplit = buildCode.Split('_'); int innerConduitNumberToCut = Int32.Parse(buildCodeSplit[1]); // Find multi conduit to breakout/connect var multiConduitBuildInfo = conduitBuildInfos[buildCodeSplit[0]]; var multiConduitWalkOfInterest = RouteNetworkBuilder._routeGraph.GetNodeLinkPathFromLinkPath(multiConduitBuildInfo.relatedRouteSegmentIds); // Find single conduit that has to be connected to the multi conduit var singleConduitBuildInfo = conduitBuildInfos[buildCode]; var singleConduitSegments = RouteNetworkBuilder._segmentBuildCodes.Where(n => n.Value.Contains(buildCode)).ToList(); // Find segment that har start or end in multi conduit Link singleConduitLink = null; foreach (var singleConduitSegmentId in singleConduitSegments) { singleConduitLink = RouteNetworkBuilder._routeGraph.Links[singleConduitSegmentId.Key]; if (multiConduitWalkOfInterest.Contains(Guid.Parse(singleConduitLink.StartNode.Id))) { break; } if (multiConduitWalkOfInterest.Contains(Guid.Parse(singleConduitLink.EndNode.Id))) { break; } } // find the point of interest (the node where the single conduit connected witht the multi conduit) Guid pointOfInterest = Guid.Empty; ConduitEndKindEnum customerConduitConnectKind = ConduitEndKindEnum.Outgoing; if (multiConduitWalkOfInterest.Contains(Guid.Parse(singleConduitLink.StartNode.Id))) { pointOfInterest = Guid.Parse(singleConduitLink.StartNode.Id); } else if (multiConduitWalkOfInterest.Contains(Guid.Parse(singleConduitLink.EndNode.Id))) { pointOfInterest = Guid.Parse(singleConduitLink.EndNode.Id); customerConduitConnectKind = ConduitEndKindEnum.Outgoing; } if (buildCode == "G12F-1-BL_3") { } // Cut the inner conduit in the multi conduit, if not end if (!(multiConduitWalkOfInterest[0] == pointOfInterest || multiConduitWalkOfInterest[multiConduitWalkOfInterest.Count - 1] == pointOfInterest)) { // First cut the outer conduit, if not already cut if (!conduitNetworkQueryService.CheckIfConduitIsCut(multiConduitBuildInfo.Id, pointOfInterest)) { var cutOuterConduitCommand = new CutOuterConduitCommand() { MultiConduitId = multiConduitBuildInfo.Id, PointOfInterestId = pointOfInterest, }; CommandBus.Send(cutOuterConduitCommand).Wait(); } // Cut the inner conduit var cutInnerConduitCommand = new CutInnerConduitCommand() { MultiConduitId = multiConduitBuildInfo.Id, PointOfInterestId = pointOfInterest, InnerConduitSequenceNumber = innerConduitNumberToCut }; CommandBus.Send(cutInnerConduitCommand).Wait(); } // Junction Guid newJunctionId = Guid.NewGuid(); // Connect inner conduit in the multi conduit var connectInnerConduitCommand = new ConnectInnerConduitToJunction() { MultiConduitId = multiConduitBuildInfo.Id, PointOfInterestId = pointOfInterest, InnerConduitSequenceNumber = innerConduitNumberToCut, ConnectedJunctionId = newJunctionId, ConnectedEndKind = ConduitNetwork.Events.Model.ConduitEndKindEnum.Incomming }; CommandBus.Send(connectInnerConduitCommand).Wait(); // Connect customer conduit to the multi conduit var connectCustomerConduitCommand = new ConnectSingleConduitToJunction() { SingleConduitId = singleConduitBuildInfo.Id, PointOfInterestId = pointOfInterest, ConnectedJunctionId = newJunctionId, ConnectedEndKind = customerConduitConnectKind }; CommandBus.Send(connectCustomerConduitCommand).Wait(); } } } /* * RouteWalkRelationTypeEnum type = RouteWalkRelationTypeEnum.StartNode; * * // Create conduit walk of interests objects * foreach (var networkElementId in nodeLinkIds) * { * migrationBuilder.InsertData( * table: "RouteElementWalkOfInterestRelations", * columns: new[] { "RouteElementId", "WalkOfInterestId", "SeqNo", "Type" }, * values: new object[] { * networkElementId, * walkOfInterestId, * seqNo, * (int)type * } * ); * * if (type == RouteWalkRelationTypeEnum.IntermediateSegment && (seqNo == (nodeLinkIds.Count - 1))) * type = RouteWalkRelationTypeEnum.EndNode; * else if (type == RouteWalkRelationTypeEnum.IntermediateSegment) * type = RouteWalkRelationTypeEnum.IntermediateNode; * else if (type == RouteWalkRelationTypeEnum.StartNode || type == RouteWalkRelationTypeEnum.IntermediateNode) * type = RouteWalkRelationTypeEnum.IntermediateSegment; * else if (type == RouteWalkRelationTypeEnum.EndNode) * { * // do nothing we're finish * } * else * { * throw new NotSupportedException("Something went wrong in route walk relation write logic. Code broken!"); * } * * seqNo++; */ }