diff --git a/pgml-dashboard/src/lib.rs b/pgml-dashboard/src/lib.rs index f8e747d4e..0fa686a2f 100644 --- a/pgml-dashboard/src/lib.rs +++ b/pgml-dashboard/src/lib.rs @@ -19,6 +19,7 @@ pub mod guards; pub mod models; mod responses; mod templates; +mod utils; use guards::Cluster; use responses::{BadRequest, ResponseOk}; @@ -558,6 +559,7 @@ pub async fn uploaded_index(cluster: Cluster, table_name: &str) -> ResponseOk { let sql = templates::Sql::new( cluster.pool(), &format!("SELECT * FROM {} LIMIT 10", table_name), + true, ) .await .unwrap(); diff --git a/pgml-dashboard/src/models.rs b/pgml-dashboard/src/models.rs index 3fbcaaf79..13fb5fb63 100644 --- a/pgml-dashboard/src/models.rs +++ b/pgml-dashboard/src/models.rs @@ -296,18 +296,19 @@ impl Cell { pub async fn render(&mut self, pool: &PgPool) -> anyhow::Result<()> { let cell_type: CellType = self.cell_type.into(); - let rendering = match cell_type { + let (rendering, execution_time) = match cell_type { CellType::Sql => { - let queries = self.contents.split(";"); + let queries: Vec<&str> = self.contents.split(';').filter(|q| !q.trim().is_empty()).collect(); let mut rendering = String::new(); + let mut total_execution_duration = std::time::Duration::default(); + let render_individual_execution_duration = queries.len() > 1; for query in queries { - if query.trim().is_empty() { - continue; - } - - let result = match templates::Sql::new(pool, query).await { - Ok(sql) => sql.render_once()?, + let result = match templates::Sql::new(pool, query, render_individual_execution_duration).await { + Ok(sql) => { + total_execution_duration += sql.execution_duration; + sql.render_once()? + }, Err(err) => templates::SqlError { error: format!("{:?}", err), } @@ -317,7 +318,12 @@ impl Cell { rendering.push_str(&result); } - rendering + let execution_time = PgInterval{ + months: 0, + days: 0, + microseconds: total_execution_duration.as_micros().try_into().unwrap_or(0) + }; + (rendering, Some(execution_time)) } CellType::Markdown => { @@ -335,21 +341,23 @@ impl Cell { front_matter_delimiter: None, }; - format!( + (format!( "
{}
", markdown_to_html(&self.contents, &options) - ) + ), None) } }; sqlx::query!( - "UPDATE pgml.notebook_cells SET rendering = $1 WHERE id = $2", + "UPDATE pgml.notebook_cells SET rendering = $1, execution_time = $2 WHERE id = $3", rendering, + execution_time, self.id ) .execute(pool) .await?; + self.execution_time = execution_time; self.rendering = Some(rendering); Ok(()) diff --git a/pgml-dashboard/src/templates.rs b/pgml-dashboard/src/templates.rs index 24bf423be..fe2425cb0 100644 --- a/pgml-dashboard/src/templates.rs +++ b/pgml-dashboard/src/templates.rs @@ -55,10 +55,12 @@ pub struct Undo { pub struct Sql { pub columns: Vec, pub rows: Vec>, + pub execution_duration: std::time::Duration, + pub render_execution_duration: bool, } impl Sql { - pub async fn new(pool: &PgPool, query: &str) -> anyhow::Result { + pub async fn new(pool: &PgPool, query: &str, render_execution_duration: bool) -> anyhow::Result { let prepared_stmt = pool.prepare(query).await?; let cols = prepared_stmt.columns(); @@ -67,7 +69,9 @@ impl Sql { cols.iter().for_each(|c| columns.push(c.name().to_string())); + let now = std::time::Instant::now(); let result = prepared_stmt.query().fetch_all(pool).await?; + let execution_duration = now.elapsed(); for row in result.iter() { let mut values = Vec::new(); @@ -199,7 +203,7 @@ impl Sql { rows.push(values); } - Ok(Sql { columns, rows }) + Ok(Sql { columns, rows, execution_duration, render_execution_duration }) } } diff --git a/pgml-dashboard/src/utils.rs b/pgml-dashboard/src/utils.rs new file mode 100644 index 000000000..5c0e69fdb --- /dev/null +++ b/pgml-dashboard/src/utils.rs @@ -0,0 +1,9 @@ +pub fn format_microseconds(microseconds: f64) -> String { + if microseconds >= 1000000. { + format!("{}s", microseconds / 1000000.) + } else if microseconds >= 1000. { + format!("{}ms", microseconds / 1000.) + } else { + format!("{}μs", microseconds) + } +} diff --git a/pgml-dashboard/templates/cell.html b/pgml-dashboard/templates/cell.html index 7ba13f121..f9f87839f 100644 --- a/pgml-dashboard/templates/cell.html +++ b/pgml-dashboard/templates/cell.html @@ -75,7 +75,7 @@
- TODO + Time: <%= crate::utils::format_microseconds(cell.execution_time.unwrap().microseconds as f64) %>
diff --git a/pgml-dashboard/templates/sql.html b/pgml-dashboard/templates/sql.html index 48f0182f7..8328bb052 100644 --- a/pgml-dashboard/templates/sql.html +++ b/pgml-dashboard/templates/sql.html @@ -24,6 +24,9 @@ <% } %> + <% if render_execution_duration { %> + Time: <%= crate::utils::format_microseconds(execution_duration.as_micros() as f64) %> + <% } %> <% } %> pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy