grid_view_manager.rs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. use crate::entities::{CreateRowParams, GridFilterConfiguration, GridSettingPB, RepeatedGridGroupPB, RowPB};
  2. use crate::manager::GridUser;
  3. use crate::services::block_manager::GridBlockManager;
  4. use crate::services::grid_editor_task::GridServiceTaskScheduler;
  5. use crate::services::grid_view_editor::{GridViewRevisionDataSource, GridViewRevisionDelegate, GridViewRevisionEditor};
  6. use bytes::Bytes;
  7. use dashmap::DashMap;
  8. use flowy_error::FlowyResult;
  9. use flowy_grid_data_model::revision::{FieldRevision, RowRevision};
  10. use flowy_revision::disk::SQLiteGridViewRevisionPersistence;
  11. use flowy_revision::{RevisionCompactor, RevisionManager, RevisionPersistence, SQLiteRevisionSnapshotPersistence};
  12. use flowy_sync::client_grid::GridRevisionPad;
  13. use flowy_sync::entities::grid::GridSettingChangesetParams;
  14. use flowy_sync::entities::revision::Revision;
  15. use flowy_sync::util::make_text_delta_from_revisions;
  16. use lib_infra::future::{wrap_future, AFFuture};
  17. use std::sync::Arc;
  18. use tokio::sync::RwLock;
  19. type ViewId = String;
  20. pub(crate) struct GridViewManager {
  21. user: Arc<dyn GridUser>,
  22. grid_pad: Arc<RwLock<GridRevisionPad>>,
  23. block_manager: Arc<GridBlockManager>,
  24. view_editors: DashMap<ViewId, Arc<GridViewRevisionEditor>>,
  25. scheduler: Arc<dyn GridServiceTaskScheduler>,
  26. }
  27. impl GridViewManager {
  28. pub(crate) async fn new(
  29. user: Arc<dyn GridUser>,
  30. grid_pad: Arc<RwLock<GridRevisionPad>>,
  31. block_manager: Arc<GridBlockManager>,
  32. scheduler: Arc<dyn GridServiceTaskScheduler>,
  33. ) -> FlowyResult<Self> {
  34. Ok(Self {
  35. user,
  36. grid_pad,
  37. scheduler,
  38. block_manager,
  39. view_editors: DashMap::default(),
  40. })
  41. }
  42. pub(crate) async fn update_row(&self, row_rev: &mut RowRevision, params: &CreateRowParams) {
  43. for view_editor in self.view_editors.iter() {
  44. view_editor.create_row(row_rev, params).await;
  45. }
  46. }
  47. pub(crate) async fn did_create_row(&self, row_pb: &RowPB, params: &CreateRowParams) {
  48. for view_editor in self.view_editors.iter() {
  49. view_editor.did_create_row(row_pb, params).await;
  50. }
  51. }
  52. pub(crate) async fn delete_row(&self, row_id: &str) {
  53. for view_editor in self.view_editors.iter() {
  54. view_editor.delete_row(row_id).await;
  55. }
  56. }
  57. pub(crate) async fn get_setting(&self) -> FlowyResult<GridSettingPB> {
  58. let view_editor = self.get_default_view_editor().await?;
  59. Ok(view_editor.get_setting().await)
  60. }
  61. pub(crate) async fn update_setting(&self, params: GridSettingChangesetParams) -> FlowyResult<()> {
  62. let view_editor = self.get_default_view_editor().await?;
  63. let _ = view_editor.update_setting(params).await?;
  64. Ok(())
  65. }
  66. pub(crate) async fn get_filters(&self) -> FlowyResult<Vec<GridFilterConfiguration>> {
  67. let view_editor = self.get_default_view_editor().await?;
  68. Ok(view_editor.get_filters().await)
  69. }
  70. pub(crate) async fn load_groups(&self) -> FlowyResult<RepeatedGridGroupPB> {
  71. let view_editor = self.get_default_view_editor().await?;
  72. let groups = view_editor.load_groups().await?;
  73. Ok(RepeatedGridGroupPB { items: groups })
  74. }
  75. pub(crate) async fn move_row(&self, row_id: &str, from: i32, to: i32) -> FlowyResult<()> {
  76. match self.block_manager.get_row_rev(row_id).await? {
  77. None => tracing::warn!("Move row failed, can not find the row:{}", row_id),
  78. Some(row_rev) => {
  79. let _ = self
  80. .block_manager
  81. .move_row(row_rev.clone(), from as usize, to as usize)
  82. .await?;
  83. }
  84. }
  85. Ok(())
  86. }
  87. pub(crate) async fn get_view_editor(&self, view_id: &str) -> FlowyResult<Arc<GridViewRevisionEditor>> {
  88. debug_assert!(!view_id.is_empty());
  89. match self.view_editors.get(view_id) {
  90. None => {
  91. let editor = Arc::new(
  92. make_view_editor(
  93. &self.user,
  94. view_id,
  95. self.grid_pad.clone(),
  96. self.block_manager.clone(),
  97. self.scheduler.clone(),
  98. )
  99. .await?,
  100. );
  101. self.view_editors.insert(view_id.to_owned(), editor.clone());
  102. Ok(editor)
  103. }
  104. Some(view_editor) => Ok(view_editor.clone()),
  105. }
  106. }
  107. async fn get_default_view_editor(&self) -> FlowyResult<Arc<GridViewRevisionEditor>> {
  108. let grid_id = self.grid_pad.read().await.grid_id();
  109. self.get_view_editor(&grid_id).await
  110. }
  111. }
  112. async fn make_view_editor<Delegate, DataSource>(
  113. user: &Arc<dyn GridUser>,
  114. view_id: &str,
  115. delegate: Delegate,
  116. data_source: DataSource,
  117. scheduler: Arc<dyn GridServiceTaskScheduler>,
  118. ) -> FlowyResult<GridViewRevisionEditor>
  119. where
  120. Delegate: GridViewRevisionDelegate,
  121. DataSource: GridViewRevisionDataSource,
  122. {
  123. tracing::trace!("Open view:{} editor", view_id);
  124. let rev_manager = make_grid_view_rev_manager(user, view_id).await?;
  125. let user_id = user.user_id()?;
  126. let token = user.token()?;
  127. let view_id = view_id.to_owned();
  128. GridViewRevisionEditor::new(&user_id, &token, view_id, delegate, data_source, scheduler, rev_manager).await
  129. }
  130. pub async fn make_grid_view_rev_manager(user: &Arc<dyn GridUser>, view_id: &str) -> FlowyResult<RevisionManager> {
  131. tracing::trace!("Open view:{} editor", view_id);
  132. let user_id = user.user_id()?;
  133. let pool = user.db_pool()?;
  134. let disk_cache = SQLiteGridViewRevisionPersistence::new(&user_id, pool.clone());
  135. let rev_persistence = RevisionPersistence::new(&user_id, view_id, disk_cache);
  136. let rev_compactor = GridViewRevisionCompactor();
  137. let snapshot_persistence = SQLiteRevisionSnapshotPersistence::new(view_id, pool);
  138. Ok(RevisionManager::new(
  139. &user_id,
  140. view_id,
  141. rev_persistence,
  142. rev_compactor,
  143. snapshot_persistence,
  144. ))
  145. }
  146. pub struct GridViewRevisionCompactor();
  147. impl RevisionCompactor for GridViewRevisionCompactor {
  148. fn bytes_from_revisions(&self, revisions: Vec<Revision>) -> FlowyResult<Bytes> {
  149. let delta = make_text_delta_from_revisions(revisions)?;
  150. Ok(delta.json_bytes())
  151. }
  152. }
  153. impl GridViewRevisionDataSource for Arc<GridBlockManager> {
  154. fn row_revs(&self) -> AFFuture<Vec<Arc<RowRevision>>> {
  155. let block_manager = self.clone();
  156. wrap_future(async move {
  157. let blocks = block_manager.get_block_snapshots(None).await.unwrap();
  158. blocks
  159. .into_iter()
  160. .map(|block| block.row_revs)
  161. .flatten()
  162. .collect::<Vec<Arc<RowRevision>>>()
  163. })
  164. }
  165. }
  166. impl GridViewRevisionDelegate for Arc<RwLock<GridRevisionPad>> {
  167. fn get_field_revs(&self) -> AFFuture<Vec<Arc<FieldRevision>>> {
  168. let pad = self.clone();
  169. wrap_future(async move {
  170. match pad.read().await.get_field_revs(None) {
  171. Ok(field_revs) => field_revs,
  172. Err(e) => {
  173. tracing::error!("[GridViewRevisionDelegate] get field revisions failed: {}", e);
  174. vec![]
  175. }
  176. }
  177. })
  178. }
  179. fn get_field_rev(&self, field_id: &str) -> AFFuture<Option<Arc<FieldRevision>>> {
  180. let pad = self.clone();
  181. let field_id = field_id.to_owned();
  182. wrap_future(async move {
  183. pad.read()
  184. .await
  185. .get_field_rev(&field_id)
  186. .map(|(_, field_rev)| field_rev.clone())
  187. })
  188. }
  189. }