Skip to content

Notebook query elapsed time #644

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
May 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
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
2 changes: 2 additions & 0 deletions pgml-dashboard/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ pub mod guards;
pub mod models;
mod responses;
mod templates;
mod utils;

use guards::Cluster;
use responses::{BadRequest, ResponseOk};
Expand Down Expand Up @@ -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();
Expand Down
32 changes: 20 additions & 12 deletions pgml-dashboard/src/models.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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),
}
Expand All @@ -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 => {
Expand All @@ -335,21 +341,23 @@ impl Cell {
front_matter_delimiter: None,
};

format!(
(format!(
"<div class=\"markdown-body\">{}</div>",
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(())
Expand Down
8 changes: 6 additions & 2 deletions pgml-dashboard/src/templates.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,12 @@ pub struct Undo {
pub struct Sql {
pub columns: Vec<String>,
pub rows: Vec<Vec<String>>,
pub execution_duration: std::time::Duration,
pub render_execution_duration: bool,
}

impl Sql {
pub async fn new(pool: &PgPool, query: &str) -> anyhow::Result<Sql> {
pub async fn new(pool: &PgPool, query: &str, render_execution_duration: bool) -> anyhow::Result<Sql> {
let prepared_stmt = pool.prepare(query).await?;
let cols = prepared_stmt.columns();

Expand All @@ -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();
Expand Down Expand Up @@ -199,7 +203,7 @@ impl Sql {
rows.push(values);
}

Ok(Sql { columns, rows })
Ok(Sql { columns, rows, execution_duration, render_execution_duration })
}
}

Expand Down
9 changes: 9 additions & 0 deletions pgml-dashboard/src/utils.rs
Original file line number Diff line number Diff line change
@@ -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)
}
}
2 changes: 1 addition & 1 deletion pgml-dashboard/templates/cell.html
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@
<div class="notebook-duration">
<div class="markdown-body">
<div class="flex flex-row-reverse">
<code>TODO</code>
<code>Time: <%= crate::utils::format_microseconds(cell.execution_time.unwrap().microseconds as f64) %></code>
</div>
</div>
</div>
Expand Down
3 changes: 3 additions & 0 deletions pgml-dashboard/templates/sql.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
<% } %>
</tbody>
</table>
<% if render_execution_duration { %>
<code>Time: <%= crate::utils::format_microseconds(execution_duration.as_micros() as f64) %></code>
<% } %>
</div>

<% } %>
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