chore: rename structs

This commit is contained in:
appflowy 2022-06-07 14:22:20 +08:00
parent 03879a7262
commit ab63ce7bce
12 changed files with 125 additions and 124 deletions

View File

@ -1,4 +1,5 @@
use crate::services::grid_editor::GridMetaEditor; use crate::services::block::make_grid_block_meta_rev_manager;
use crate::services::grid_meta_editor::GridMetaEditor;
use crate::services::persistence::block_index::BlockIndexCache; use crate::services::persistence::block_index::BlockIndexCache;
use crate::services::persistence::kv::GridKVPersistence; use crate::services::persistence::kv::GridKVPersistence;
use crate::services::persistence::GridDatabase; use crate::services::persistence::GridDatabase;
@ -7,7 +8,7 @@ use dashmap::DashMap;
use flowy_database::ConnectionPool; use flowy_database::ConnectionPool;
use flowy_error::{FlowyError, FlowyResult}; use flowy_error::{FlowyError, FlowyResult};
use flowy_grid_data_model::entities::{BuildGridContext, GridMeta}; use flowy_grid_data_model::entities::{BuildGridContext, GridMeta};
use flowy_revision::disk::{SQLiteGridBlockMetaRevisionPersistence, SQLiteGridRevisionPersistence}; use flowy_revision::disk::SQLiteGridRevisionPersistence;
use flowy_revision::{RevisionManager, RevisionPersistence, RevisionWebSocket}; use flowy_revision::{RevisionManager, RevisionPersistence, RevisionWebSocket};
use flowy_sync::client_grid::{make_block_meta_delta, make_grid_delta}; use flowy_sync::client_grid::{make_block_meta_delta, make_grid_delta};
use flowy_sync::entities::revision::{RepeatedRevision, Revision}; use flowy_sync::entities::revision::{RepeatedRevision, Revision};
@ -35,12 +36,12 @@ impl GridManager {
) -> Self { ) -> Self {
let grid_editors = Arc::new(DashMap::new()); let grid_editors = Arc::new(DashMap::new());
let kv_persistence = Arc::new(GridKVPersistence::new(database.clone())); let kv_persistence = Arc::new(GridKVPersistence::new(database.clone()));
let block_index_persistence = Arc::new(BlockIndexCache::new(database)); let block_index_cache = Arc::new(BlockIndexCache::new(database));
Self { Self {
editor_map: grid_editors, editor_map: grid_editors,
grid_user, grid_user,
block_index_cache,
kv_persistence, kv_persistence,
block_index_cache: block_index_persistence,
} }
} }
@ -59,9 +60,7 @@ impl GridManager {
block_id: T, block_id: T,
revisions: RepeatedRevision, revisions: RepeatedRevision,
) -> FlowyResult<()> { ) -> FlowyResult<()> {
let block_id = block_id.as_ref(); let rev_manager = make_grid_block_meta_rev_manager(&self.grid_user, block_id.as_ref())?;
let db_pool = self.grid_user.db_pool()?;
let rev_manager = self.make_grid_block_meta_rev_manager(block_id, db_pool)?;
let _ = rev_manager.reset_object(revisions).await?; let _ = rev_manager.reset_object(revisions).await?;
Ok(()) Ok(())
} }
@ -134,18 +133,6 @@ impl GridManager {
let rev_manager = RevisionManager::new(&user_id, grid_id, rev_persistence); let rev_manager = RevisionManager::new(&user_id, grid_id, rev_persistence);
Ok(rev_manager) Ok(rev_manager)
} }
fn make_grid_block_meta_rev_manager(
&self,
block_d: &str,
pool: Arc<ConnectionPool>,
) -> FlowyResult<RevisionManager> {
let user_id = self.grid_user.user_id()?;
let disk_cache = Arc::new(SQLiteGridBlockMetaRevisionPersistence::new(&user_id, pool));
let rev_persistence = Arc::new(RevisionPersistence::new(&user_id, block_d, disk_cache));
let rev_manager = RevisionManager::new(&user_id, block_d, rev_persistence);
Ok(rev_manager)
}
} }
pub async fn make_grid_view_data( pub async fn make_grid_view_data(
@ -166,7 +153,6 @@ pub async fn make_grid_view_data(
let repeated_revision: RepeatedRevision = let repeated_revision: RepeatedRevision =
Revision::initial_revision(user_id, view_id, grid_delta_data.clone()).into(); Revision::initial_revision(user_id, view_id, grid_delta_data.clone()).into();
let _ = grid_manager.create_grid(view_id, repeated_revision).await?; let _ = grid_manager.create_grid(view_id, repeated_revision).await?;
for block_meta_data in build_context.blocks_meta_data { for block_meta_data in build_context.blocks_meta_data {
let block_id = block_meta_data.block_id.clone(); let block_id = block_meta_data.block_id.clone();

View File

@ -1,8 +1,8 @@
use bytes::Bytes; use bytes::Bytes;
use flowy_error::{FlowyError, FlowyResult}; use flowy_error::{FlowyError, FlowyResult};
use flowy_grid_data_model::entities::{CellMeta, GridBlockMetaData, RowMeta, RowMetaChangeset, RowOrder}; use flowy_grid_data_model::entities::{CellMeta, GridBlockMeta, RowMeta, RowMetaChangeset, RowOrder};
use flowy_revision::{RevisionCloudService, RevisionCompactor, RevisionManager, RevisionObjectBuilder}; use flowy_revision::{RevisionCloudService, RevisionCompactor, RevisionManager, RevisionObjectBuilder};
use flowy_sync::client_grid::{GridBlockMetaChange, GridBlockMetaPad}; use flowy_sync::client_grid::{GridBlockMetaDeltaChangeset, GridBlockMetaPad};
use flowy_sync::entities::revision::Revision; use flowy_sync::entities::revision::Revision;
use flowy_sync::util::make_delta_from_revisions; use flowy_sync::util::make_delta_from_revisions;
use lib_infra::future::FutureResult; use lib_infra::future::FutureResult;
@ -14,7 +14,7 @@ use tokio::sync::RwLock;
pub struct GridBlockMetaEditor { pub struct GridBlockMetaEditor {
user_id: String, user_id: String,
pub block_id: String, pub block_id: String,
pad: Arc<RwLock<GridBlockMetaPad>>, block_meta: Arc<RwLock<GridBlockMetaPad>>,
rev_manager: Arc<RevisionManager>, rev_manager: Arc<RevisionManager>,
} }
@ -29,20 +29,20 @@ impl GridBlockMetaEditor {
token: token.to_owned(), token: token.to_owned(),
}); });
let block_meta_pad = rev_manager.load::<GridBlockMetaPadBuilder>(Some(cloud)).await?; let block_meta_pad = rev_manager.load::<GridBlockMetaPadBuilder>(Some(cloud)).await?;
let pad = Arc::new(RwLock::new(block_meta_pad)); let block_meta = Arc::new(RwLock::new(block_meta_pad));
let rev_manager = Arc::new(rev_manager); let rev_manager = Arc::new(rev_manager);
let user_id = user_id.to_owned(); let user_id = user_id.to_owned();
let block_id = block_id.to_owned(); let block_id = block_id.to_owned();
Ok(Self { Ok(Self {
user_id, user_id,
block_id, block_id,
pad, block_meta,
rev_manager, rev_manager,
}) })
} }
pub async fn duplicate_block_meta_data(&self, duplicated_block_id: &str) -> GridBlockMetaData { pub async fn duplicate_block_meta(&self, duplicated_block_id: &str) -> GridBlockMeta {
self.pad.read().await.duplicate_data(duplicated_block_id).await self.block_meta.read().await.duplicate_data(duplicated_block_id).await
} }
/// return current number of rows and the inserted index. The inserted index will be None if the start_row_id is None /// return current number of rows and the inserted index. The inserted index will be None if the start_row_id is None
@ -109,7 +109,7 @@ impl GridBlockMetaEditor {
where where
T: AsRef<str> + ToOwned + ?Sized, T: AsRef<str> + ToOwned + ?Sized,
{ {
let row_metas = self.pad.read().await.get_row_metas(row_ids)?; let row_metas = self.block_meta.read().await.get_row_metas(row_ids)?;
Ok(row_metas) Ok(row_metas)
} }
@ -118,7 +118,7 @@ impl GridBlockMetaEditor {
field_id: &str, field_id: &str,
row_ids: Option<Vec<Cow<'_, String>>>, row_ids: Option<Vec<Cow<'_, String>>>,
) -> FlowyResult<Vec<CellMeta>> { ) -> FlowyResult<Vec<CellMeta>> {
let cell_metas = self.pad.read().await.get_cell_metas(field_id, row_ids)?; let cell_metas = self.block_meta.read().await.get_cell_metas(field_id, row_ids)?;
Ok(cell_metas) Ok(cell_metas)
} }
@ -132,7 +132,7 @@ impl GridBlockMetaEditor {
T: AsRef<str> + ToOwned + ?Sized, T: AsRef<str> + ToOwned + ?Sized,
{ {
let row_orders = self let row_orders = self
.pad .block_meta
.read() .read()
.await .await
.get_row_metas(row_ids)? .get_row_metas(row_ids)?
@ -144,9 +144,9 @@ impl GridBlockMetaEditor {
async fn modify<F>(&self, f: F) -> FlowyResult<()> async fn modify<F>(&self, f: F) -> FlowyResult<()>
where where
F: for<'a> FnOnce(&'a mut GridBlockMetaPad) -> FlowyResult<Option<GridBlockMetaChange>>, F: for<'a> FnOnce(&'a mut GridBlockMetaPad) -> FlowyResult<Option<GridBlockMetaDeltaChangeset>>,
{ {
let mut write_guard = self.pad.write().await; let mut write_guard = self.block_meta.write().await;
match f(&mut *write_guard)? { match f(&mut *write_guard)? {
None => {} None => {}
Some(change) => { Some(change) => {
@ -156,8 +156,8 @@ impl GridBlockMetaEditor {
Ok(()) Ok(())
} }
async fn apply_change(&self, change: GridBlockMetaChange) -> FlowyResult<()> { async fn apply_change(&self, change: GridBlockMetaDeltaChangeset) -> FlowyResult<()> {
let GridBlockMetaChange { delta, md5 } = change; let GridBlockMetaDeltaChangeset { delta, md5 } = change;
let user_id = self.user_id.clone(); let user_id = self.user_id.clone();
let (base_rev_id, rev_id) = self.rev_manager.next_rev_id_pair(); let (base_rev_id, rev_id) = self.rev_manager.next_rev_id_pair();
let delta_data = delta.to_delta_bytes(); let delta_data = delta.to_delta_bytes();

View File

@ -1,13 +1,13 @@
use crate::dart_notification::{send_dart_notification, GridNotification}; use crate::dart_notification::{send_dart_notification, GridNotification};
use crate::manager::GridUser; use crate::manager::GridUser;
use crate::services::block_meta_editor::GridBlockMetaEditor; use crate::services::block::GridBlockMetaEditor;
use crate::services::persistence::block_index::BlockIndexCache; use crate::services::persistence::block_index::BlockIndexCache;
use crate::services::row::{group_row_orders, GridBlockSnapshot}; use crate::services::row::{group_row_orders, GridBlockSnapshot};
use dashmap::DashMap; use dashmap::DashMap;
use flowy_error::FlowyResult; use flowy_error::FlowyResult;
use flowy_grid_data_model::entities::{ use flowy_grid_data_model::entities::{
CellChangeset, CellMeta, GridBlockMeta, GridBlockMetaChangeset, GridRowsChangeset, IndexRowOrder, Row, RowMeta, CellChangeset, CellMeta, GridBlockInfoChangeset, GridBlockMetaSnapshot, GridRowsChangeset, IndexRowOrder, Row,
RowMetaChangeset, RowOrder, UpdatedRowOrder, RowMeta, RowMetaChangeset, RowOrder, UpdatedRowOrder,
}; };
use flowy_revision::disk::SQLiteGridBlockMetaRevisionPersistence; use flowy_revision::disk::SQLiteGridBlockMetaRevisionPersistence;
use flowy_revision::{RevisionManager, RevisionPersistence}; use flowy_revision::{RevisionManager, RevisionPersistence};
@ -16,19 +16,19 @@ use std::collections::HashMap;
use std::sync::Arc; use std::sync::Arc;
type BlockId = String; type BlockId = String;
pub(crate) struct GridBlockManager { pub(crate) struct GridBlockMetaManager {
grid_id: String, grid_id: String,
user: Arc<dyn GridUser>, user: Arc<dyn GridUser>,
persistence: Arc<BlockIndexCache>, block_index_cache: Arc<BlockIndexCache>,
block_editor_map: DashMap<BlockId, Arc<GridBlockMetaEditor>>, block_editor_map: DashMap<BlockId, Arc<GridBlockMetaEditor>>,
} }
impl GridBlockManager { impl GridBlockMetaManager {
pub(crate) async fn new( pub(crate) async fn new(
grid_id: &str, grid_id: &str,
user: &Arc<dyn GridUser>, user: &Arc<dyn GridUser>,
blocks: Vec<GridBlockMeta>, blocks: Vec<GridBlockMetaSnapshot>,
persistence: Arc<BlockIndexCache>, block_index_cache: Arc<BlockIndexCache>,
) -> FlowyResult<Self> { ) -> FlowyResult<Self> {
let editor_map = make_block_meta_editor_map(user, blocks).await?; let editor_map = make_block_meta_editor_map(user, blocks).await?;
let user = user.clone(); let user = user.clone();
@ -37,7 +37,7 @@ impl GridBlockManager {
grid_id, grid_id,
user, user,
block_editor_map: editor_map, block_editor_map: editor_map,
persistence, block_index_cache,
}; };
Ok(manager) Ok(manager)
} }
@ -57,7 +57,7 @@ impl GridBlockManager {
} }
async fn get_editor_from_row_id(&self, row_id: &str) -> FlowyResult<Arc<GridBlockMetaEditor>> { async fn get_editor_from_row_id(&self, row_id: &str) -> FlowyResult<Arc<GridBlockMetaEditor>> {
let block_id = self.persistence.get_block_id(row_id)?; let block_id = self.block_index_cache.get_block_id(row_id)?;
Ok(self.get_editor(&block_id).await?) Ok(self.get_editor(&block_id).await?)
} }
@ -67,7 +67,7 @@ impl GridBlockManager {
row_meta: RowMeta, row_meta: RowMeta,
start_row_id: Option<String>, start_row_id: Option<String>,
) -> FlowyResult<i32> { ) -> FlowyResult<i32> {
let _ = self.persistence.insert(&row_meta.block_id, &row_meta.id)?; let _ = self.block_index_cache.insert(&row_meta.block_id, &row_meta.id)?;
let editor = self.get_editor(&row_meta.block_id).await?; let editor = self.get_editor(&row_meta.block_id).await?;
let mut index_row_order = IndexRowOrder::from(&row_meta); let mut index_row_order = IndexRowOrder::from(&row_meta);
@ -83,21 +83,21 @@ impl GridBlockManager {
pub(crate) async fn insert_row( pub(crate) async fn insert_row(
&self, &self,
rows_by_block_id: HashMap<String, Vec<RowMeta>>, rows_by_block_id: HashMap<String, Vec<RowMeta>>,
) -> FlowyResult<Vec<GridBlockMetaChangeset>> { ) -> FlowyResult<Vec<GridBlockInfoChangeset>> {
let mut changesets = vec![]; let mut changesets = vec![];
for (block_id, row_metas) in rows_by_block_id { for (block_id, row_metas) in rows_by_block_id {
let mut inserted_row_orders = vec![]; let mut inserted_row_orders = vec![];
let editor = self.get_editor(&block_id).await?; let editor = self.get_editor(&block_id).await?;
let mut row_count = 0; let mut row_count = 0;
for row in row_metas { for row in row_metas {
let _ = self.persistence.insert(&row.block_id, &row.id)?; let _ = self.block_index_cache.insert(&row.block_id, &row.id)?;
let mut row_order = IndexRowOrder::from(&row); let mut row_order = IndexRowOrder::from(&row);
let (count, index) = editor.create_row(row, None).await?; let (count, index) = editor.create_row(row, None).await?;
row_count = count; row_count = count;
row_order.index = index; row_order.index = index;
inserted_row_orders.push(row_order); inserted_row_orders.push(row_order);
} }
changesets.push(GridBlockMetaChangeset::from_row_count(&block_id, row_count)); changesets.push(GridBlockInfoChangeset::from_row_count(&block_id, row_count));
let _ = self let _ = self
.notify_did_update_block(GridRowsChangeset::insert(&block_id, inserted_row_orders)) .notify_did_update_block(GridRowsChangeset::insert(&block_id, inserted_row_orders))
@ -128,7 +128,7 @@ impl GridBlockManager {
pub async fn delete_row(&self, row_id: &str) -> FlowyResult<()> { pub async fn delete_row(&self, row_id: &str) -> FlowyResult<()> {
let row_id = row_id.to_owned(); let row_id = row_id.to_owned();
let block_id = self.persistence.get_block_id(&row_id)?; let block_id = self.block_index_cache.get_block_id(&row_id)?;
let editor = self.get_editor(&block_id).await?; let editor = self.get_editor(&block_id).await?;
match editor.get_row_order(&row_id).await? { match editor.get_row_order(&row_id).await? {
None => {} None => {}
@ -143,7 +143,7 @@ impl GridBlockManager {
Ok(()) Ok(())
} }
pub(crate) async fn delete_rows(&self, row_orders: Vec<RowOrder>) -> FlowyResult<Vec<GridBlockMetaChangeset>> { pub(crate) async fn delete_rows(&self, row_orders: Vec<RowOrder>) -> FlowyResult<Vec<GridBlockInfoChangeset>> {
let mut changesets = vec![]; let mut changesets = vec![];
for block_order in group_row_orders(row_orders) { for block_order in group_row_orders(row_orders) {
let editor = self.get_editor(&block_order.block_id).await?; let editor = self.get_editor(&block_order.block_id).await?;
@ -153,7 +153,7 @@ impl GridBlockManager {
.map(|row_order| Cow::Owned(row_order.row_id)) .map(|row_order| Cow::Owned(row_order.row_id))
.collect::<Vec<Cow<String>>>(); .collect::<Vec<Cow<String>>>();
let row_count = editor.delete_rows(row_ids).await?; let row_count = editor.delete_rows(row_ids).await?;
let changeset = GridBlockMetaChangeset::from_row_count(&block_order.block_id, row_count); let changeset = GridBlockInfoChangeset::from_row_count(&block_order.block_id, row_count);
changesets.push(changeset); changesets.push(changeset);
} }
@ -255,7 +255,7 @@ impl GridBlockManager {
async fn make_block_meta_editor_map( async fn make_block_meta_editor_map(
user: &Arc<dyn GridUser>, user: &Arc<dyn GridUser>,
blocks: Vec<GridBlockMeta>, blocks: Vec<GridBlockMetaSnapshot>,
) -> FlowyResult<DashMap<String, Arc<GridBlockMetaEditor>>> { ) -> FlowyResult<DashMap<String, Arc<GridBlockMetaEditor>>> {
let editor_map = DashMap::new(); let editor_map = DashMap::new();
for block in blocks { for block in blocks {
@ -269,11 +269,16 @@ async fn make_block_meta_editor_map(
async fn make_block_meta_editor(user: &Arc<dyn GridUser>, block_id: &str) -> FlowyResult<GridBlockMetaEditor> { async fn make_block_meta_editor(user: &Arc<dyn GridUser>, block_id: &str) -> FlowyResult<GridBlockMetaEditor> {
tracing::trace!("Open block:{} meta editor", block_id); tracing::trace!("Open block:{} meta editor", block_id);
let token = user.token()?; let token = user.token()?;
let user_id = user.user_id()?;
let rev_manager = make_grid_block_meta_rev_manager(user, block_id)?;
GridBlockMetaEditor::new(&user_id, &token, block_id, rev_manager).await
}
pub fn make_grid_block_meta_rev_manager(user: &Arc<dyn GridUser>, block_id: &str) -> FlowyResult<RevisionManager> {
let user_id = user.user_id()?; let user_id = user.user_id()?;
let pool = user.db_pool()?; let pool = user.db_pool()?;
let disk_cache = Arc::new(SQLiteGridBlockMetaRevisionPersistence::new(&user_id, pool)); let disk_cache = Arc::new(SQLiteGridBlockMetaRevisionPersistence::new(&user_id, pool));
let rev_persistence = Arc::new(RevisionPersistence::new(&user_id, block_id, disk_cache)); let rev_persistence = Arc::new(RevisionPersistence::new(&user_id, block_id, disk_cache));
let rev_manager = RevisionManager::new(&user_id, block_id, rev_persistence); Ok(RevisionManager::new(&user_id, block_id, rev_persistence))
GridBlockMetaEditor::new(&user_id, &token, block_id, rev_manager).await
} }

View File

@ -0,0 +1,5 @@
mod block_meta_editor;
mod block_meta_manager;
pub(crate) use block_meta_editor::*;
pub(crate) use block_meta_manager::*;

View File

@ -1,7 +1,7 @@
use crate::dart_notification::{send_dart_notification, GridNotification}; use crate::dart_notification::{send_dart_notification, GridNotification};
use crate::entities::CellIdentifier; use crate::entities::CellIdentifier;
use crate::manager::GridUser; use crate::manager::GridUser;
use crate::services::block_meta_manager::GridBlockManager; use crate::services::block::GridBlockMetaManager;
use crate::services::field::{default_type_option_builder_from_type, type_option_builder_from_bytes, FieldBuilder}; use crate::services::field::{default_type_option_builder_from_type, type_option_builder_from_bytes, FieldBuilder};
use crate::services::persistence::block_index::BlockIndexCache; use crate::services::persistence::block_index::BlockIndexCache;
use crate::services::row::*; use crate::services::row::*;
@ -24,7 +24,7 @@ pub struct GridMetaEditor {
user: Arc<dyn GridUser>, user: Arc<dyn GridUser>,
grid_pad: Arc<RwLock<GridMetaPad>>, grid_pad: Arc<RwLock<GridMetaPad>>,
rev_manager: Arc<RevisionManager>, rev_manager: Arc<RevisionManager>,
block_manager: Arc<GridBlockManager>, block_meta_manager: Arc<GridBlockMetaManager>,
} }
impl Drop for GridMetaEditor { impl Drop for GridMetaEditor {
@ -47,13 +47,13 @@ impl GridMetaEditor {
let grid_pad = Arc::new(RwLock::new(grid_pad)); let grid_pad = Arc::new(RwLock::new(grid_pad));
let blocks = grid_pad.read().await.get_block_metas(); let blocks = grid_pad.read().await.get_block_metas();
let block_meta_manager = Arc::new(GridBlockManager::new(grid_id, &user, blocks, persistence).await?); let block_meta_manager = Arc::new(GridBlockMetaManager::new(grid_id, &user, blocks, persistence).await?);
Ok(Arc::new(Self { Ok(Arc::new(Self {
grid_id: grid_id.to_owned(), grid_id: grid_id.to_owned(),
user, user,
grid_pad, grid_pad,
rev_manager, rev_manager,
block_manager: block_meta_manager, block_meta_manager,
})) }))
} }
@ -240,12 +240,12 @@ impl GridMetaEditor {
Ok(field_metas) Ok(field_metas)
} }
pub async fn create_block(&self, grid_block: GridBlockMeta) -> FlowyResult<()> { pub async fn create_block(&self, grid_block: GridBlockMetaSnapshot) -> FlowyResult<()> {
let _ = self.modify(|grid| Ok(grid.create_block_meta(grid_block)?)).await?; let _ = self.modify(|grid| Ok(grid.create_block_meta(grid_block)?)).await?;
Ok(()) Ok(())
} }
pub async fn update_block(&self, changeset: GridBlockMetaChangeset) -> FlowyResult<()> { pub async fn update_block(&self, changeset: GridBlockInfoChangeset) -> FlowyResult<()> {
let _ = self.modify(|grid| Ok(grid.update_block_meta(changeset)?)).await?; let _ = self.modify(|grid| Ok(grid.update_block_meta(changeset)?)).await?;
Ok(()) Ok(())
} }
@ -260,10 +260,13 @@ impl GridMetaEditor {
let row_order = RowOrder::from(&row_meta); let row_order = RowOrder::from(&row_meta);
// insert the row // insert the row
let row_count = self.block_manager.create_row(&block_id, row_meta, start_row_id).await?; let row_count = self
.block_meta_manager
.create_row(&block_id, row_meta, start_row_id)
.await?;
// update block row count // update block row count
let changeset = GridBlockMetaChangeset::from_row_count(&block_id, row_count); let changeset = GridBlockInfoChangeset::from_row_count(&block_id, row_count);
let _ = self.update_block(changeset).await?; let _ = self.update_block(changeset).await?;
Ok(row_order) Ok(row_order)
} }
@ -280,7 +283,7 @@ impl GridMetaEditor {
.or_insert_with(Vec::new) .or_insert_with(Vec::new)
.push(row_meta); .push(row_meta);
} }
let changesets = self.block_manager.insert_row(rows_by_block_id).await?; let changesets = self.block_meta_manager.insert_row(rows_by_block_id).await?;
for changeset in changesets { for changeset in changesets {
let _ = self.update_block(changeset).await?; let _ = self.update_block(changeset).await?;
} }
@ -289,7 +292,7 @@ impl GridMetaEditor {
pub async fn update_row(&self, changeset: RowMetaChangeset) -> FlowyResult<()> { pub async fn update_row(&self, changeset: RowMetaChangeset) -> FlowyResult<()> {
let field_metas = self.get_field_metas::<FieldOrder>(None).await?; let field_metas = self.get_field_metas::<FieldOrder>(None).await?;
self.block_manager self.block_meta_manager
.update_row(changeset, |row_meta| make_row_from_row_meta(&field_metas, row_meta)) .update_row(changeset, |row_meta| make_row_from_row_meta(&field_metas, row_meta))
.await .await
} }
@ -312,7 +315,7 @@ impl GridMetaEditor {
} }
pub async fn get_row(&self, row_id: &str) -> FlowyResult<Option<Row>> { pub async fn get_row(&self, row_id: &str) -> FlowyResult<Option<Row>> {
match self.block_manager.get_row_meta(row_id).await? { match self.block_meta_manager.get_row_meta(row_id).await? {
None => Ok(None), None => Ok(None),
Some(row_meta) => { Some(row_meta) => {
let field_metas = self.get_field_metas::<FieldOrder>(None).await?; let field_metas = self.get_field_metas::<FieldOrder>(None).await?;
@ -324,7 +327,7 @@ impl GridMetaEditor {
} }
} }
pub async fn delete_row(&self, row_id: &str) -> FlowyResult<()> { pub async fn delete_row(&self, row_id: &str) -> FlowyResult<()> {
let _ = self.block_manager.delete_row(row_id).await?; let _ = self.block_meta_manager.delete_row(row_id).await?;
Ok(()) Ok(())
} }
@ -334,12 +337,12 @@ impl GridMetaEditor {
pub async fn get_cell(&self, params: &CellIdentifier) -> Option<Cell> { pub async fn get_cell(&self, params: &CellIdentifier) -> Option<Cell> {
let field_meta = self.get_field_meta(&params.field_id).await?; let field_meta = self.get_field_meta(&params.field_id).await?;
let row_meta = self.block_manager.get_row_meta(&params.row_id).await.ok()??; let row_meta = self.block_meta_manager.get_row_meta(&params.row_id).await.ok()??;
make_cell(&params.field_id, &field_meta, &row_meta) make_cell(&params.field_id, &field_meta, &row_meta)
} }
pub async fn get_cell_meta(&self, row_id: &str, field_id: &str) -> FlowyResult<Option<CellMeta>> { pub async fn get_cell_meta(&self, row_id: &str, field_id: &str) -> FlowyResult<Option<CellMeta>> {
let row_meta = self.block_manager.get_row_meta(row_id).await?; let row_meta = self.block_meta_manager.get_row_meta(row_id).await?;
match row_meta { match row_meta {
None => Ok(None), None => Ok(None),
Some(row_meta) => { Some(row_meta) => {
@ -385,7 +388,7 @@ impl GridMetaEditor {
cell_content_changeset, cell_content_changeset,
}; };
let _ = self let _ = self
.block_manager .block_meta_manager
.update_cell(cell_changeset, |row_meta| { .update_cell(cell_changeset, |row_meta| {
make_row_from_row_meta(&field_metas, row_meta) make_row_from_row_meta(&field_metas, row_meta)
}) })
@ -400,13 +403,13 @@ impl GridMetaEditor {
make_grid_blocks(block_ids, block_snapshots) make_grid_blocks(block_ids, block_snapshots)
} }
pub async fn get_block_metas(&self) -> FlowyResult<Vec<GridBlockMeta>> { pub async fn get_block_metas(&self) -> FlowyResult<Vec<GridBlockMetaSnapshot>> {
let grid_blocks = self.grid_pad.read().await.get_block_metas(); let grid_blocks = self.grid_pad.read().await.get_block_metas();
Ok(grid_blocks) Ok(grid_blocks)
} }
pub async fn delete_rows(&self, row_orders: Vec<RowOrder>) -> FlowyResult<()> { pub async fn delete_rows(&self, row_orders: Vec<RowOrder>) -> FlowyResult<()> {
let changesets = self.block_manager.delete_rows(row_orders).await?; let changesets = self.block_meta_manager.delete_rows(row_orders).await?;
for changeset in changesets { for changeset in changesets {
let _ = self.update_block(changeset).await?; let _ = self.update_block(changeset).await?;
} }
@ -418,7 +421,7 @@ impl GridMetaEditor {
let field_orders = pad_read_guard.get_field_orders(); let field_orders = pad_read_guard.get_field_orders();
let mut block_orders = vec![]; let mut block_orders = vec![];
for block_order in pad_read_guard.get_block_metas() { for block_order in pad_read_guard.get_block_metas() {
let row_orders = self.block_manager.get_row_orders(&block_order.block_id).await?; let row_orders = self.block_meta_manager.get_row_orders(&block_order.block_id).await?;
let block_order = GridBlockOrder { let block_order = GridBlockOrder {
block_id: block_order.block_id, block_id: block_order.block_id,
row_orders, row_orders,
@ -445,7 +448,7 @@ impl GridMetaEditor {
.collect::<Vec<String>>(), .collect::<Vec<String>>(),
Some(block_ids) => block_ids, Some(block_ids) => block_ids,
}; };
let snapshots = self.block_manager.make_block_snapshots(block_ids).await?; let snapshots = self.block_meta_manager.make_block_snapshots(block_ids).await?;
Ok(snapshots) Ok(snapshots)
} }
@ -479,7 +482,10 @@ impl GridMetaEditor {
} }
pub async fn move_row(&self, row_id: &str, from: i32, to: i32) -> FlowyResult<()> { pub async fn move_row(&self, row_id: &str, from: i32, to: i32) -> FlowyResult<()> {
let _ = self.block_manager.move_row(row_id, from as usize, to as usize).await?; let _ = self
.block_meta_manager
.move_row(row_id, from as usize, to as usize)
.await?;
Ok(()) Ok(())
} }
@ -495,13 +501,14 @@ impl GridMetaEditor {
let mut blocks_meta_data = vec![]; let mut blocks_meta_data = vec![];
if original_blocks.len() == duplicated_blocks.len() { if original_blocks.len() == duplicated_blocks.len() {
for (index, original_block_meta) in original_blocks.iter().enumerate() { for (index, original_block_meta) in original_blocks.iter().enumerate() {
let grid_block_meta_editor = self.block_manager.get_editor(&original_block_meta.block_id).await?; let grid_block_meta_editor = self
.block_meta_manager
.get_editor(&original_block_meta.block_id)
.await?;
let duplicated_block_id = &duplicated_blocks[index].block_id; let duplicated_block_id = &duplicated_blocks[index].block_id;
tracing::trace!("Duplicate block:{} meta data", duplicated_block_id); tracing::trace!("Duplicate block:{} meta data", duplicated_block_id);
let duplicated_block_meta_data = grid_block_meta_editor let duplicated_block_meta_data = grid_block_meta_editor.duplicate_block_meta(duplicated_block_id).await;
.duplicate_block_meta_data(duplicated_block_id)
.await;
blocks_meta_data.push(duplicated_block_meta_data); blocks_meta_data.push(duplicated_block_meta_data);
} }
} else { } else {

View File

@ -1,8 +1,7 @@
mod util; mod util;
pub mod block_meta_editor; pub mod block;
mod block_meta_manager;
pub mod field; pub mod field;
pub mod grid_editor; pub mod grid_meta_editor;
pub mod persistence; pub mod persistence;
pub mod row; pub mod row;

View File

@ -7,7 +7,7 @@ use flowy_grid::services::field::{
}; };
use flowy_grid::services::row::{decode_cell_data_from_type_option_cell_data, CreateRowMetaBuilder}; use flowy_grid::services::row::{decode_cell_data_from_type_option_cell_data, CreateRowMetaBuilder};
use flowy_grid_data_model::entities::{ use flowy_grid_data_model::entities::{
CellChangeset, FieldChangesetParams, FieldType, GridBlockMeta, GridBlockMetaChangeset, RowMetaChangeset, CellChangeset, FieldChangesetParams, FieldType, GridBlockInfoChangeset, GridBlockMetaSnapshot, RowMetaChangeset,
TypeOptionDataEntry, TypeOptionDataEntry,
}; };
@ -123,7 +123,7 @@ async fn grid_delete_field() {
#[tokio::test] #[tokio::test]
async fn grid_create_block() { async fn grid_create_block() {
let grid_block = GridBlockMeta::new(); let grid_block = GridBlockMetaSnapshot::new();
let scripts = vec![ let scripts = vec![
AssertBlockCount(1), AssertBlockCount(1),
CreateBlock { block: grid_block }, CreateBlock { block: grid_block },
@ -134,9 +134,9 @@ async fn grid_create_block() {
#[tokio::test] #[tokio::test]
async fn grid_update_block() { async fn grid_update_block() {
let grid_block = GridBlockMeta::new(); let grid_block = GridBlockMetaSnapshot::new();
let mut cloned_grid_block = grid_block.clone(); let mut cloned_grid_block = grid_block.clone();
let changeset = GridBlockMetaChangeset { let changeset = GridBlockInfoChangeset {
block_id: grid_block.block_id.clone(), block_id: grid_block.block_id.clone(),
start_row_index: Some(2), start_row_index: Some(2),
row_count: Some(10), row_count: Some(10),

View File

@ -1,10 +1,11 @@
use bytes::Bytes; use bytes::Bytes;
use flowy_grid::services::field::*; use flowy_grid::services::field::*;
use flowy_grid::services::grid_editor::{GridMetaEditor, GridPadBuilder}; use flowy_grid::services::grid_meta_editor::{GridMetaEditor, GridPadBuilder};
use flowy_grid::services::row::CreateRowMetaPayload; use flowy_grid::services::row::CreateRowMetaPayload;
use flowy_grid_data_model::entities::{ use flowy_grid_data_model::entities::{
BuildGridContext, CellChangeset, Field, FieldChangesetParams, FieldMeta, FieldOrder, FieldType, GridBlockMeta, BuildGridContext, CellChangeset, Field, FieldChangesetParams, FieldMeta, FieldOrder, FieldType,
GridBlockMetaChangeset, InsertFieldParams, RowMeta, RowMetaChangeset, RowOrder, TypeOptionDataEntry, GridBlockInfoChangeset, GridBlockMetaSnapshot, InsertFieldParams, RowMeta, RowMetaChangeset, RowOrder,
TypeOptionDataEntry,
}; };
use flowy_revision::REVISION_WRITE_INTERVAL_IN_MILLIS; use flowy_revision::REVISION_WRITE_INTERVAL_IN_MILLIS;
use flowy_sync::client_grid::GridBuilder; use flowy_sync::client_grid::GridBuilder;
@ -32,10 +33,10 @@ pub enum EditorScript {
field_meta: FieldMeta, field_meta: FieldMeta,
}, },
CreateBlock { CreateBlock {
block: GridBlockMeta, block: GridBlockMetaSnapshot,
}, },
UpdateBlock { UpdateBlock {
changeset: GridBlockMetaChangeset, changeset: GridBlockInfoChangeset,
}, },
AssertBlockCount(usize), AssertBlockCount(usize),
AssertBlock { AssertBlock {
@ -45,7 +46,7 @@ pub enum EditorScript {
}, },
AssertBlockEqual { AssertBlockEqual {
block_index: usize, block_index: usize,
block: GridBlockMeta, block: GridBlockMetaSnapshot,
}, },
CreateEmptyRow, CreateEmptyRow,
CreateRow { CreateRow {
@ -74,7 +75,7 @@ pub struct GridEditorTest {
pub grid_id: String, pub grid_id: String,
pub editor: Arc<GridMetaEditor>, pub editor: Arc<GridMetaEditor>,
pub field_metas: Vec<FieldMeta>, pub field_metas: Vec<FieldMeta>,
pub grid_blocks: Vec<GridBlockMeta>, pub grid_blocks: Vec<GridBlockMetaSnapshot>,
pub row_metas: Vec<Arc<RowMeta>>, pub row_metas: Vec<Arc<RowMeta>>,
pub field_count: usize, pub field_count: usize,

View File

@ -28,17 +28,17 @@ pub fn gen_field_id() -> String {
pub struct GridMeta { pub struct GridMeta {
pub grid_id: String, pub grid_id: String,
pub fields: Vec<FieldMeta>, pub fields: Vec<FieldMeta>,
pub blocks: Vec<GridBlockMeta>, pub blocks: Vec<GridBlockMetaSnapshot>,
} }
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct GridBlockMeta { pub struct GridBlockMetaSnapshot {
pub block_id: String, pub block_id: String,
pub start_row_index: i32, pub start_row_index: i32,
pub row_count: i32, pub row_count: i32,
} }
impl GridBlockMeta { impl GridBlockMetaSnapshot {
pub fn len(&self) -> i32 { pub fn len(&self) -> i32 {
self.row_count self.row_count
} }
@ -48,22 +48,22 @@ impl GridBlockMeta {
} }
} }
impl GridBlockMeta { impl GridBlockMetaSnapshot {
pub fn new() -> Self { pub fn new() -> Self {
GridBlockMeta { GridBlockMetaSnapshot {
block_id: gen_block_id(), block_id: gen_block_id(),
..Default::default() ..Default::default()
} }
} }
} }
pub struct GridBlockMetaChangeset { pub struct GridBlockInfoChangeset {
pub block_id: String, pub block_id: String,
pub start_row_index: Option<i32>, pub start_row_index: Option<i32>,
pub row_count: Option<i32>, pub row_count: Option<i32>,
} }
impl GridBlockMetaChangeset { impl GridBlockInfoChangeset {
pub fn from_row_count(block_id: &str, row_count: i32) -> Self { pub fn from_row_count(block_id: &str, row_count: i32) -> Self {
Self { Self {
block_id: block_id.to_string(), block_id: block_id.to_string(),
@ -74,7 +74,7 @@ impl GridBlockMetaChangeset {
} }
#[derive(Debug, Clone, Default, Serialize, Deserialize)] #[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct GridBlockMetaData { pub struct GridBlockMeta {
pub block_id: String, pub block_id: String,
pub rows: Vec<RowMeta>, pub rows: Vec<RowMeta>,
} }
@ -206,8 +206,8 @@ impl CellMeta {
#[derive(Clone, Default, Deserialize, Serialize)] #[derive(Clone, Default, Deserialize, Serialize)]
pub struct BuildGridContext { pub struct BuildGridContext {
pub field_metas: Vec<FieldMeta>, pub field_metas: Vec<FieldMeta>,
pub blocks: Vec<GridBlockMeta>, pub blocks: Vec<GridBlockMetaSnapshot>,
pub blocks_meta_data: Vec<GridBlockMetaData>, pub blocks_meta_data: Vec<GridBlockMeta>,
} }
impl BuildGridContext { impl BuildGridContext {

View File

@ -1,9 +1,7 @@
use crate::entities::revision::{md5, RepeatedRevision, Revision}; use crate::entities::revision::{md5, RepeatedRevision, Revision};
use crate::errors::{CollaborateError, CollaborateResult}; use crate::errors::{CollaborateError, CollaborateResult};
use crate::util::{cal_diff, make_delta_from_revisions}; use crate::util::{cal_diff, make_delta_from_revisions};
use flowy_grid_data_model::entities::{ use flowy_grid_data_model::entities::{gen_block_id, gen_row_id, CellMeta, GridBlockMeta, RowMeta, RowMetaChangeset};
gen_block_id, gen_row_id, CellMeta, GridBlockMetaData, RowMeta, RowMetaChangeset,
};
use lib_ot::core::{OperationTransformable, PlainTextAttributes, PlainTextDelta, PlainTextDeltaBuilder}; use lib_ot::core::{OperationTransformable, PlainTextAttributes, PlainTextDelta, PlainTextDeltaBuilder};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::borrow::Cow; use std::borrow::Cow;
@ -24,7 +22,7 @@ pub struct GridBlockMetaPad {
} }
impl GridBlockMetaPad { impl GridBlockMetaPad {
pub async fn duplicate_data(&self, duplicated_block_id: &str) -> GridBlockMetaData { pub async fn duplicate_data(&self, duplicated_block_id: &str) -> GridBlockMeta {
let duplicated_rows = self let duplicated_rows = self
.rows .rows
.iter() .iter()
@ -35,7 +33,7 @@ impl GridBlockMetaPad {
duplicated_row duplicated_row
}) })
.collect::<Vec<RowMeta>>(); .collect::<Vec<RowMeta>>();
GridBlockMetaData { GridBlockMeta {
block_id: duplicated_block_id.to_string(), block_id: duplicated_block_id.to_string(),
rows: duplicated_rows, rows: duplicated_rows,
} }
@ -43,7 +41,7 @@ impl GridBlockMetaPad {
pub fn from_delta(delta: GridBlockMetaDelta) -> CollaborateResult<Self> { pub fn from_delta(delta: GridBlockMetaDelta) -> CollaborateResult<Self> {
let s = delta.to_str()?; let s = delta.to_str()?;
let meta_data: GridBlockMetaData = serde_json::from_str(&s).map_err(|e| { let meta_data: GridBlockMeta = serde_json::from_str(&s).map_err(|e| {
let msg = format!("Deserialize delta to block meta failed: {}", e); let msg = format!("Deserialize delta to block meta failed: {}", e);
tracing::error!("{}", s); tracing::error!("{}", s);
CollaborateError::internal().context(msg) CollaborateError::internal().context(msg)
@ -241,12 +239,12 @@ pub struct GridBlockMetaChange {
pub md5: String, pub md5: String,
} }
pub fn make_block_meta_delta(grid_block_meta_data: &GridBlockMetaData) -> GridBlockMetaDelta { pub fn make_block_meta_delta(grid_block_meta_data: &GridBlockMeta) -> GridBlockMetaDelta {
let json = serde_json::to_string(&grid_block_meta_data).unwrap(); let json = serde_json::to_string(&grid_block_meta_data).unwrap();
PlainTextDeltaBuilder::new().insert(&json).build() PlainTextDeltaBuilder::new().insert(&json).build()
} }
pub fn make_block_meta_revisions(user_id: &str, grid_block_meta_data: &GridBlockMetaData) -> RepeatedRevision { pub fn make_block_meta_revisions(user_id: &str, grid_block_meta_data: &GridBlockMeta) -> RepeatedRevision {
let delta = make_block_meta_delta(grid_block_meta_data); let delta = make_block_meta_delta(grid_block_meta_data);
let bytes = delta.to_delta_bytes(); let bytes = delta.to_delta_bytes();
let revision = Revision::initial_revision(user_id, &grid_block_meta_data.block_id, bytes); let revision = Revision::initial_revision(user_id, &grid_block_meta_data.block_id, bytes);
@ -255,7 +253,7 @@ pub fn make_block_meta_revisions(user_id: &str, grid_block_meta_data: &GridBlock
impl std::default::Default for GridBlockMetaPad { impl std::default::Default for GridBlockMetaPad {
fn default() -> Self { fn default() -> Self {
let block_meta_data = GridBlockMetaData { let block_meta_data = GridBlockMeta {
block_id: gen_block_id(), block_id: gen_block_id(),
rows: vec![], rows: vec![],
}; };

View File

@ -1,5 +1,5 @@
use crate::errors::{CollaborateError, CollaborateResult}; use crate::errors::{CollaborateError, CollaborateResult};
use flowy_grid_data_model::entities::{BuildGridContext, FieldMeta, GridBlockMeta, GridBlockMetaData, RowMeta}; use flowy_grid_data_model::entities::{BuildGridContext, FieldMeta, GridBlockMeta, GridBlockMetaSnapshot, RowMeta};
pub struct GridBuilder { pub struct GridBuilder {
build_context: BuildGridContext, build_context: BuildGridContext,
@ -9,8 +9,8 @@ impl std::default::Default for GridBuilder {
fn default() -> Self { fn default() -> Self {
let mut build_context = BuildGridContext::new(); let mut build_context = BuildGridContext::new();
let block_meta = GridBlockMeta::new(); let block_meta = GridBlockMetaSnapshot::new();
let block_meta_data = GridBlockMetaData { let block_meta_data = GridBlockMeta {
block_id: block_meta.block_id.clone(), block_id: block_meta.block_id.clone(),
rows: vec![], rows: vec![],
}; };
@ -59,7 +59,7 @@ fn check_rows(fields: &[FieldMeta], rows: &[RowMeta]) -> CollaborateResult<()> {
mod tests { mod tests {
use crate::client_grid::{make_block_meta_delta, make_grid_delta, GridBuilder}; use crate::client_grid::{make_block_meta_delta, make_grid_delta, GridBuilder};
use flowy_grid_data_model::entities::{FieldMeta, FieldType, GridBlockMetaData, GridMeta}; use flowy_grid_data_model::entities::{FieldMeta, FieldType, GridBlockMeta, GridMeta};
#[test] #[test]
fn create_default_grid_test() { fn create_default_grid_test() {
@ -82,6 +82,6 @@ mod tests {
let _: GridMeta = serde_json::from_str(&grid_meta_delta.to_str().unwrap()).unwrap(); let _: GridMeta = serde_json::from_str(&grid_meta_delta.to_str().unwrap()).unwrap();
let grid_block_meta_delta = make_block_meta_delta(build_context.blocks_meta_data.first().unwrap()); let grid_block_meta_delta = make_block_meta_delta(build_context.blocks_meta_data.first().unwrap());
let _: GridBlockMetaData = serde_json::from_str(&grid_block_meta_delta.to_str().unwrap()).unwrap(); let _: GridBlockMeta = serde_json::from_str(&grid_block_meta_delta.to_str().unwrap()).unwrap();
} }
} }

View File

@ -3,8 +3,8 @@ use crate::errors::{internal_error, CollaborateError, CollaborateResult};
use crate::util::{cal_diff, make_delta_from_revisions}; use crate::util::{cal_diff, make_delta_from_revisions};
use bytes::Bytes; use bytes::Bytes;
use flowy_grid_data_model::entities::{ use flowy_grid_data_model::entities::{
gen_block_id, gen_grid_id, FieldChangesetParams, FieldMeta, FieldOrder, FieldType, GridBlockMeta, gen_block_id, gen_grid_id, FieldChangesetParams, FieldMeta, FieldOrder, FieldType, GridBlockInfoChangeset,
GridBlockMetaChangeset, GridMeta, GridBlockMetaSnapshot, GridMeta,
}; };
use lib_infra::util::move_vec_element; use lib_infra::util::move_vec_element;
use lib_ot::core::{OperationTransformable, PlainTextAttributes, PlainTextDelta, PlainTextDeltaBuilder}; use lib_ot::core::{OperationTransformable, PlainTextAttributes, PlainTextDelta, PlainTextDeltaBuilder};
@ -24,7 +24,7 @@ pub trait JsonDeserializer {
} }
impl GridMetaPad { impl GridMetaPad {
pub async fn duplicate_grid_meta(&self) -> (Vec<FieldMeta>, Vec<GridBlockMeta>) { pub async fn duplicate_grid_meta(&self) -> (Vec<FieldMeta>, Vec<GridBlockMetaSnapshot>) {
let fields = self let fields = self
.grid_meta .grid_meta
.fields .fields
@ -41,7 +41,7 @@ impl GridMetaPad {
duplicated_block.block_id = gen_block_id(); duplicated_block.block_id = gen_block_id();
duplicated_block duplicated_block
}) })
.collect::<Vec<GridBlockMeta>>(); .collect::<Vec<GridBlockMetaSnapshot>>();
(fields, blocks) (fields, blocks)
} }
@ -283,7 +283,7 @@ impl GridMetaPad {
} }
} }
pub fn create_block_meta(&mut self, block: GridBlockMeta) -> CollaborateResult<Option<GridChangeset>> { pub fn create_block_meta(&mut self, block: GridBlockMetaSnapshot) -> CollaborateResult<Option<GridChangeset>> {
self.modify_grid(|grid_meta| { self.modify_grid(|grid_meta| {
if grid_meta.blocks.iter().any(|b| b.block_id == block.block_id) { if grid_meta.blocks.iter().any(|b| b.block_id == block.block_id) {
tracing::warn!("Duplicate grid block"); tracing::warn!("Duplicate grid block");
@ -306,11 +306,11 @@ impl GridMetaPad {
}) })
} }
pub fn get_block_metas(&self) -> Vec<GridBlockMeta> { pub fn get_block_metas(&self) -> Vec<GridBlockMetaSnapshot> {
self.grid_meta.blocks.clone() self.grid_meta.blocks.clone()
} }
pub fn update_block_meta(&mut self, changeset: GridBlockMetaChangeset) -> CollaborateResult<Option<GridChangeset>> { pub fn update_block_meta(&mut self, changeset: GridBlockInfoChangeset) -> CollaborateResult<Option<GridChangeset>> {
let block_id = changeset.block_id.clone(); let block_id = changeset.block_id.clone();
self.modify_block(&block_id, |block| { self.modify_block(&block_id, |block| {
let mut is_changed = None; let mut is_changed = None;
@ -368,7 +368,7 @@ impl GridMetaPad {
pub fn modify_block<F>(&mut self, block_id: &str, f: F) -> CollaborateResult<Option<GridChangeset>> pub fn modify_block<F>(&mut self, block_id: &str, f: F) -> CollaborateResult<Option<GridChangeset>>
where where
F: FnOnce(&mut GridBlockMeta) -> CollaborateResult<Option<()>>, F: FnOnce(&mut GridBlockMetaSnapshot) -> CollaborateResult<Option<()>>,
{ {
self.modify_grid( self.modify_grid(
|grid_meta| match grid_meta.blocks.iter().position(|block| block.block_id == block_id) { |grid_meta| match grid_meta.blocks.iter().position(|block| block.block_id == block_id) {