grid_view_manager.rs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. use crate::entities::{
  2. CreateFilterParams, CreateRowParams, DeleteFilterParams, GridFilterConfigurationPB, GridSettingPB, MoveGroupParams,
  3. RepeatedGridGroupPB, RowPB,
  4. };
  5. use crate::manager::GridUser;
  6. use crate::services::grid_editor_task::GridServiceTaskScheduler;
  7. use crate::services::grid_view_editor::GridViewRevisionEditor;
  8. use bytes::Bytes;
  9. use dashmap::DashMap;
  10. use flowy_error::FlowyResult;
  11. use flowy_grid_data_model::revision::{FieldRevision, RowChangeset, RowRevision};
  12. use flowy_revision::disk::SQLiteGridViewRevisionPersistence;
  13. use flowy_revision::{RevisionCompactor, RevisionManager, RevisionPersistence, SQLiteRevisionSnapshotPersistence};
  14. use flowy_sync::entities::revision::Revision;
  15. use flowy_sync::util::make_text_delta_from_revisions;
  16. use lib_infra::future::AFFuture;
  17. use std::sync::Arc;
  18. type ViewId = String;
  19. pub trait GridViewFieldDelegate: Send + Sync + 'static {
  20. fn get_field_revs(&self) -> AFFuture<Vec<Arc<FieldRevision>>>;
  21. fn get_field_rev(&self, field_id: &str) -> AFFuture<Option<Arc<FieldRevision>>>;
  22. }
  23. pub trait GridViewRowDelegate: Send + Sync + 'static {
  24. fn gv_index_of_row(&self, row_id: &str) -> AFFuture<Option<usize>>;
  25. fn gv_get_row_rev(&self, row_id: &str) -> AFFuture<Option<Arc<RowRevision>>>;
  26. fn gv_row_revs(&self) -> AFFuture<Vec<Arc<RowRevision>>>;
  27. }
  28. pub(crate) struct GridViewManager {
  29. grid_id: String,
  30. user: Arc<dyn GridUser>,
  31. field_delegate: Arc<dyn GridViewFieldDelegate>,
  32. row_delegate: Arc<dyn GridViewRowDelegate>,
  33. view_editors: DashMap<ViewId, Arc<GridViewRevisionEditor>>,
  34. scheduler: Arc<dyn GridServiceTaskScheduler>,
  35. }
  36. impl GridViewManager {
  37. pub(crate) async fn new(
  38. grid_id: String,
  39. user: Arc<dyn GridUser>,
  40. field_delegate: Arc<dyn GridViewFieldDelegate>,
  41. row_delegate: Arc<dyn GridViewRowDelegate>,
  42. scheduler: Arc<dyn GridServiceTaskScheduler>,
  43. ) -> FlowyResult<Self> {
  44. Ok(Self {
  45. grid_id,
  46. user,
  47. scheduler,
  48. field_delegate,
  49. row_delegate,
  50. view_editors: DashMap::default(),
  51. })
  52. }
  53. /// When the row was created, we may need to modify the [RowRevision] according to the [CreateRowParams].
  54. pub(crate) async fn will_create_row(&self, row_rev: &mut RowRevision, params: &CreateRowParams) {
  55. for view_editor in self.view_editors.iter() {
  56. view_editor.will_create_row(row_rev, params).await;
  57. }
  58. }
  59. /// Notify the view that the row was created. For the moment, the view is just sending notifications.
  60. pub(crate) async fn did_create_row(&self, row_pb: &RowPB, params: &CreateRowParams) {
  61. for view_editor in self.view_editors.iter() {
  62. view_editor.did_create_row(row_pb, params).await;
  63. }
  64. }
  65. /// Insert/Delete the group's row if the corresponding data was changed.
  66. pub(crate) async fn did_update_row(&self, row_id: &str) {
  67. match self.row_delegate.gv_get_row_rev(row_id).await {
  68. None => {
  69. tracing::warn!("Can not find the row in grid view");
  70. }
  71. Some(row_rev) => {
  72. for view_editor in self.view_editors.iter() {
  73. view_editor.did_update_row(&row_rev).await;
  74. }
  75. }
  76. }
  77. }
  78. pub(crate) async fn group_by_field(&self, field_id: &str) -> FlowyResult<()> {
  79. let view_editor = self.get_default_view_editor().await?;
  80. let _ = view_editor.group_by_field(field_id).await?;
  81. Ok(())
  82. }
  83. pub(crate) async fn did_update_cell(&self, row_id: &str, _field_id: &str) {
  84. self.did_update_row(row_id).await
  85. }
  86. pub(crate) async fn did_delete_row(&self, row_rev: Arc<RowRevision>) {
  87. for view_editor in self.view_editors.iter() {
  88. view_editor.did_delete_row(&row_rev).await;
  89. }
  90. }
  91. pub(crate) async fn get_setting(&self) -> FlowyResult<GridSettingPB> {
  92. let view_editor = self.get_default_view_editor().await?;
  93. Ok(view_editor.get_setting().await)
  94. }
  95. pub(crate) async fn get_filters(&self) -> FlowyResult<Vec<GridFilterConfigurationPB>> {
  96. let view_editor = self.get_default_view_editor().await?;
  97. Ok(view_editor.get_filters().await)
  98. }
  99. pub(crate) async fn update_filter(&self, insert_filter: CreateFilterParams) -> FlowyResult<()> {
  100. let view_editor = self.get_default_view_editor().await?;
  101. view_editor.insert_filter(insert_filter).await
  102. }
  103. pub(crate) async fn delete_filter(&self, delete_filter: DeleteFilterParams) -> FlowyResult<()> {
  104. let view_editor = self.get_default_view_editor().await?;
  105. view_editor.delete_filter(delete_filter).await
  106. }
  107. pub(crate) async fn load_groups(&self) -> FlowyResult<RepeatedGridGroupPB> {
  108. let view_editor = self.get_default_view_editor().await?;
  109. let groups = view_editor.load_groups().await?;
  110. Ok(RepeatedGridGroupPB { items: groups })
  111. }
  112. pub(crate) async fn move_group(&self, params: MoveGroupParams) -> FlowyResult<()> {
  113. let view_editor = self.get_default_view_editor().await?;
  114. let _ = view_editor.move_group(params).await?;
  115. Ok(())
  116. }
  117. /// It may generate a RowChangeset when the Row was moved from one group to another.
  118. /// The return value, [RowChangeset], contains the changes made by the groups.
  119. ///
  120. pub(crate) async fn move_group_row(
  121. &self,
  122. row_rev: Arc<RowRevision>,
  123. to_group_id: String,
  124. to_row_id: Option<String>,
  125. recv_row_changeset: impl FnOnce(RowChangeset) -> AFFuture<()>,
  126. ) -> FlowyResult<()> {
  127. let mut row_changeset = RowChangeset::new(row_rev.id.clone());
  128. let view_editor = self.get_default_view_editor().await?;
  129. let group_changesets = view_editor
  130. .move_group_row(&row_rev, &mut row_changeset, &to_group_id, to_row_id.clone())
  131. .await;
  132. if !row_changeset.is_empty() {
  133. recv_row_changeset(row_changeset).await;
  134. }
  135. for group_changeset in group_changesets {
  136. view_editor.notify_did_update_group(group_changeset).await;
  137. }
  138. Ok(())
  139. }
  140. pub(crate) async fn did_update_field(&self, field_id: &str) -> FlowyResult<()> {
  141. let view_editor = self.get_default_view_editor().await?;
  142. let _ = view_editor.did_update_field(field_id).await?;
  143. Ok(())
  144. }
  145. pub(crate) async fn get_view_editor(&self, view_id: &str) -> FlowyResult<Arc<GridViewRevisionEditor>> {
  146. debug_assert!(!view_id.is_empty());
  147. match self.view_editors.get(view_id) {
  148. None => {
  149. let editor = Arc::new(
  150. make_view_editor(
  151. &self.user,
  152. view_id,
  153. self.field_delegate.clone(),
  154. self.row_delegate.clone(),
  155. self.scheduler.clone(),
  156. )
  157. .await?,
  158. );
  159. self.view_editors.insert(view_id.to_owned(), editor.clone());
  160. Ok(editor)
  161. }
  162. Some(view_editor) => Ok(view_editor.clone()),
  163. }
  164. }
  165. async fn get_default_view_editor(&self) -> FlowyResult<Arc<GridViewRevisionEditor>> {
  166. self.get_view_editor(&self.grid_id).await
  167. }
  168. }
  169. async fn make_view_editor(
  170. user: &Arc<dyn GridUser>,
  171. view_id: &str,
  172. field_delegate: Arc<dyn GridViewFieldDelegate>,
  173. row_delegate: Arc<dyn GridViewRowDelegate>,
  174. scheduler: Arc<dyn GridServiceTaskScheduler>,
  175. ) -> FlowyResult<GridViewRevisionEditor> {
  176. let rev_manager = make_grid_view_rev_manager(user, view_id).await?;
  177. let user_id = user.user_id()?;
  178. let token = user.token()?;
  179. let view_id = view_id.to_owned();
  180. GridViewRevisionEditor::new(
  181. &user_id,
  182. &token,
  183. view_id,
  184. field_delegate,
  185. row_delegate,
  186. scheduler,
  187. rev_manager,
  188. )
  189. .await
  190. }
  191. pub async fn make_grid_view_rev_manager(user: &Arc<dyn GridUser>, view_id: &str) -> FlowyResult<RevisionManager> {
  192. let user_id = user.user_id()?;
  193. let pool = user.db_pool()?;
  194. let disk_cache = SQLiteGridViewRevisionPersistence::new(&user_id, pool.clone());
  195. let rev_persistence = RevisionPersistence::new(&user_id, view_id, disk_cache);
  196. let rev_compactor = GridViewRevisionCompactor();
  197. let snapshot_persistence = SQLiteRevisionSnapshotPersistence::new(view_id, pool);
  198. Ok(RevisionManager::new(
  199. &user_id,
  200. view_id,
  201. rev_persistence,
  202. rev_compactor,
  203. snapshot_persistence,
  204. ))
  205. }
  206. pub struct GridViewRevisionCompactor();
  207. impl RevisionCompactor for GridViewRevisionCompactor {
  208. fn bytes_from_revisions(&self, revisions: Vec<Revision>) -> FlowyResult<Bytes> {
  209. let delta = make_text_delta_from_revisions(revisions)?;
  210. Ok(delta.json_bytes())
  211. }
  212. }