Skip to content

Commit

Permalink
chore: load database collab
Browse files Browse the repository at this point in the history
  • Loading branch information
appflowy committed Mar 11, 2024
1 parent a27e4b7 commit d656f1a
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 32 deletions.
10 changes: 10 additions & 0 deletions collab-database/src/database.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1393,3 +1393,13 @@ pub fn get_inline_view_id(collab: &Collab) -> Option<String> {
let meta = MetaMap::new(metas);
meta.get_inline_view_with_txn(&txn)
}

/// Quickly retrieve database views meta.
/// Use this function when instantiating a [Database] object is too resource-intensive,
/// and you need the views meta of a specific database.
pub fn get_database_views_meta(collab: &Collab) -> Vec<DatabaseViewMeta> {
let txn = collab.transact();
let views = collab.get_map_with_txn(&txn, vec![DATABASE, VIEWS]);
let views = ViewMap::new(views.unwrap(), None);
views.get_all_views_meta_with_txn(&txn)
}
59 changes: 40 additions & 19 deletions collab-database/src/user/user_db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@ pub struct WorkspaceDatabase {
/// In memory database handlers.
/// The key is the database id. The handler will be added when the database is opened or created.
/// and the handler will be removed when the database is deleted or closed.
open_handlers: Mutex<LruCache<String, Arc<MutexDatabase>>>,
databases: Mutex<LruCache<String, Arc<MutexDatabase>>>,
database_collabs: Mutex<LruCache<String, Arc<MutexCollab>>>,
}

