query/query_engine/
runtime.rs1use std::sync::Arc;
16
17use datafusion::error::Result as DfResult;
18use datafusion::execution::context::SessionConfig;
19use datafusion::execution::runtime_env::{RuntimeEnv, RuntimeEnvBuilder};
20
21use crate::options::QueryOptions;
22use crate::query_engine::state::MetricsMemoryPool;
23
24pub type QueryRuntimeProviderRef = Arc<dyn QueryRuntimeProvider>;
26
27#[derive(Clone, Copy)]
29#[non_exhaustive]
30pub struct QueryRuntimeContext<'a> {
31 pub query_options: &'a QueryOptions,
33 pub resolved_memory_pool_size: usize,
35}
36
37impl<'a> QueryRuntimeContext<'a> {
38 pub fn new(query_options: &'a QueryOptions, resolved_memory_pool_size: usize) -> Self {
40 Self {
41 query_options,
42 resolved_memory_pool_size,
43 }
44 }
45}
46
47pub trait QueryRuntimeProvider: Send + Sync + 'static {
49 fn configure_session_config(&self, _ctx: QueryRuntimeContext<'_>, _config: &mut SessionConfig) {
51 }
52
53 fn build_runtime_env(
55 &self,
56 _ctx: QueryRuntimeContext<'_>,
57 builder: RuntimeEnvBuilder,
58 ) -> DfResult<Arc<RuntimeEnv>> {
59 builder.build().map(Arc::new)
60 }
61}
62
63#[derive(Debug, Default)]
65pub struct DefaultQueryRuntimeProvider;
66
67impl DefaultQueryRuntimeProvider {
68 pub fn runtime_env_builder(ctx: QueryRuntimeContext<'_>) -> RuntimeEnvBuilder {
70 if ctx.resolved_memory_pool_size > 0 {
71 RuntimeEnvBuilder::new().with_memory_pool(Arc::new(MetricsMemoryPool::new(
72 ctx.resolved_memory_pool_size,
73 )))
74 } else {
75 RuntimeEnvBuilder::new()
76 }
77 }
78}
79
80impl QueryRuntimeProvider for DefaultQueryRuntimeProvider {}