1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// Copyright Materialize, Inc. and contributors. All rights reserved.
//
// Use of this software is governed by the Business Source License
// included in the LICENSE file.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0.

//! `EXPLAIN` support for [`FastPathPlan`].

use std::collections::BTreeMap;

use mz_expr::explain::{ExplainContext, ExplainMultiPlan};
use mz_repr::explain::{AnnotatedPlan, Explain, ExplainError, UnsupportedFormat};

use crate::coord::peek::FastPathPlan;
use crate::explain::Explainable;

impl<'a> Explain<'a> for Explainable<'a, FastPathPlan> {
    type Context = ExplainContext<'a>;

    type Text = ExplainMultiPlan<'a, FastPathPlan>;

    type Json = ExplainMultiPlan<'a, FastPathPlan>;

    type Dot = UnsupportedFormat;

    fn explain_text(&'a mut self, context: &'a Self::Context) -> Result<Self::Text, ExplainError> {
        self.as_explain_multi_plan(context)
    }

    fn explain_json(&'a mut self, context: &'a Self::Context) -> Result<Self::Text, ExplainError> {
        self.as_explain_multi_plan(context)
    }
}

impl<'a> Explainable<'a, FastPathPlan> {
    fn as_explain_multi_plan(
        &'a self,
        context: &'a ExplainContext<'a>,
    ) -> Result<ExplainMultiPlan<'a, FastPathPlan>, ExplainError> {
        let plans = vec![(
            "Explained Query (fast path)".to_string(),
            AnnotatedPlan {
                plan: self.0,
                annotations: BTreeMap::default(),
            },
        )];

        let sources = vec![];

        Ok(ExplainMultiPlan {
            context,
            sources,
            plans,
        })
    }
}