Skip to content

Commit d8769f3

Browse files
editoast: add models for timetable and train schedule v2
Co-authored-by: Youness Chrifi Alaoui <[email protected]>
1 parent ae4ec0a commit d8769f3

File tree

3 files changed

+109
-2
lines changed

3 files changed

+109
-2
lines changed

editoast/src/modelsv2/mod.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ pub mod documents;
22
pub mod infra_objects;
33
pub mod projects;
44
pub mod railjson;
5-
6-
pub use projects::{Ordering, Project};
5+
pub mod timetable;
6+
pub mod train_schedule;
77

88
pub use documents::Document;
99
pub use infra_objects::*;
10+
pub use projects::{Ordering, Project};
1011

1112
use async_trait::async_trait;
1213
use diesel::{pg::Pg, result::Error::NotFound, AsChangeset, QueryableByName};

editoast/src/modelsv2/timetable.rs

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
use crate::diesel::query_dsl::methods::DistinctDsl;
2+
use crate::error::Result;
3+
use crate::models::List;
4+
use crate::models::NoParams;
5+
use crate::modelsv2::{Retrieve, Row};
6+
use crate::tables::timetable_v2::dsl;
7+
use crate::views::pagination::Paginate;
8+
use crate::views::pagination::PaginatedResponse;
9+
use async_trait::async_trait;
10+
use diesel::sql_query;
11+
use diesel::sql_types::{Array, BigInt, Nullable};
12+
use diesel_async::AsyncPgConnection as PgConnection;
13+
use editoast_derive::ModelV2;
14+
15+
#[derive(Debug, Default, Clone, ModelV2)]
16+
#[model(table = crate::tables::timetable_v2)]
17+
#[model(changeset(public))]
18+
pub struct Timetable {
19+
pub id: i64,
20+
pub electrical_profile_set_id: Option<i64>,
21+
}
22+
23+
#[async_trait]
24+
impl List<NoParams> for Timetable {
25+
async fn list_conn(
26+
conn: &mut PgConnection,
27+
page: i64,
28+
page_size: i64,
29+
_: NoParams,
30+
) -> Result<PaginatedResponse<Self>> {
31+
let timetable_rows = dsl::timetable_v2
32+
.distinct()
33+
.paginate(page, page_size)
34+
.load_and_count::<Row<Timetable>>(conn)
35+
.await?;
36+
37+
Ok(timetable_rows.into())
38+
}
39+
}
40+
41+
/// Should be used to retrieve a timetable with its trains
42+
#[derive(Debug, Clone, QueryableByName)]
43+
pub struct TimetableWithTrains {
44+
#[diesel(sql_type = BigInt)]
45+
pub id: i64,
46+
#[diesel(sql_type = Nullable<BigInt>)]
47+
pub electrical_profile_set_id: Option<i64>,
48+
#[diesel(sql_type = Array<BigInt>)]
49+
pub train_ids: Vec<i64>,
50+
}
51+
52+
#[async_trait::async_trait]
53+
impl Retrieve<i64> for TimetableWithTrains {
54+
async fn retrieve(
55+
conn: &mut diesel_async::AsyncPgConnection,
56+
timetable_id: i64,
57+
) -> Result<Option<Self>> {
58+
use diesel_async::RunQueryDsl;
59+
let result = sql_query(
60+
"SELECT timetable_v2.*,
61+
array_remove(array_agg(train_schedule_v2.id), NULL) as train_ids
62+
FROM timetable_v2
63+
LEFT JOIN train_schedule_v2 ON timetable_v2.id = train_schedule_v2.timetable_id
64+
WHERE timetable_v2.id = $1
65+
GROUP BY timetable_v2.id",
66+
)
67+
.bind::<BigInt, _>(timetable_id)
68+
.get_result::<TimetableWithTrains>(conn)
69+
.await;
70+
match result {
71+
Ok(result) => Ok(Some(result)),
72+
Err(diesel::result::Error::NotFound) => Ok(None),
73+
Err(err) => Err(err.into()),
74+
}
75+
}
76+
}
+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use crate::schema::v2::trainschedule::{
2+
Comfort, Distribution, Margins, PathItem, PowerRestrictionItem, ScheduleItem,
3+
TrainScheduleOptions,
4+
};
5+
use crate::DieselJson;
6+
use chrono::{DateTime, Utc};
7+
use editoast_derive::ModelV2;
8+
9+
#[derive(Debug, Default, Clone, ModelV2)]
10+
#[model(table = crate::tables::train_schedule_v2)]
11+
#[model(changeset(public))]
12+
pub struct TrainSchedule {
13+
pub id: i64,
14+
pub train_name: String,
15+
pub labels: Vec<Option<String>>,
16+
pub rolling_stock_name: String,
17+
pub timetable_id: i64,
18+
pub start_time: DateTime<Utc>,
19+
pub schedule: DieselJson<Vec<ScheduleItem>>,
20+
pub margins: DieselJson<Margins>,
21+
pub initial_speed: f64,
22+
#[model(to_enum)]
23+
pub comfort: Comfort,
24+
pub path: DieselJson<Vec<PathItem>>,
25+
#[model(to_enum)]
26+
pub constraint_distribution: Distribution,
27+
pub speed_limit_tag: Option<String>,
28+
pub power_restrictions: DieselJson<Vec<PowerRestrictionItem>>,
29+
pub options: DieselJson<TrainScheduleOptions>,
30+
}

0 commit comments

Comments
 (0)