impl WorkspaceDatabase {
Expand All @@ -91,26 +92,23 @@ impl WorkspaceDatabase {
let collab_guard = collab.lock();
drop(collab_guard);

let open_handlers = Mutex::new(LruCache::new(NonZeroUsize::new(5).unwrap()));
let databases = Mutex::new(LruCache::new(NonZeroUsize::new(5).unwrap()));
let database_collabs = Mutex::new(LruCache::new(NonZeroUsize::new(10).unwrap()));
Self {
uid,
collab_db,
collab,
open_handlers,
databases,
config,
collab_service,
database_collabs,
}
}

/// Get the database with the given database id.
/// Return None if the database does not exist.
pub async fn get_database(&self, database_id: &str) -> Option<Arc<MutexDatabase>> {
if !self.database_meta_list().contains(database_id) {
return None;
}
let database = self.open_handlers.lock().get(database_id).cloned();
pub async fn get_database_collab(&self, database_id: &str) -> Option<Arc<MutexCollab>> {
let database_collab = self.database_collabs.lock().get(database_id).cloned();
let collab_db = self.collab_db.upgrade()?;
match database {
match database_collab {
None => {
let mut collab_doc_state = CollabDocState::default();
let is_exist = collab_db.read_txn().is_exist(self.uid, &database_id);
Expand All @@ -124,19 +122,42 @@ impl WorkspaceDatabase {
{
Ok(fetched_doc_state) => {
if fetched_doc_state.is_empty() {
tracing::error!("Failed to get updates for database: {}", database_id);
error!("Failed to get updates for database: {}", database_id);
return None;
}
collab_doc_state = fetched_doc_state;
},
Err(e) => {
tracing::error!("Failed to get collab updates for database: {}", e);
error!("Failed to get collab updates for database: {}", e);
return None;
},
}
}
let database_collab = self.collab_for_database(database_id, collab_doc_state);
self
.database_collabs
.lock()
.put(database_id.to_string(), database_collab.clone());
Some(database_collab)
},
Some(database_collab) => Some(database_collab),
}
}

/// Get the database with the given database id.
/// Return None if the database does not exist.
pub async fn get_database(&self, database_id: &str) -> Option<Arc<MutexDatabase>> {
if !self.database_meta_list().contains(database_id) {
return None;
}
let database = self.databases.lock().get(database_id).cloned();
let collab_db = self.collab_db.upgrade()?;
match database {
None => {
let notifier = DatabaseNotify::default();
let collab = self.collab_for_database(database_id, collab_doc_state);
let is_exist = collab_db.read_txn().is_exist(self.uid, &database_id);
let collab = self.get_database_collab(database_id).await?;

let context = DatabaseContext {
uid: self.uid,
db: self.collab_db.clone(),
Expand All @@ -154,7 +175,7 @@ impl WorkspaceDatabase {

let database = Arc::new(MutexDatabase::new(database));
self
.open_handlers
.databases
.lock()
.put(database_id.to_string(), database.clone());
Some(database)
Expand Down Expand Up @@ -207,7 +228,7 @@ impl WorkspaceDatabase {
// TODO(RS): insert the first view of the database.
let mutex_database = MutexDatabase::new(Database::create_with_inline_view(params, context)?);
let database = Arc::new(mutex_database);
self.open_handlers.lock().put(database_id, database.clone());
self.databases.lock().put(database_id, database.clone());
Ok(database)
}

Expand Down Expand Up @@ -266,20 +287,20 @@ impl WorkspaceDatabase {
Ok(())
});
}
if let Some(database) = self.open_handlers.lock().pop(database_id) {
if let Some(database) = self.databases.lock().pop(database_id) {
database.lock().close();
}
}

/// Close the database with the given database id.
pub fn close_database(&self, database_id: &str) {
if let Some(database) = self.open_handlers.lock().pop(database_id) {
if let Some(database) = self.databases.lock().pop(database_id) {
database.lock().close();
}
}

/// Return all the database records.
pub fn get_all_databases(&self) -> Vec<DatabaseMeta> {
pub fn get_all_database_meta(&self) -> Vec<DatabaseMeta> {
self.database_meta_list().get_all_database_meta()
}

Expand Down
11 changes: 10 additions & 1 deletion collab-database/tests/database_test/view_test.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
use collab_database::database::{gen_row_id, get_inline_view_id, DatabaseData};
use collab_database::database::{
gen_row_id, get_database_views_meta, get_inline_view_id, DatabaseData,
};
use collab_database::fields::Field;
use collab_database::rows::CreateRowParams;
use collab_database::views::{
Expand Down Expand Up @@ -44,6 +46,13 @@ async fn create_initial_database_test() {
let inline_view_id = get_inline_view_id(&test.database.get_collab().lock()).unwrap();
assert_eq!(inline_view_id, test.database.get_inline_view_id());
assert_eq!(inline_view_id, "v1");

let view_metas = get_database_views_meta(&test.database.get_collab().lock());
let view_meta = view_metas
.iter()
.find(|view| view.id == inline_view_id)
.unwrap();
assert_eq!(view_meta.name, "my first database view");
}

#[tokio::test]
Expand Down
4 changes: 2 additions & 2 deletions collab-database/tests/user_test/database_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ async fn create_multiple_database_test() {
..Default::default()
})
.unwrap();
let all_databases = test.get_all_databases();
let all_databases = test.get_all_database_meta();
assert_eq!(all_databases.len(), 2);
assert_eq!(all_databases[0].database_id, "d1");
assert_eq!(all_databases[1].database_id, "d2");
Expand All @@ -56,7 +56,7 @@ async fn delete_database_test() {
.unwrap();
test.delete_database("d1");

let all_databases = test.get_all_databases();
let all_databases = test.get_all_database_meta();
assert_eq!(all_databases[0].database_id, "d2");
}

Expand Down
11 changes: 1 addition & 10 deletions collab-folder/src/view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,13 @@ use serde_repr::*;

use crate::folder_observe::ViewChangeSender;
use crate::section::{Section, SectionItem, SectionMap};
use crate::{
impl_any_update, impl_i64_update, impl_option_i64_update, impl_option_str_update,
impl_str_update, UserId,
};
use crate::{impl_any_update, impl_i64_update, impl_option_i64_update, impl_str_update, UserId};
use crate::{subscribe_view_change, RepeatedViewIdentifier, ViewIdentifier, ViewRelations};

const VIEW_ID: &str = "id";
const VIEW_NAME: &str = "name";
const VIEW_PARENT_ID: &str = "bid";
const VIEW_DESC: &str = "desc";
const VIEW_DATABASE_ID: &str = "database_id";
const VIEW_LAYOUT: &str = "layout";
const VIEW_CREATE_AT: &str = "created_at";
const VIEW_CREATED_BY: &str = "created_by";
Expand Down Expand Up @@ -535,11 +531,6 @@ pub struct ViewUpdate<'a, 'b, 'c> {
impl<'a, 'b, 'c> ViewUpdate<'a, 'b, 'c> {
impl_str_update!(set_name, set_name_if_not_none, VIEW_NAME);
impl_str_update!(set_bid, set_bid_if_not_none, VIEW_PARENT_ID);
impl_option_str_update!(
set_database_id,
set_database_id_if_not_none,
VIEW_DATABASE_ID
);
impl_str_update!(set_desc, set_desc_if_not_none, VIEW_DESC);
impl_any_update!(set_layout, set_layout_if_not_none, VIEW_LAYOUT, ViewLayout);
impl_i64_update!(set_created_at, set_created_at_if_not_none, VIEW_CREATE_AT);
Expand Down

0 comments on commit d656f1a

Please sign in to comment.