From 73afcfc152dd27c7baf07b7b3a7af68f9a3366d8 Mon Sep 17 00:00:00 2001 From: Baptiste Prevot Date: Thu, 19 Oct 2023 18:03:58 +0200 Subject: [PATCH] editoast: add ::new methods for track_ranges --- editoast/src/converters/utils.rs | 24 +-- editoast/src/infra_cache/mod.rs | 16 +- editoast/src/models/pathfinding.rs | 153 +++++------------- editoast/src/schema/mod.rs | 35 ++++ editoast/src/schema/route.rs | 12 +- editoast/src/views/infra/pathfinding.rs | 46 ++---- editoast/src/views/pathfinding/catenaries.rs | 59 ++----- .../views/pathfinding/electrical_profiles.rs | 66 ++------ .../src/views/train_schedule/projection.rs | 94 +++-------- 9 files changed, 164 insertions(+), 341 deletions(-) diff --git a/editoast/src/converters/utils.rs b/editoast/src/converters/utils.rs index dc30e4ca7a8..3ef5f8d1d98 100644 --- a/editoast/src/converters/utils.rs +++ b/editoast/src/converters/utils.rs @@ -409,12 +409,12 @@ fn speed_section(edge: &Edge, limit: &String, dir: ApplicableDirections) -> Spee SpeedSection { id, speed_limit, - track_ranges: vec![ApplicableDirectionsTrackRange { - track: edge.id.clone().into(), - begin: 0., - end: edge.length(), - applicable_directions: dir, - }], + track_ranges: vec![ApplicableDirectionsTrackRange::new( + edge.id.clone(), + 0., + edge.length(), + dir, + )], ..Default::default() } } @@ -490,12 +490,12 @@ pub fn catenaries(edge: &Edge) -> Option { edge.tags.get("voltage").map(|voltage| Catenary { id: edge.id.clone().into(), voltage: voltage.clone().into(), - track_ranges: vec![ApplicableDirectionsTrackRange { - track: edge.id.clone().into(), - begin: 0., - end: edge.length(), - applicable_directions: ApplicableDirections::Both, - }], + track_ranges: vec![ApplicableDirectionsTrackRange::new( + edge.id.clone(), + 0., + edge.length(), + ApplicableDirections::Both, + )], }) } diff --git a/editoast/src/infra_cache/mod.rs b/editoast/src/infra_cache/mod.rs index 654972c8e84..1ddd53cd1f5 100644 --- a/editoast/src/infra_cache/mod.rs +++ b/editoast/src/infra_cache/mod.rs @@ -806,12 +806,12 @@ pub mod tests { ) -> SpeedSection { let mut track_ranges = vec![]; for (obj_id, begin, end) in range_list { - track_ranges.push(ApplicableDirectionsTrackRange { - track: obj_id.as_ref().into(), + track_ranges.push(ApplicableDirectionsTrackRange::new( + obj_id, begin, end, - applicable_directions: ApplicableDirections::Both, - }); + ApplicableDirections::Both, + )); } SpeedSection { id: id.as_ref().into(), @@ -825,12 +825,12 @@ pub mod tests { pub fn create_catenary_cache>(id: T, range_list: Vec<(T, f64, f64)>) -> Catenary { let mut track_ranges = vec![]; for (obj_id, begin, end) in range_list { - track_ranges.push(ApplicableDirectionsTrackRange { - track: obj_id.as_ref().into(), + track_ranges.push(ApplicableDirectionsTrackRange::new( + obj_id, begin, end, - applicable_directions: ApplicableDirections::Both, - }); + ApplicableDirections::Both, + )); } Catenary { id: id.as_ref().into(), diff --git a/editoast/src/models/pathfinding.rs b/editoast/src/models/pathfinding.rs index adb7de64f2a..27276db9875 100644 --- a/editoast/src/models/pathfinding.rs +++ b/editoast/src/models/pathfinding.rs @@ -230,88 +230,48 @@ pub mod tests { pub fn simple_pathfinding(infra_id: i64) -> Pathfinding { // T1 T2 T3 T4 T5 // |------> < ------| |------> |------> |------> + let route_paths = vec![ + RoutePath { + route: "route_1".into(), + track_ranges: vec![ + DirectionalTrackRange::new("track_1", 0.0, 10.0, Direction::StartToStop), + DirectionalTrackRange::new("track_2", 7.0, 10.0, Direction::StopToStart), + DirectionalTrackRange::new("track_2", 7.0, 7.0, Direction::StartToStop), + ], + signaling_type: "BAL3".into(), + }, + RoutePath { + route: "route_2".into(), + track_ranges: vec![DirectionalTrackRange::new( + "track_2", + 3.0, + 7.0, + Direction::StopToStart, + )], + signaling_type: "BAL3".into(), + }, + RoutePath { + route: "route_3".into(), + track_ranges: vec![ + DirectionalTrackRange::new("track_2", 0.0, 3.0, Direction::StopToStart), + DirectionalTrackRange::new("track_3", 0.0, 10.0, Direction::StartToStop), + DirectionalTrackRange::new("track_4", 0.0, 2.0, Direction::StartToStop), + ], + signaling_type: "BAL3".into(), + }, + RoutePath { + route: "route_4".into(), + track_ranges: vec![ + DirectionalTrackRange::new("track_4", 2.0, 10.0, Direction::StartToStop), + DirectionalTrackRange::new("track_5", 0.0, 8.0, Direction::StartToStop), + ], + signaling_type: "BAL3".into(), + }, + ]; Pathfinding { infra_id, payload: diesel_json::Json(PathfindingPayload { - route_paths: vec![ - RoutePath { - route: "route_1".into(), - track_ranges: vec![ - DirectionalTrackRange { - track: "track_1".into(), - begin: 0.0, - end: 10.0, - direction: Direction::StartToStop, - }, - DirectionalTrackRange { - track: "track_2".into(), - begin: 7.0, - end: 10.0, - direction: Direction::StopToStart, - }, - DirectionalTrackRange { - // This case happens I swear - track: "track_2".into(), - begin: 7.0, - end: 7.0, - direction: Direction::StartToStop, - }, - ], - signaling_type: "BAL3".into(), - }, - RoutePath { - route: "route_2".into(), - track_ranges: vec![DirectionalTrackRange { - track: "track_2".into(), - begin: 3.0, - end: 7.0, - direction: Direction::StopToStart, - }], - signaling_type: "BAL3".into(), - }, - RoutePath { - route: "route_3".into(), - track_ranges: vec![ - DirectionalTrackRange { - track: "track_2".into(), - begin: 0.0, - end: 3.0, - direction: Direction::StopToStart, - }, - DirectionalTrackRange { - track: "track_3".into(), - begin: 0.0, - end: 10.0, - direction: Direction::StartToStop, - }, - DirectionalTrackRange { - track: "track_4".into(), - begin: 0.0, - end: 2.0, - direction: Direction::StartToStop, - }, - ], - signaling_type: "BAL3".into(), - }, - RoutePath { - route: "route_4".into(), - track_ranges: vec![ - DirectionalTrackRange { - track: "track_4".into(), - begin: 2.0, - end: 10.0, - direction: Direction::StartToStop, - }, - DirectionalTrackRange { - track: "track_5".into(), - begin: 0.0, - end: 8.0, - direction: Direction::StartToStop, - }, - ], - signaling_type: "BAL3".into(), - }, - ], + route_paths, ..Default::default() }), ..Default::default() @@ -353,36 +313,11 @@ pub mod tests { assert_eq!( merged_track_ranges, vec![ - DirectionalTrackRange { - track: "track_1".into(), - begin: 0.0, - end: 10.0, - direction: Direction::StartToStop, - }, - DirectionalTrackRange { - track: "track_2".into(), - begin: 0.0, - end: 10.0, - direction: Direction::StopToStart, - }, - DirectionalTrackRange { - track: "track_3".into(), - begin: 0.0, - end: 10.0, - direction: Direction::StartToStop, - }, - DirectionalTrackRange { - track: "track_4".into(), - begin: 0.0, - end: 10.0, - direction: Direction::StartToStop, - }, - DirectionalTrackRange { - track: "track_5".into(), - begin: 0.0, - end: 8.0, - direction: Direction::StartToStop, - }, + DirectionalTrackRange::new("track_1", 0.0, 10.0, Direction::StartToStop), + DirectionalTrackRange::new("track_2", 0.0, 10.0, Direction::StopToStart), + DirectionalTrackRange::new("track_3", 0.0, 10.0, Direction::StartToStop), + DirectionalTrackRange::new("track_4", 0.0, 10.0, Direction::StartToStop), + DirectionalTrackRange::new("track_5", 0.0, 8.0, Direction::StartToStop), ] ); } diff --git a/editoast/src/schema/mod.rs b/editoast/src/schema/mod.rs index 26ea18a5100..3306ecc5dd5 100644 --- a/editoast/src/schema/mod.rs +++ b/editoast/src/schema/mod.rs @@ -208,6 +208,16 @@ pub struct TrackRange { pub end: f64, } +impl TrackRange { + pub fn new>(track: T, begin: f64, end: f64) -> Self { + Self { + track: track.as_ref().into(), + begin, + end, + } + } +} + #[derive(Debug, Derivative, Clone, Deserialize, Serialize, PartialEq)] #[serde(deny_unknown_fields)] #[derivative(Default)] @@ -244,6 +254,15 @@ impl DirectionalTrackRange { self.begin } } + + pub fn new>(track: T, begin: f64, end: f64, direction: Direction) -> Self { + Self { + track: track.as_ref().into(), + begin, + end, + direction, + } + } } #[derive(Debug, Derivative, Clone, Deserialize, Serialize, PartialEq)] @@ -258,6 +277,22 @@ pub struct ApplicableDirectionsTrackRange { pub applicable_directions: ApplicableDirections, } +impl ApplicableDirectionsTrackRange { + pub fn new>( + track: T, + begin: f64, + end: f64, + applicable_directions: ApplicableDirections, + ) -> Self { + Self { + track: track.as_ref().into(), + begin, + end, + applicable_directions, + } + } +} + #[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash)] #[serde(deny_unknown_fields, rename_all = "SCREAMING_SNAKE_CASE")] pub enum Direction { diff --git a/editoast/src/schema/route.rs b/editoast/src/schema/route.rs index d86d4a37aad..bffedb5864b 100644 --- a/editoast/src/schema/route.rs +++ b/editoast/src/schema/route.rs @@ -109,12 +109,12 @@ impl Route { } else { 0. }; - track_ranges.push(DirectionalTrackRange { - track: cur_track_id.clone().into(), - begin: cur_offset.min(end_offset), - end: cur_offset.max(end_offset), - direction: cur_dir, - }); + track_ranges.push(DirectionalTrackRange::new( + cur_track_id.clone(), + cur_offset.min(end_offset), + cur_offset.max(end_offset), + cur_dir, + )); // Search for the exit_point if cur_track_id == exit_track { diff --git a/editoast/src/views/infra/pathfinding.rs b/editoast/src/views/infra/pathfinding.rs index f693bd5c1a0..759ba680d20 100644 --- a/editoast/src/views/infra/pathfinding.rs +++ b/editoast/src/views/infra/pathfinding.rs @@ -272,22 +272,21 @@ fn build_path_output(path: &Vec, infra_cache: &InfraCache) -> P } else { 0.0 }; - track_ranges.push(DirectionalTrackRange { - track: path[i].track.clone().into(), - begin: path[i].position.min(end), - end: path[i].position.max(end), - direction: path[i].direction, - }); + track_ranges.push(DirectionalTrackRange::new( + path[i].track.clone(), + path[i].position.min(end), + path[i].position.max(end), + path[i].direction, + )); }); let last = &path[path.len() - 1]; let before_last = &path[path.len() - 2]; - track_ranges.push(DirectionalTrackRange { - track: last.track.clone().into(), - begin: last.position.min(before_last.position), - end: last.position.max(before_last.position), - direction: last.direction, - }); - + track_ranges.push(DirectionalTrackRange::new( + last.track.clone(), + last.position.min(before_last.position), + last.position.max(before_last.position), + last.direction, + )); // Fill switches directions let switches_directions = path .iter() @@ -354,24 +353,9 @@ mod tests { assert_eq!( path.track_ranges, vec![ - DirectionalTrackRange { - track: "A".into(), - begin: 30., - end: 500., - direction: Direction::StartToStop - }, - DirectionalTrackRange { - track: "B".into(), - begin: 0., - end: 500., - direction: Direction::StartToStop - }, - DirectionalTrackRange { - track: "C".into(), - begin: 0., - end: 470., - direction: Direction::StartToStop - } + DirectionalTrackRange::new("A", 30., 500., Direction::StartToStop), + DirectionalTrackRange::new("B", 0., 500., Direction::StartToStop), + DirectionalTrackRange::new("C", 0., 470., Direction::StartToStop), ] ); assert_eq!(path.detectors, vec!["D1".into()]); diff --git a/editoast/src/views/pathfinding/catenaries.rs b/editoast/src/views/pathfinding/catenaries.rs index d3ac4d42c3c..34fb463ee2d 100644 --- a/editoast/src/views/pathfinding/catenaries.rs +++ b/editoast/src/views/pathfinding/catenaries.rs @@ -125,6 +125,7 @@ pub mod tests { use osrd_containers::range_map; use rstest::*; use serde_json::from_value; + use ApplicableDirections::*; #[fixture] fn simple_mode_map() -> TrackMap { @@ -155,54 +156,24 @@ pub mod tests { let catenary_schemas = vec![ CatenarySchema { track_ranges: vec![ - ApplicableDirectionsTrackRange { - track: "track_1".into(), - begin: 0.0, - end: 10.0, - applicable_directions: ApplicableDirections::Both, - }, - ApplicableDirectionsTrackRange { - track: "track_2".into(), - begin: 5.0, - end: 10.0, - applicable_directions: ApplicableDirections::Both, - }, + ApplicableDirectionsTrackRange::new("track_1", 0.0, 10.0, Both), + ApplicableDirectionsTrackRange::new("track_2", 5.0, 10.0, Both), ], voltage: "25kV".into(), id: "catenary_1".into(), }, CatenarySchema { track_ranges: vec![ - ApplicableDirectionsTrackRange { - track: "track_2".into(), - begin: 0.0, - end: 5.0, - applicable_directions: ApplicableDirections::Both, - }, - ApplicableDirectionsTrackRange { - track: "track_3".into(), - begin: 0.0, - end: 5.0, - applicable_directions: ApplicableDirections::Both, - }, + ApplicableDirectionsTrackRange::new("track_2", 0.0, 5.0, Both), + ApplicableDirectionsTrackRange::new("track_3", 0.0, 5.0, Both), ], voltage: "25kV".into(), ..Default::default() }, CatenarySchema { track_ranges: vec![ - ApplicableDirectionsTrackRange { - track: "track_3".into(), - begin: 5.0, - end: 10.0, - applicable_directions: ApplicableDirections::Both, - }, - ApplicableDirectionsTrackRange { - track: "track_5".into(), - begin: 0.0, - end: 10.0, - applicable_directions: ApplicableDirections::Both, - }, + ApplicableDirectionsTrackRange::new("track_3", 5.0, 10.0, Both), + ApplicableDirectionsTrackRange::new("track_5", 0.0, 10.0, Both), ], voltage: "1.5kV".into(), ..Default::default() @@ -250,12 +221,9 @@ pub mod tests { .await .expect("Could not load infra_cache"); infra_cache.add(CatenarySchema { - track_ranges: vec![ApplicableDirectionsTrackRange { - track: "track_1".into(), - begin: 0.0, - end: 10.0, - applicable_directions: ApplicableDirections::Both, - }], + track_ranges: vec![ApplicableDirectionsTrackRange::new( + "track_1", 0.0, 10.0, Both, + )], voltage: "25kV".into(), id: "catenary_that_overlaps".into(), }); @@ -287,12 +255,7 @@ pub mod tests { assert_eq!(overlapping_ranges.len(), 1); assert_eq!( overlapping_ranges[0], - ApplicableDirectionsTrackRange { - track: "track_1".into(), - begin: 0.0, - end: 10.0, - applicable_directions: ApplicableDirections::Both, - } + ApplicableDirectionsTrackRange::new("track_1", 0.0, 10.0, Both) ); } diff --git a/editoast/src/views/pathfinding/electrical_profiles.rs b/editoast/src/views/pathfinding/electrical_profiles.rs index 0079301362c..d4f0339ca88 100644 --- a/editoast/src/views/pathfinding/electrical_profiles.rs +++ b/editoast/src/views/pathfinding/electrical_profiles.rs @@ -137,87 +137,43 @@ mod tests { value: "A".into(), power_class: "1".into(), track_ranges: vec![ - TrackRange { - track: "track_1".into(), - begin: 0.0, - end: 10.0, - }, - TrackRange { - track: "track_2".into(), - begin: 5.0, - end: 10.0, - }, + TrackRange::new("track_1", 0.0, 10.0), + TrackRange::new("track_2", 5.0, 10.0), ], }, ElectricalProfile { value: "B".into(), power_class: "1".into(), track_ranges: vec![ - TrackRange { - track: "track_2".into(), - begin: 0.0, - end: 5.0, - }, - TrackRange { - track: "track_4".into(), - begin: 0.0, - end: 5.0, - }, - TrackRange { - track: "track_5".into(), - begin: 5.0, - end: 10.0, - }, + TrackRange::new("track_2", 0.0, 5.0), + TrackRange::new("track_4", 0.0, 5.0), + TrackRange::new("track_5", 5.0, 10.0), ], }, ElectricalProfile { value: "B".into(), power_class: "1".into(), - track_ranges: vec![TrackRange { - track: "track_4".into(), - begin: 5.0, - end: 10.0, - }], + track_ranges: vec![TrackRange::new("track_4", 5.0, 10.0)], }, ElectricalProfile { value: "C".into(), power_class: "1".into(), - track_ranges: vec![TrackRange { - track: "track_3".into(), - begin: 0.0, - end: 10.0, - }], + track_ranges: vec![TrackRange::new("track_3", 0.0, 10.0)], }, ElectricalProfile { value: "A".into(), power_class: "2".into(), track_ranges: vec![ - TrackRange { - track: "track_1".into(), - begin: 0.0, - end: 10.0, - }, - TrackRange { - track: "track_3".into(), - begin: 0.0, - end: 10.0, - }, + TrackRange::new("track_1", 0.0, 10.0), + TrackRange::new("track_3", 0.0, 10.0), ], }, ElectricalProfile { value: "B".into(), power_class: "2".into(), track_ranges: vec![ - TrackRange { - track: "track_2".into(), - begin: 0.0, - end: 10.0, - }, - TrackRange { - track: "track_4".into(), - begin: 0.0, - end: 10.0, - }, + TrackRange::new("track_2", 0.0, 10.0), + TrackRange::new("track_4", 0.0, 10.0), ], }, ], diff --git a/editoast/src/views/train_schedule/projection.rs b/editoast/src/views/train_schedule/projection.rs index ea44e989bb5..f7d97397f67 100644 --- a/editoast/src/views/train_schedule/projection.rs +++ b/editoast/src/views/train_schedule/projection.rs @@ -189,46 +189,31 @@ pub mod tests { route_paths: vec![ RoutePath { route: "rt.buffer_stop.1->DA0".to_string(), - track_ranges: vec![DirectionalTrackRange { - track: Identifier("TA1".to_string()), - begin: 865.693344452354, - end: 1770.0, - direction: Direction::StartToStop, - }], + track_ranges: vec![DirectionalTrackRange::new( + "TA1", + 865.693344452354, + 1770.0, + Direction::StartToStop, + )], signaling_type: "BAL3".to_string(), }, RoutePath { route: "rt.DA0->DA6_1".to_string(), track_ranges: vec![ - DirectionalTrackRange { - track: Identifier("TA1".to_string()), - begin: 1770.0, - end: 1950.0, - direction: Direction::StartToStop, - }, - DirectionalTrackRange { - track: Identifier("TA3".to_string()), - begin: 0.0, - end: 50.0, - direction: Direction::StartToStop, - }, - DirectionalTrackRange { - track: Identifier("TA6".to_string()), - begin: 0.0, - end: 1800.0, - direction: Direction::StartToStop, - }, + DirectionalTrackRange::new("TA1", 1770.0, 1950.0, Direction::StartToStop), + DirectionalTrackRange::new("TA3", 0.0, 50.0, Direction::StartToStop), + DirectionalTrackRange::new("TA6", 0.0, 1800.0, Direction::StartToStop), ], signaling_type: "BAL3".to_string(), }, RoutePath { route: "rt.DA6_1->DA6_2".to_string(), - track_ranges: vec![DirectionalTrackRange { - track: Identifier("TA6".to_string()), - begin: 1800.0, - end: 2364.644651419894, - direction: Direction::StartToStop, - }], + track_ranges: vec![DirectionalTrackRange::new( + "TA6", + 1800.0, + 2364.644651419894, + Direction::StartToStop, + )], signaling_type: "BAL3".to_string(), }, ], @@ -272,18 +257,8 @@ pub mod tests { RoutePath { route: "route_1".to_string(), track_ranges: vec![ - DirectionalTrackRange { - track: Identifier("track_1".to_string()), - begin: 100.0, - end: 1000.0, - direction: Direction::StartToStop, - }, - DirectionalTrackRange { - track: Identifier("track_2".to_string()), - begin: 0.0, - end: 500.0, - direction: Direction::StartToStop, - }, + DirectionalTrackRange::new("track_1", 100.0, 1000.0, Direction::StartToStop), + DirectionalTrackRange::new("track_2", 0.0, 500.0, Direction::StartToStop), ], signaling_type: "BAL3".to_string(), } @@ -294,24 +269,9 @@ pub mod tests { RoutePath { route: "route_2".to_string(), track_ranges: vec![ - DirectionalTrackRange { - track: Identifier("track_2".to_string()), - begin: 500.0, - end: 1000.0, - direction: Direction::StartToStop, - }, - DirectionalTrackRange { - track: Identifier("track_3".to_string()), - begin: 500.0, - end: 1000.0, - direction: Direction::StopToStart, - }, - DirectionalTrackRange { - track: Identifier("track_3".to_string()), - begin: 0.0, - end: 500.0, - direction: Direction::StopToStart, - }, + DirectionalTrackRange::new("track_2", 500.0, 1000.0, Direction::StartToStop), + DirectionalTrackRange::new("track_3", 500.0, 1000.0, Direction::StopToStart), + DirectionalTrackRange::new("track_3", 0.0, 500.0, Direction::StopToStart), ], signaling_type: "BAL3".to_string(), } @@ -322,18 +282,8 @@ pub mod tests { RoutePath { route: "route_2".to_string(), track_ranges: vec![ - DirectionalTrackRange { - track: Identifier("track_3".to_string()), - begin: 500.0, - end: 1000.0, - direction: Direction::StopToStart, - }, - DirectionalTrackRange { - track: Identifier("track_3".to_string()), - begin: 0.0, - end: 500.0, - direction: Direction::StopToStart, - }, + DirectionalTrackRange::new("track_3", 500.0, 1000.0, Direction::StopToStart), + DirectionalTrackRange::new("track_3", 0.0, 500.0, Direction::StopToStart), ], signaling_type: "BAL3".to_string(), }