pg_extras/queries/
outliers.rs

1use 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}