rustcmdpev 0.1.0

A Postgres query visualizer
Documentation
#[cfg(test)]
mod tests {
    use rustcmdpev::structure::explain::explain;
    #[test]
    fn test_explain_with_one_join() {
        let input = r#"
            [
              {
                "Plan": {
                  "Node Type": "Hash Join",
                  "Parallel Aware": false,
                  "Join Type": "Inner",
                  "Startup Cost": 11.12,
                  "Total Cost": 25.10,
                  "Plan Rows": 231,
                  "Plan Width": 1639,
                  "Actual Startup Time": 1.230,
                  "Actual Total Time": 2.166,
                  "Actual Rows": 231,
                  "Actual Loops": 1,
                  "Output": ["coaches.id", "coaches.first_name", "coaches.last_name", "coaches.email", "coaches.inserted_at", "coaches.updated_at", "swimmers.id", "swimmers.first_name", "swimmers.last_name", "swimmers.email", "swimmers.coach_id", "swimmers.inserted_at", "swimmers.updated_at"],
                  "Inner Unique": true,
                  "Hash Cond": "(swimmers.coach_id = coaches.id)",
                  "Shared Hit Blocks": 6,
                  "Shared Read Blocks": 12,
                  "Shared Dirtied Blocks": 0,
                  "Shared Written Blocks": 0,
                  "Local Hit Blocks": 0,
                  "Local Read Blocks": 0,
                  "Local Dirtied Blocks": 0,
                  "Local Written Blocks": 0,
                  "Temp Read Blocks": 0,
                  "Temp Written Blocks": 0,
                  "Plans": [
                    {
                      "Node Type": "Seq Scan",
                      "Parent Relationship": "Outer",
                      "Parallel Aware": false,
                      "Relation Name": "swimmers",
                      "Schema": "public",
                      "Alias": "swimmers",
                      "Startup Cost": 0.00,
                      "Total Cost": 13.31,
                      "Plan Rows": 231,
                      "Plan Width": 67,
                      "Actual Startup Time": 0.278,
                      "Actual Total Time": 1.147,
                      "Actual Rows": 231,
                      "Actual Loops": 1,
                      "Output": ["swimmers.id", "swimmers.first_name", "swimmers.last_name", "swimmers.email", "swimmers.coach_id", "swimmers.inserted_at", "swimmers.updated_at"],
                      "Shared Hit Blocks": 0,
                      "Shared Read Blocks": 11,
                      "Shared Dirtied Blocks": 0,
                      "Shared Written Blocks": 0,
                      "Local Hit Blocks": 0,
                      "Local Read Blocks": 0,
                      "Local Dirtied Blocks": 0,
                      "Local Written Blocks": 0,
                      "Temp Read Blocks": 0,
                      "Temp Written Blocks": 0
                    },
                    {
                      "Node Type": "Hash",
                      "Parent Relationship": "Inner",
                      "Parallel Aware": false,
                      "Startup Cost": 10.50,
                      "Total Cost": 10.50,
                      "Plan Rows": 50,
                      "Plan Width": 1572,
                      "Actual Startup Time": 0.583,
                      "Actual Total Time": 0.583,
                      "Actual Rows": 11,
                      "Actual Loops": 1,
                      "Output": ["coaches.id", "coaches.first_name", "coaches.last_name", "coaches.email", "coaches.inserted_at", "coaches.updated_at"],
                      "Hash Buckets": 1024,
                      "Original Hash Buckets": 1024,
                      "Hash Batches": 1,
                      "Original Hash Batches": 1,
                      "Peak Memory Usage": 10,
                      "Shared Hit Blocks": 0,
                      "Shared Read Blocks": 1,
                      "Shared Dirtied Blocks": 0,
                      "Shared Written Blocks": 0,
                      "Local Hit Blocks": 0,
                      "Local Read Blocks": 0,
                      "Local Dirtied Blocks": 0,
                      "Local Written Blocks": 0,
                      "Temp Read Blocks": 0,
                      "Temp Written Blocks": 0,
                      "Plans": [
                        {
                          "Node Type": "Seq Scan",
                          "Parent Relationship": "Outer",
                          "Parallel Aware": false,
                          "Relation Name": "coaches",
                          "Schema": "public",
                          "Alias": "coaches",
                          "Startup Cost": 0.00,
                          "Total Cost": 10.50,
                          "Plan Rows": 50,
                          "Plan Width": 1572,
                          "Actual Startup Time": 0.258,
                          "Actual Total Time": 0.260,
                          "Actual Rows": 11,
                          "Actual Loops": 1,
                          "Output": ["coaches.id", "coaches.first_name", "coaches.last_name", "coaches.email", "coaches.inserted_at", "coaches.updated_at"],
                          "Shared Hit Blocks": 0,
                          "Shared Read Blocks": 1,
                          "Shared Dirtied Blocks": 0,
                          "Shared Written Blocks": 0,
                          "Local Hit Blocks": 0,
                          "Local Read Blocks": 0,
                          "Local Dirtied Blocks": 0,
                          "Local Written Blocks": 0,
                          "Temp Read Blocks": 0,
                          "Temp Written Blocks": 0
                        }
                      ]
                    }
                  ]
                },
                "Planning Time": 8.116,
                "Triggers": [
                ],
                "Execution Time": 2.776
              }
            ]"#;
        let explain: explain::Explain = rustcmdpev::visualize(input.to_string(), 60);
        assert_eq!(explain.total_cost, 25.1);
        assert_eq!(explain.max_cost, 13.31);
        assert_eq!(explain.max_rows, 231);
        assert_eq!(explain.max_duration, 1.147);
        assert_eq!(explain.execution_time, 2.776);
        assert_eq!(explain.planning_time, 8.116);
        assert_eq!(explain.plan.alias, "");
        assert_eq!(explain.plan.node_type, "Hash Join");
        assert_eq!(explain.plan.plan_rows, 231);
        assert_eq!(explain.plan.plan_width, 1639);
        assert_eq!(explain.plan.relation_name, "");
    }
    #[test]
    fn test_with_missing_node_type_plan_field() {
        let input = r#"[{"Plan": {"Alias": "c0"}}]"#;
        let explain: explain::Explain = rustcmdpev::visualize(input.to_string(), 60);
        assert_eq!(explain.total_cost, 0.0);
    }
}