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 60 61 62 63 64 65 66 67 68 69 70
// 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 AS JSON` support for structures defined in this crate.
use mz_repr::explain::json::DisplayJson;
use crate::explain::{ExplainMultiPlan, ExplainSinglePlan, ExplainSource, PushdownInfo};
impl<'a, T: 'a> DisplayJson for ExplainSinglePlan<'a, T>
where
T: serde::Serialize,
{
fn to_serde_value(&self) -> serde_json::Result<serde_json::Value> {
serde_json::to_value(self.plan.plan)
}
}
impl<'a, T: 'a> DisplayJson for ExplainMultiPlan<'a, T>
where
T: serde::Serialize,
{
fn to_serde_value(&self) -> serde_json::Result<serde_json::Value> {
let plans = self
.plans
.iter()
.map(|(id, plan)| {
// TODO: fix plans with Constants
serde_json::json!({
"id": id,
"plan": &plan.plan
})
})
.collect::<Vec<_>>();
let sources = self
.sources
.iter()
.map(
|ExplainSource {
id,
op,
pushdown_info,
}| {
let mut json = serde_json::json!({
"id": id,
"op": op,
});
if let Some(PushdownInfo { pushdown }) = pushdown_info {
let object = json.as_object_mut().unwrap();
object.insert("pushdown".to_owned(), serde_json::json!(pushdown));
}
json
},
)
.collect::<Vec<_>>();
let result = serde_json::json!({ "plans": plans, "sources": sources });
Ok(result)
}
}