Skip to content

Commit 374a154

Browse files
committed
editoast: move map_to_core_work_schedule to WorkSchedule
Signed-off-by: hamz2a <[email protected]>
1 parent 6c466db commit 374a154

File tree

4 files changed

+61
-53
lines changed

4 files changed

+61
-53
lines changed

editoast/src/models/work_schedules.rs

+50
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1+
use std::cmp::max;
2+
3+
use chrono::DateTime;
14
use chrono::NaiveDateTime;
5+
use chrono::TimeZone;
6+
use chrono::Utc;
27
use editoast_derive::Model;
38
use editoast_schemas::infra::TrackRange;
49
use strum::FromRepr;
@@ -7,6 +12,8 @@ use serde::Deserialize;
712
use serde::Serialize;
813
use utoipa::ToSchema;
914

15+
use crate::core::stdcm::UndirectedTrackRange;
16+
1017
#[derive(Debug, Clone, Model)]
1118
#[model(table = editoast_models::tables::work_schedule_group)]
1219
#[model(gen(ops = crd, batch_ops = c, list))]
@@ -38,3 +45,46 @@ pub struct WorkSchedule {
3845
pub work_schedule_type: WorkScheduleType,
3946
pub work_schedule_group_id: i64,
4047
}
48+
49+
impl WorkSchedule {
50+
pub fn map_to_core_work_schedule(
51+
&self,
52+
start_time: DateTime<Utc>,
53+
) -> crate::core::stdcm::WorkSchedule {
54+
crate::core::stdcm::WorkSchedule {
55+
start_time: elapsed_since_time_ms(&self.start_date_time, &start_time),
56+
end_time: elapsed_since_time_ms(&self.end_date_time, &start_time),
57+
track_ranges: self
58+
.track_ranges
59+
.iter()
60+
.map(|track| UndirectedTrackRange {
61+
track_section: track.track.to_string(),
62+
begin: (track.begin * 1000.0) as u64,
63+
end: (track.end * 1000.0) as u64,
64+
})
65+
.collect(),
66+
}
67+
}
68+
69+
pub fn make_stdcm_work_schedule(
70+
&self,
71+
start_time: DateTime<Utc>,
72+
latest_simulation_end: DateTime<Utc>,
73+
) -> Option<crate::core::stdcm::WorkSchedule> {
74+
let search_window_duration = (latest_simulation_end - start_time).num_milliseconds() as u64;
75+
76+
let ws = self.map_to_core_work_schedule(start_time);
77+
if ws.end_time > 0 && ws.start_time < search_window_duration {
78+
Some(ws)
79+
} else {
80+
None
81+
}
82+
}
83+
}
84+
85+
fn elapsed_since_time_ms(time: &NaiveDateTime, start_time: &DateTime<Utc>) -> u64 {
86+
max(
87+
0,
88+
(Utc.from_utc_datetime(time) - start_time).num_milliseconds(),
89+
) as u64
90+
}

editoast/src/views/timetable.rs

-30
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ pub mod path_not_found_handler;
22
pub mod stdcm;
33
pub mod stdcm_request_payload;
44

5-
use std::cmp::max;
65
use std::collections::HashMap;
76

87
use axum::extract::Json;
@@ -12,10 +11,6 @@ use axum::extract::State;
1211
use axum::http::StatusCode;
1312
use axum::response::IntoResponse;
1413
use axum::Extension;
15-
use chrono::DateTime;
16-
use chrono::NaiveDateTime;
17-
use chrono::TimeZone;
18-
use chrono::Utc;
1914
use derivative::Derivative;
2015
use editoast_authz::BuiltinRole;
2116
use editoast_derive::EditoastError;
@@ -31,15 +26,13 @@ use crate::core::conflict_detection::Conflict;
3126
use crate::core::conflict_detection::ConflictDetectionRequest;
3227
use crate::core::conflict_detection::TrainRequirements;
3328
use crate::core::simulation::SimulationResponse;
34-
use crate::core::stdcm::UndirectedTrackRange;
3529
use crate::core::AsCoreRequest;
3630
use crate::error::Result;
3731
use crate::models::prelude::*;
3832
use crate::models::timetable::Timetable;
3933
use crate::models::timetable::TimetableWithTrains;
4034
use crate::models::train_schedule::TrainSchedule;
4135
use crate::models::train_schedule::TrainScheduleChangeset;
42-
use crate::models::work_schedules::WorkSchedule;
4336
use crate::models::Infra;
4437
use crate::views::train_schedule::train_simulation_batch;
4538
use crate::views::train_schedule::TrainScheduleForm;
@@ -359,29 +352,6 @@ async fn conflicts(
359352
Ok(Json(conflict_detection_response.conflicts))
360353
}
361354

