Return graph data at /graph/data

This commit is contained in:
Joscha 2023-08-14 23:23:36 +02:00
parent 3cf444ffc2
commit 3c9fc1ce75
8 changed files with 138 additions and 5 deletions

View file

@ -1,11 +1,16 @@
use std::collections::HashMap;
use askama::Template;
use axum::{extract::State, response::IntoResponse};
use axum::{extract::State, response::IntoResponse, Json};
use axum_extra::extract::Query;
use serde::{Deserialize, Serialize};
use sqlx::{Acquire, SqlitePool};
use crate::{
config::Config,
server::web::{
base::{Base, Link, Tab},
paths::PathGraph,
paths::{PathGraph, PathGraphData},
r#static::GRAPH_JS,
},
somehow,
@ -28,3 +33,74 @@ pub async fn get_graph(
base,
})
}
#[derive(Deserialize)]
pub struct QueryGraphData {
metric: Vec<String>,
}
#[derive(Serialize)]
struct GraphData {
hashes: Vec<String>,
times: Vec<i64>,
metrics: HashMap<String, Vec<Option<f64>>>,
}
pub async fn get_graph_data(
_path: PathGraphData,
State(db): State<SqlitePool>,
Query(form): Query<QueryGraphData>,
) -> somehow::Result<impl IntoResponse> {
let mut tx = db.begin().await?;
let conn = tx.acquire().await?;
let rows = sqlx::query!(
"\
SELECT \
hash, \
committer_date AS \"committer_date: time::OffsetDateTime\" \
FROM commits \
ORDER BY committer_date ASC, hash ASC \
"
)
.fetch_all(&mut *conn)
.await?;
let mut hashes = Vec::with_capacity(rows.len());
let mut times = Vec::with_capacity(rows.len());
for row in rows {
hashes.push(row.hash);
times.push(row.committer_date.unix_timestamp());
}
let mut metrics = HashMap::new();
for metric in form.metric {
let values = sqlx::query_scalar!(
"\
WITH \
measurements AS ( \
SELECT hash, value, MAX(start) \
FROM runs \
JOIN run_measurements USING (id) \
WHERE name = ? \
GROUP BY hash \
) \
SELECT value \
FROM commits \
LEFT JOIN measurements USING (hash) \
ORDER BY committer_date ASC, hash ASC \
",
metric,
)
.fetch_all(&mut *conn)
.await?;
metrics.insert(metric, values);
}
Ok(Json(GraphData {
hashes,
times,
metrics,
}))
}