Skip to content

Commit

Permalink
refactor: simplify DatabaseFactory, just static dispatch
Browse files Browse the repository at this point in the history
  • Loading branch information
drmingdrmer committed Apr 10, 2024
1 parent 614c0bc commit a449386
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 38 deletions.
4 changes: 3 additions & 1 deletion src/query/service/src/catalogs/default/mutable_catalog.rs
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,9 @@ impl MutableCatalog {
storage_factory: self.ctx.storage_factory.clone(),
tenant: self.tenant.clone(),
};
self.ctx.database_factory.get_database(ctx, db_info)
self.ctx
.database_factory
.build_database_by_engine(ctx, db_info)
}
}

Expand Down
52 changes: 15 additions & 37 deletions src/query/service/src/databases/database_factory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@

use std::sync::Arc;

use dashmap::DashMap;
use databend_common_config::InnerConfig;
use databend_common_exception::ErrorCode;
use databend_common_exception::Result;
Expand All @@ -25,57 +24,36 @@ use crate::databases::share::ShareDatabase;
use crate::databases::Database;
use crate::databases::DatabaseContext;

pub trait DatabaseCreator: Send + Sync {
fn try_create(&self, ctx: DatabaseContext, db_info: DatabaseInfo) -> Result<Box<dyn Database>>;
}

impl<T> DatabaseCreator for T
where
T: Fn(DatabaseContext, DatabaseInfo) -> Result<Box<dyn Database>>,
T: Send + Sync,
{
fn try_create(&self, ctx: DatabaseContext, db_info: DatabaseInfo) -> Result<Box<dyn Database>> {
self(ctx, db_info)
}
}

#[derive(Default)]
pub struct DatabaseFactory {
creators: DashMap<String, Arc<dyn DatabaseCreator>>,
}
pub struct DatabaseFactory {}

impl DatabaseFactory {
pub fn create(_: InnerConfig) -> Self {
let creators: DashMap<String, Arc<dyn DatabaseCreator>> = DashMap::new();
creators.insert(
DefaultDatabase::NAME.to_string(),
Arc::new(DefaultDatabase::try_create),
);
creators.insert(
ShareDatabase::NAME.to_string(),
Arc::new(ShareDatabase::try_create),
);

DatabaseFactory { creators }
DatabaseFactory {}
}

pub fn get_database(
pub fn build_database_by_engine(
&self,
ctx: DatabaseContext,
db_info: &DatabaseInfo,
) -> Result<Arc<dyn Database>> {
let db_engine = &db_info.engine();
let db_engine = db_info.engine();

let engine = if db_engine.is_empty() {
"DEFAULT".to_string()
} else {
db_engine.to_uppercase()
};

let factory = self.creators.get(&engine).ok_or_else(|| {
ErrorCode::UnknownDatabaseEngine(format!("Unknown database engine {}", engine))
})?;
let db = match engine.as_str() {
DefaultDatabase::NAME => DefaultDatabase::try_create(ctx, db_info.clone())?,
ShareDatabase::NAME => ShareDatabase::try_create(ctx, db_info.clone())?,

let db: Arc<dyn Database> = factory.try_create(ctx, db_info.clone())?.into();
Ok(db)
_ => {
let err =
ErrorCode::UnknownDatabaseEngine(format!("Unknown database engine {}", engine));
return Err(err);
}
};
Ok(db.into())
}
}

0 comments on commit a449386

Please sign in to comment.