pg_extras/queries/
outliers.rs1use crate::queries::shared::{get_default_interval, Query};
2use crate::PgStatsVersion;
3use sqlx::postgres::{types::PgInterval, PgRow};
4use sqlx::Row;
5
6#[derive(Debug, Clone)]
7pub struct Outliers {
8 pub total_exec_time: PgInterval,
9 pub prop_exec_time: String,
10 pub ncalls: String,
11 pub sync_io_time: PgInterval,
12 pub query: String,
13}
14
15impl serde::Serialize for Outliers {
16 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
17 where
18 S: serde::Serializer,
19 {
20 use serde::ser::SerializeStruct;
21 let mut state = serializer.serialize_struct("Outliers", 5)?;
22 state.serialize_field("total_exec_time", &format!("{:?}", self.total_exec_time))?;
23 state.end()
24 }
25}
26
27impl Query for Outliers {
28 fn new(row: &PgRow) -> Self {
29 Self {
30 total_exec_time: row
31 .try_get("total_exec_time")
32 .unwrap_or(get_default_interval()),
33 prop_exec_time: row.try_get("prop_exec_time").unwrap_or_default(),
34 ncalls: row.try_get("ncalls").unwrap_or_default(),
35 sync_io_time: row
36 .try_get("sync_io_time")
37 .unwrap_or(get_default_interval()),
38 query: row.try_get("query").unwrap_or_default(),
39 }
40 }
41
42 fn to_row(&self) -> prettytable::Row {
43 row![
44 format!("{:?}", self.total_exec_time),
45 self.prop_exec_time,
46 self.ncalls,
47 format!("{:?}", self.sync_io_time),
48 self.query
49 ]
50 }
51
52 fn headers() -> prettytable::Row {
53 row![
54 "query",
55 "exec_time",
56 "prop_exec_time",
57 "ncalls",
58 "sync_io_time"
59 ]
60 }
61
62 fn read_file(pg_statement_version: Option<PgStatsVersion>) -> String {
63 let default = include_str!("../sql/outliers.sql");
64
65 match pg_statement_version {
66 Some(PgStatsVersion::Legacy) => include_str!("../sql/outliers_legacy.sql"),
67 Some(PgStatsVersion::Standard) => default,
68 Some(PgStatsVersion::Pg17) => include_str!("../sql/outliers_17.sql"),
69 None => default,
70 }
71 .to_string()
72 }
73}