362-
pub fn map_to_core_work_schedule(
363-
ws: &WorkSchedule,
364-
start_time: DateTime<Utc>,
365-
) -> crate::core::stdcm::WorkSchedule {
366-
crate::core::stdcm::WorkSchedule {
367-
start_time: elapsed_since_time_ms(&ws.start_date_time, &start_time),
368-
end_time: elapsed_since_time_ms(&ws.end_date_time, &start_time),
369-
track_ranges: ws
370-
.track_ranges
371-
.iter()
372-
.map(|track| UndirectedTrackRange {
373-
track_section: track.track.to_string(),
374-
begin: (track.begin * 1000.0) as u64,
375-
end: (track.end * 1000.0) as u64,
376-
})
377-
.collect(),
378-
}
379-
}
380-
381-
fn elapsed_since_time_ms(time: &NaiveDateTime, zero: &DateTime<Utc>) -> u64 {
382-
max(0, (Utc.from_utc_datetime(time) - zero).num_milliseconds()) as u64
383-
}
384-
385355
#[cfg(test)]
386356
mod tests {
387357
use axum::http::StatusCode;

editoast/src/views/timetable/path_not_found_handler.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ use crate::models::work_schedules::WorkSchedule;
1414
use crate::views::path::pathfinding::PathfindingResult;
1515
use crate::views::timetable::stdcm::STDCMResponse;
1616

17-
use super::map_to_core_work_schedule;
1817
use super::stdcm::build_train_requirements;
1918

2019
pub struct PathNotFoundHandler {
@@ -108,7 +107,7 @@ fn make_work_schedules_request(
108107

109108
let work_schedule_requirements = work_schedules
110109
.iter()
111-
.map(|ws| (ws.id, map_to_core_work_schedule(ws, start_time)))
110+
.map(|ws| (ws.id, ws.map_to_core_work_schedule(start_time)))
112111
.filter(|(_, ws)| ws.end_time > 0 && ws.start_time < search_window_duration)
113112
.collect();
114113

editoast/src/views/timetable/stdcm.rs

+10-21
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ use thiserror::Error;
2323
use utoipa::IntoParams;
2424
use utoipa::ToSchema;
2525

26-
use super::map_to_core_work_schedule;
2726
use super::path_not_found_handler::PathNotFoundHandler;
2827
use super::stdcm_request_payload::convert_steps;
2928
use super::stdcm_request_payload::STDCMRequestPayload;
@@ -258,11 +257,12 @@ async fn stdcm(
258257
time_gap_after: stdcm_request.time_gap_after,
259258
margin: stdcm_request.margin,
260259
time_step: Some(2000),
261-
work_schedules: filter_stdcm_work_schedules(
262-
&work_schedules,
263-
earliest_departure_time,
264-
latest_simulation_end,
265-
),
260+
work_schedules: work_schedules
261+
.iter()
262+
.filter_map(|ws| {
263+
ws.make_stdcm_work_schedule(earliest_departure_time, latest_simulation_end)
264+
})
265+
.collect(),
266266
temporary_speed_limits,
267267
rolling_stock: PhysicsRollingStock::new(rolling_stock.into(), simulation_parameters),
268268
};
@@ -458,19 +458,6 @@ fn build_single_margin(margin: Option<MarginValue>) -> Margins {
458458
}
459459
}
460460

461-
fn filter_stdcm_work_schedules(
462-
work_schedules: &[WorkSchedule],
463-
start_time: DateTime<Utc>,
464-
latest_simulation_end: DateTime<Utc>,
465-
) -> Vec<crate::core::stdcm::WorkSchedule> {
466-
let search_window_duration = (latest_simulation_end - start_time).num_milliseconds() as u64;
467-
work_schedules
468-
.iter()
469-
.map(|ws| map_to_core_work_schedule(ws, start_time))
470-
.filter(|ws| ws.end_time > 0 && ws.start_time < search_window_duration)
471-
.collect()
472-
}
473-
474461
/// Return the list of speed limits that are active at any point in a given time range
475462
async fn build_temporary_speed_limits(
476463
conn: &mut DbConnection,
@@ -863,8 +850,10 @@ mod tests {
863850
.to_utc();
864851

865852
// WHEN
866-
let filtered =
867-
filter_stdcm_work_schedules(&work_schedules, start_time, latest_simulation_end);
853+
let filtered: Vec<_> = work_schedules
854+
.iter()
855+
.filter_map(|ws| ws.make_stdcm_work_schedule(start_time, latest_simulation_end))
856+
.collect();
868857

869858
// THEN
870859
assert!(filtered.is_empty() == filtered_out);

0 commit comments

Comments
 (0)