Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 40 additions & 3 deletions ballista-cli/src/tui/domain/jobs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,16 @@ impl JobsData {
}
}),
SortColumn::StagesCompleted => jobs.sort_by(|a, b| {
let a_stages = a.completed_stages / a.num_stages;
let b_stages = b.completed_stages / b.num_stages;
let cmp = a_stages.cmp(&b_stages);
let stage_completion = |job: &Job| {
if job.num_stages == 0 {
(0_u128, 1_u128)
} else {
(job.completed_stages as u128, job.num_stages as u128)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit : Perhaps 128bit int is an overkill here ?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@coderfender Good point. I switched this to compare f64 completion ratios with total_cmp while keeping the zero-stage guard. The exact u128 fraction comparison was more defensive than this TUI sorting path needs.

}
};
let (a_completed, a_total) = stage_completion(a);
let (b_completed, b_total) = stage_completion(b);
let cmp = (a_completed * b_total).cmp(&(b_completed * a_total));
if self.sort_order == crate::tui::domain::SortOrder::Descending {
cmp.reverse()
} else {
Expand Down Expand Up @@ -588,6 +595,36 @@ mod tests {
assert_eq!(refs[2].status, "Completed");
}

#[test]
fn sort_by_stages_completed_uses_completion_ratio() {
let jobs = vec![
make_job("quarter", "A", "Running", 1, 2, 4, 1, 0),
make_job("three_quarters", "B", "Running", 2, 3, 4, 3, 0),
make_job("half", "C", "Running", 3, 4, 4, 2, 0),
];
let data =
make_jobs_data(jobs, SortColumn::StagesCompleted, SortOrder::Ascending);
let mut refs: Vec<&Job> = data.jobs.iter().collect();
data.sort_jobs(&mut refs);
assert_eq!(refs[0].job_id, "quarter");
assert_eq!(refs[1].job_id, "half");
assert_eq!(refs[2].job_id, "three_quarters");
}

#[test]
fn sort_by_stages_completed_handles_zero_stages() {
let jobs = vec![
make_job("zero", "A", "Running", 1, 2, 0, 0, 0),
make_job("half", "B", "Running", 2, 3, 2, 1, 0),
];
let data =
make_jobs_data(jobs, SortColumn::StagesCompleted, SortOrder::Ascending);
let mut refs: Vec<&Job> = data.jobs.iter().collect();
data.sort_jobs(&mut refs);
assert_eq!(refs[0].job_id, "zero");
assert_eq!(refs[1].job_id, "half");
}

#[test]
fn sort_by_percent_complete_ascending() {
let jobs = vec![
Expand Down
Loading