use crate::catalog::services::{CatalogSession, CatalogSnapshotSource};
use crate::query::{
runtime::QueryMemorySettings, sources::SourceContext, statement::context::QueryContext,
CteScope,
};
use crate::scalar::plan::PhysicalSubqueryRunner;
use uqa_sql::{expr::EngineHook, semantics::volatility::VolatilityCatalog, SQLError};
pub trait SubqueryQueryContexts<S: Clone + 'static> {
fn query_context(&self) -> QueryContext<'_, S>;
fn source_context(&self) -> SourceContext<'_, S>;
}
pub type SubqueryProbe<'a> =
&'a mut dyn FnMut(&dyn EngineHook, &dyn PhysicalSubqueryRunner) -> Result<bool, SQLError>;
pub trait ScopedSubqueryHooks<S: Clone>: Sync {
fn with_hooks(&self, scope: &CteScope<S>, probe: SubqueryProbe<'_>) -> Result<bool, SQLError>;
}
#[derive(Clone)]
pub struct SubqueryServices<'a, S: Clone + 'static> {
pub catalog: &'a dyn CatalogSnapshotSource,
pub session: &'a dyn CatalogSession,
pub volatility: &'a dyn VolatilityCatalog,
pub queries: &'a dyn SubqueryQueryContexts<S>,
pub hooks: &'a dyn ScopedSubqueryHooks<S>,
}
impl<S: Clone + 'static> Copy for SubqueryServices<'_, S> {}
pub struct SubqueryContext<'a, S: Clone + 'static> {
pub services: SubqueryServices<'a, S>,
pub memory: &'a dyn QueryMemorySettings,
pub ctes: &'a CteScope<S>,
pub function_hook: &'a dyn EngineHook,
pub subquery_runner: &'a dyn PhysicalSubqueryRunner,
}