Expose max number of project collaborators in Db::get_top_user_activity

This commit is contained in:
Antonio Scandurra 2022-07-18 08:58:09 +02:00
parent ff1185062d
commit 2cbb0ae843

View File

@ -654,16 +654,22 @@ impl Db for PostgresDb {
GROUP BY user_id
ORDER BY total_duration DESC
LIMIT $3
),
project_collaborators as (
SELECT project_id, COUNT(DISTINCT user_id) as project_collaborators
FROM project_durations
GROUP BY project_id
)
SELECT user_durations.user_id, users.github_login, project_id, project_duration
FROM user_durations, project_durations, users
SELECT user_durations.user_id, users.github_login, project_durations.project_id, project_duration, project_collaborators
FROM user_durations, project_durations, project_collaborators, users
WHERE
user_durations.user_id = project_durations.user_id AND
user_durations.user_id = users.id
user_durations.user_id = users.id AND
project_durations.project_id = project_collaborators.project_id
ORDER BY total_duration DESC, user_id ASC
";
let mut rows = sqlx::query_as::<_, (UserId, String, ProjectId, i64)>(query)
let mut rows = sqlx::query_as::<_, (UserId, String, ProjectId, i64, i64)>(query)
.bind(time_period.start)
.bind(time_period.end)
.bind(max_user_count as i32)
@ -671,18 +677,23 @@ impl Db for PostgresDb {
let mut result = Vec::<UserActivitySummary>::new();
while let Some(row) = rows.next().await {
let (user_id, github_login, project_id, duration_millis) = row?;
let (user_id, github_login, project_id, duration_millis, project_collaborators) = row?;
let project_id = project_id;
let duration = Duration::from_millis(duration_millis as u64);
let project_activity = ProjectActivitySummary {
id: project_id,
duration,
max_collaborators: project_collaborators as usize,
};
if let Some(last_summary) = result.last_mut() {
if last_summary.id == user_id {
last_summary.project_activity.push((project_id, duration));
last_summary.project_activity.push(project_activity);
continue;
}
}
result.push(UserActivitySummary {
id: user_id,
project_activity: vec![(project_id, duration)],
project_activity: vec![project_activity],
github_login,
});
}
@ -1314,7 +1325,14 @@ pub struct Project {
pub struct UserActivitySummary {
pub id: UserId,
pub github_login: String,
pub project_activity: Vec<(ProjectId, Duration)>,
pub project_activity: Vec<ProjectActivitySummary>,
}
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct ProjectActivitySummary {
id: ProjectId,
duration: Duration,
max_collaborators: usize,
}
#[derive(Clone, Debug, PartialEq, Serialize)]
@ -1667,19 +1685,35 @@ pub mod tests {
id: user_1,
github_login: "user_1".to_string(),
project_activity: vec![
(project_1, Duration::from_secs(25)),
(project_2, Duration::from_secs(30)),
ProjectActivitySummary {
id: project_1,
duration: Duration::from_secs(25),
max_collaborators: 2
},
ProjectActivitySummary {
id: project_2,
duration: Duration::from_secs(30),
max_collaborators: 2
}
]
},
UserActivitySummary {
id: user_2,
github_login: "user_2".to_string(),
project_activity: vec![(project_2, Duration::from_secs(50))]
project_activity: vec![ProjectActivitySummary {
id: project_2,
duration: Duration::from_secs(50),
max_collaborators: 2
}]
},
UserActivitySummary {
id: user_3,
github_login: "user_3".to_string(),
project_activity: vec![(project_1, Duration::from_secs(15))]
project_activity: vec![ProjectActivitySummary {
id: project_1,
duration: Duration::from_secs(15),
max_collaborators: 2
}]
},
]
);