Skip to content

Commit

Permalink
fixup! editoast: improve performances of batch pathfinding and simula…
Browse files Browse the repository at this point in the history
…tion
  • Loading branch information
flomonster committed Jul 11, 2024
1 parent 9bb34a2 commit f4aee29
Showing 1 changed file with 44 additions and 40 deletions.
84 changes: 44 additions & 40 deletions editoast/src/views/v2/path/pathfinding.rs
Original file line number Diff line number Diff line change
Expand Up @@ -151,48 +151,17 @@ async fn pathfinding_blocks_batch(
if pathfinding_result.is_some() {
continue;
}
let path_items = pathfinding_input.clone().path_items;
if path_items.len() <= 1 {
*pathfinding_result = Some(PathfindingResult::NotEnoughPathItems);
to_cache.push((&hashes[index], PathfindingResult::NotEnoughPathItems));
continue;
}
let locations = extract_location_from_path_items(conn, infra.id, &path_items).await?;
let track_offsets = match locations {
Ok(track_offsets) => track_offsets,
Err(e) => {
let err: PathfindingResult = e.into();
*pathfinding_result = Some(err.clone());
to_cache.push((&hashes[index], err));
continue;
}
};

// Check if tracks exist
if let Err(pathfinding) =
check_tracks_from_path_items(conn, infra.id, &track_offsets).await?
{
*pathfinding_result = Some(pathfinding.clone());
to_cache.push((&hashes[index], pathfinding));
continue;
match build_pathfinding_request(pathfinding_input, conn, infra).await? {
Ok(pathfinding_request) => {
pathfinding_requests.push(pathfinding_request);
pathfinding_requests_index.push(index);
}
Err(result) => {
*pathfinding_result = Some(result.clone());
to_cache.push((&hashes[index], result));
}
}

// Create the pathfinding request
let pathfinding_request = PathfindingRequest {
infra: infra.id,
expected_version: infra.version.clone(),
path_items: track_offsets,
rolling_stock_loading_gauge: pathfinding_input.rolling_stock_loading_gauge,
rolling_stock_is_thermal: pathfinding_input.rolling_stock_is_thermal,
rolling_stock_supported_electrifications: pathfinding_input
.rolling_stock_supported_electrifications
.clone(),
rolling_stock_supported_signaling_systems: pathfinding_input
.rolling_stock_supported_signaling_systems
.clone(),
};
pathfinding_requests.push(pathfinding_request);
pathfinding_requests_index.push(index);
}

// 2) Send pathfinding requests to core
Expand All @@ -217,6 +186,41 @@ async fn pathfinding_blocks_batch(
Ok(pathfinding_results.into_iter().flatten().collect())
}

async fn build_pathfinding_request(
pathfinding_input: &PathfindingInput,
conn: &mut DbConnection,
infra: &Infra,
) -> Result<std::result::Result<PathfindingRequest, PathfindingResult>> {
let path_items = pathfinding_input.clone().path_items;
if path_items.len() <= 1 {
return Ok(Err(PathfindingResult::NotEnoughPathItems));
}
let track_offsets = match extract_location_from_path_items(conn, infra.id, &path_items).await? {
Ok(track_offsets) => track_offsets,
Err(e) => return Ok(Err(e.into())),
};

// Check if tracks exist
if let Err(err) = check_tracks_from_path_items(conn, infra.id, &track_offsets).await? {
return Ok(Err(err));
}

// Create the pathfinding request
Ok(Ok(PathfindingRequest {
infra: infra.id,
expected_version: infra.version.clone(),
path_items: track_offsets,
rolling_stock_loading_gauge: pathfinding_input.rolling_stock_loading_gauge,
rolling_stock_is_thermal: pathfinding_input.rolling_stock_is_thermal,
rolling_stock_supported_electrifications: pathfinding_input
.rolling_stock_supported_electrifications
.clone(),
rolling_stock_supported_signaling_systems: pathfinding_input
.rolling_stock_supported_signaling_systems
.clone(),
}))
}

/// Compute a path given a train schedule and an infrastructure.
pub async fn pathfinding_from_train(
conn: &mut DbConnection,
Expand Down

0 comments on commit f4aee29

Please sign in to comment.