use crate::db::query::explain::ExplainPlan;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum TraceExecutionFamily {
PrimaryKey,
Ordered,
Grouped,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum TraceReuseArtifactClass {
SharedPreparedQueryPlan,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct TraceReuseEvent {
pub(in crate::db) artifact_class: TraceReuseArtifactClass,
pub(in crate::db) hit: bool,
}
impl TraceReuseEvent {
#[must_use]
pub const fn hit(artifact_class: TraceReuseArtifactClass) -> Self {
Self {
artifact_class,
hit: true,
}
}
#[must_use]
pub const fn miss(artifact_class: TraceReuseArtifactClass) -> Self {
Self {
artifact_class,
hit: false,
}
}
#[must_use]
pub const fn artifact_class(self) -> TraceReuseArtifactClass {
self.artifact_class
}
#[must_use]
pub const fn is_hit(self) -> bool {
self.hit
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct QueryTracePlan {
pub(in crate::db) plan_hash: String,
pub(in crate::db) access_strategy: String,
pub(in crate::db) execution_family: Option<TraceExecutionFamily>,
pub(in crate::db) reuse: TraceReuseEvent,
pub(in crate::db) explain: ExplainPlan,
}
impl QueryTracePlan {
#[must_use]
pub const fn new(
plan_hash: String,
access_strategy: String,
execution_family: Option<TraceExecutionFamily>,
reuse: TraceReuseEvent,
explain: ExplainPlan,
) -> Self {
Self {
plan_hash,
access_strategy,
execution_family,
reuse,
explain,
}
}
#[must_use]
pub const fn plan_hash(&self) -> &str {
self.plan_hash.as_str()
}
#[must_use]
pub const fn access_strategy(&self) -> &str {
self.access_strategy.as_str()
}
#[must_use]
pub const fn execution_family(&self) -> Option<TraceExecutionFamily> {
self.execution_family
}
#[must_use]
pub const fn reuse(&self) -> TraceReuseEvent {
self.reuse
}
#[must_use]
pub const fn explain(&self) -> &ExplainPlan {
&self.explain
}
}