use nodedb_sql::types::SqlPlan;
use std::sync::Arc;
use crate::control::array_catalog::ArrayCatalogHandle;
use crate::control::security::credential::CredentialStore;
use crate::control::surrogate::SurrogateAssigner;
use crate::engine::bitemporal::BitemporalRetentionRegistry;
use crate::engine::timeseries::retention_policy::RetentionPolicyRegistry;
use crate::types::TenantId;
use crate::wal::WalManager;
use nodedb_physical::physical_task::PhysicalTask;
pub fn db_qualified(database_id: crate::types::DatabaseId, collection: &str) -> String {
if database_id == crate::types::DatabaseId::DEFAULT {
collection.to_string()
} else {
format!("{}/{}", database_id.as_u64(), collection)
}
}
pub struct ConvertContext {
pub retention_registry: Option<Arc<RetentionPolicyRegistry>>,
pub array_catalog: Option<ArrayCatalogHandle>,
pub credentials: Option<Arc<CredentialStore>>,
pub wal: Option<Arc<WalManager>>,
pub surrogate_assigner: Option<Arc<SurrogateAssigner>>,
pub cluster_enabled: bool,
pub bitemporal_retention_registry: Option<Arc<BitemporalRetentionRegistry>>,
pub max_vector_dim: u32,
pub database_id: crate::types::DatabaseId,
}
impl ConvertContext {
pub fn shared(&self) -> nodedb_physical::SharedConvertContext {
nodedb_physical::SharedConvertContext {
database_id: self.database_id,
max_vector_dim: self.max_vector_dim,
cluster_enabled: self.cluster_enabled,
surrogate_assigner: self
.surrogate_assigner
.as_ref()
.map(|a| a.clone() as std::sync::Arc<dyn nodedb_physical::SurrogateAssigner>),
}
}
}
pub fn convert(
plans: &[SqlPlan],
tenant_id: TenantId,
ctx: &ConvertContext,
) -> crate::Result<Vec<PhysicalTask>> {
let mut tasks = Vec::new();
for plan in plans {
tasks.extend(convert_one(plan, tenant_id, ctx)?);
}
Ok(tasks)
}
pub(super) fn convert_one(
plan: &SqlPlan,
tenant_id: TenantId,
ctx: &ConvertContext,
) -> crate::Result<Vec<PhysicalTask>> {
let mut visitor = super::visitor::ConvertVisitor { tenant_id, ctx };
nodedb_sql::dispatch(&mut visitor, plan)
}