grid_view_manager.rs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. use crate::entities::{
  2. CreateRowParams, DeleteFilterParams, DeleteGroupParams, GridFilterConfigurationPB, GridSettingPB,
  3. InsertFilterParams, InsertGroupParams, MoveGroupParams, 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_operations_from_revisions;
  16. use lib_infra::future::AFFuture;
  17. use lib_ot::core::EmptyAttributes;
  18. use std::sync::Arc;
  19. type ViewId = String;
  20. pub trait GridViewFieldDelegate: Send + Sync + 'static {
  21. fn get_field_revs(&self) -> AFFuture<Vec<Arc<FieldRevision>>>;
  22. fn get_field_rev(&self, field_id: &str) -> AFFuture<Option<Arc<FieldRevision>>>;
  23. }
  24. pub trait GridViewRowDelegate: Send + Sync + 'static {
  25. fn gv_index_of_row(&self, row_id: &str) -> AFFuture<Option<usize>>;
  26. fn gv_get_row_rev(&self, row_id: &str) -> AFFuture<Option<Arc<RowRevision>>>;
  27. fn gv_row_revs(&self) -> AFFuture<Vec<Arc<RowRevision>>>;
  28. }
  29. pub(crate) struct GridViewManager {
  30. grid_id: String,
  31. user: Arc<dyn GridUser>,
  32. field_delegate: Arc<dyn GridViewFieldDelegate>,
  33. row_delegate: Arc<dyn GridViewRowDelegate>,
  34. view_editors: DashMap<ViewId, Arc<GridViewRevisionEditor>>,
  35. scheduler: Arc<dyn GridServiceTaskScheduler>,
  36. }
  37. impl GridViewManager {
  38. pub(crate) async fn new(
  39. grid_id: String,
  40. user: Arc<dyn GridUser>,
  41. field_delegate: Arc<dyn GridViewFieldDelegate>,
  42. row_delegate: Arc<dyn GridViewRowDelegate>,
  43. scheduler: Arc<dyn GridServiceTaskScheduler>,
  44. ) -> FlowyResult<Self> {
  45. Ok(Self {
  46. grid_id,
  47. user,
  48. scheduler,
  49. field_delegate,
  50. row_delegate,
  51. view_editors: DashMap::default(),
  52. })
  53. }
  54. pub(crate) async fn duplicate_grid_view(&self) -> FlowyResult<String> {
  55. let editor = self.get_default_view_editor().await?;
  56. let view_data = editor.duplicate_view_data().await?;
  57. Ok(view_data)
  58. }
  59. /// When the row was created, we may need to modify the [RowRevision] according to the [CreateRowParams].
  60. pub(crate) async fn will_create_row(&self, row_rev: &mut RowRevision, params: &CreateRowParams) {
  61. for view_editor in self.view_editors.iter() {
  62. view_editor.will_create_view_row(row_rev, params).await;
  63. }
  64. }
  65. /// Notify the view that the row was created. For the moment, the view is just sending notifications.
  66. pub(crate) async fn did_create_row(&self, row_pb: &RowPB, params: &CreateRowParams) {
  67. for view_editor in self.view_editors.iter() {
  68. view_editor.did_create_view_row(row_pb, params).await;
  69. }
  70. }
  71. /// Insert/Delete the group's row if the corresponding data was changed.
  72. pub(crate) async fn did_update_row(&self, row_id: &str) {
  73. match self.row_delegate.gv_get_row_rev(row_id).await {
  74. None => {
  75. tracing::warn!("Can not find the row in grid view");
  76. }
  77. Some(row_rev) => {
  78. for view_editor in self.view_editors.iter() {
  79. view_editor.did_update_view_row(&row_rev).await;
  80. }
  81. }
  82. }
  83. }
  84. pub(crate) async fn group_by_field(&self, field_id: &str) -> FlowyResult<()> {
  85. let view_editor = self.get_default_view_editor().await?;
  86. let _ = view_editor.group_by_view_field(field_id).await?;
  87. Ok(())
  88. }
  89. pub(crate) async fn did_update_cell(&self, row_id: &str, _field_id: &str) {
  90. self.did_update_row(row_id).await
  91. }
  92. pub(crate) async fn did_delete_row(&self, row_rev: Arc<RowRevision>) {
  93. for view_editor in self.view_editors.iter() {
  94. view_editor.did_delete_view_row(&row_rev).await;
  95. }
  96. }
  97. pub(crate) async fn get_setting(&self) -> FlowyResult<GridSettingPB> {
  98. let view_editor = self.get_default_view_editor().await?;
  99. Ok(view_editor.get_view_setting().await)
  100. }
  101. pub(crate) async fn get_filters(&self) -> FlowyResult<Vec<GridFilterConfigurationPB>> {
  102. let view_editor = self.get_default_view_editor().await?;
  103. Ok(view_editor.get_view_filters().await)
  104. }
  105. pub(crate) async fn insert_or_update_filter(&self, params: InsertFilterParams) -> FlowyResult<()> {
  106. let view_editor = self.get_default_view_editor().await?;
  107. view_editor.insert_view_filter(params).await
  108. }
  109. pub(crate) async fn delete_filter(&self, params: DeleteFilterParams) -> FlowyResult<()> {
  110. let view_editor = self.get_default_view_editor().await?;
  111. view_editor.delete_view_filter(params).await
  112. }
  113. pub(crate) async fn load_groups(&self) -> FlowyResult<RepeatedGridGroupPB> {
  114. let view_editor = self.get_default_view_editor().await?;
  115. let groups = view_editor.load_view_groups().await?;
  116. Ok(RepeatedGridGroupPB { items: groups })
  117. }
  118. pub(crate) async fn insert_or_update_group(&self, params: InsertGroupParams) -> FlowyResult<()> {
  119. let view_editor = self.get_default_view_editor().await?;
  120. view_editor.insert_group(params).await
  121. }
  122. pub(crate) async fn delete_group(&self, params: DeleteGroupParams) -> FlowyResult<()> {
  123. let view_editor = self.get_default_view_editor().await?;
  124. view_editor.delete_view_group(params).await
  125. }
  126. pub(crate) async fn move_group(&self, params: MoveGroupParams) -> FlowyResult<()> {
  127. let view_editor = self.get_default_view_editor().await?;
  128. let _ = view_editor.move_view_group(params).await?;
  129. Ok(())
  130. }
  131. /// It may generate a RowChangeset when the Row was moved from one group to another.
  132. /// The return value, [RowChangeset], contains the changes made by the groups.
  133. ///
  134. pub(crate) async fn move_group_row(
  135. &self,
  136. row_rev: Arc<RowRevision>,
  137. to_group_id: String,
  138. to_row_id: Option<String>,
  139. recv_row_changeset: impl FnOnce(RowChangeset) -> AFFuture<()>,
  140. ) -> FlowyResult<()> {
  141. let mut row_changeset = RowChangeset::new(row_rev.id.clone());
  142. let view_editor = self.get_default_view_editor().await?;
  143. let group_changesets = view_editor
  144. .move_view_group_row(&row_rev, &mut row_changeset, &to_group_id, to_row_id.clone())
  145. .await;
  146. if !row_changeset.is_empty() {
  147. recv_row_changeset(row_changeset).await;
  148. }
  149. for group_changeset in group_changesets {
  150. view_editor.notify_did_update_group(group_changeset).await;
  151. }
  152. Ok(())
  153. }
  154. #[tracing::instrument(level = "trace", skip(self), err)]
  155. pub(crate) async fn did_update_view_field(&self, field_id: &str) -> FlowyResult<()> {
  156. let view_editor = self.get_default_view_editor().await?;
  157. // Only the field_id of the updated field is equal to the field_id of the group.
  158. // Update the group
  159. if view_editor.group_id().await != field_id {
  160. return Ok(());
  161. }
  162. let _ = view_editor.did_update_view_field(field_id).await?;
  163. Ok(())
  164. }
  165. /// Notifies the view's field type option data is changed
  166. /// For the moment, only the groups will be generated after the type option data changed. A
  167. /// [FieldRevision] has a property named type_options contains a list of type option data.
  168. /// # Arguments
  169. ///
  170. /// * `field_id`: the id of the field in current view
  171. ///
  172. #[tracing::instrument(level = "trace", skip(self), err)]
  173. pub(crate) async fn did_update_view_field_type_option(&self, field_id: &str) -> FlowyResult<()> {
  174. let view_editor = self.get_default_view_editor().await?;
  175. let _ = view_editor.group_by_view_field(field_id).await?;
  176. Ok(())
  177. }
  178. pub(crate) async fn get_view_editor(&self, view_id: &str) -> FlowyResult<Arc<GridViewRevisionEditor>> {
  179. debug_assert!(!view_id.is_empty());
  180. match self.view_editors.get(view_id) {
  181. None => {
  182. let editor = Arc::new(
  183. make_view_editor(
  184. &self.user,
  185. view_id,
  186. self.field_delegate.clone(),
  187. self.row_delegate.clone(),
  188. self.scheduler.clone(),
  189. )
  190. .await?,
  191. );
  192. self.view_editors.insert(view_id.to_owned(), editor.clone());
  193. Ok(editor)
  194. }
  195. Some(view_editor) => Ok(view_editor.clone()),
  196. }
  197. }
  198. async fn get_default_view_editor(&self) -> FlowyResult<Arc<GridViewRevisionEditor>> {
  199. self.get_view_editor(&self.grid_id).await
  200. }
  201. }
  202. async fn make_view_editor(
  203. user: &Arc<dyn GridUser>,
  204. view_id: &str,
  205. field_delegate: Arc<dyn GridViewFieldDelegate>,
  206. row_delegate: Arc<dyn GridViewRowDelegate>,
  207. scheduler: Arc<dyn GridServiceTaskScheduler>,
  208. ) -> FlowyResult<GridViewRevisionEditor> {
  209. let rev_manager = make_grid_view_rev_manager(user, view_id).await?;
  210. let user_id = user.user_id()?;
  211. let token = user.token()?;
  212. let view_id = view_id.to_owned();
  213. GridViewRevisionEditor::new(
  214. &user_id,
  215. &token,
  216. view_id,
  217. field_delegate,
  218. row_delegate,
  219. scheduler,
  220. rev_manager,
  221. )
  222. .await
  223. }
  224. pub async fn make_grid_view_rev_manager(user: &Arc<dyn GridUser>, view_id: &str) -> FlowyResult<RevisionManager> {
  225. let user_id = user.user_id()?;
  226. let pool = user.db_pool()?;
  227. let disk_cache = SQLiteGridViewRevisionPersistence::new(&user_id, pool.clone());
  228. let rev_persistence = RevisionPersistence::new(&user_id, view_id, disk_cache);
  229. let rev_compactor = GridViewRevisionCompactor();
  230. let snapshot_persistence = SQLiteRevisionSnapshotPersistence::new(view_id, pool);
  231. Ok(RevisionManager::new(
  232. &user_id,
  233. view_id,
  234. rev_persistence,
  235. rev_compactor,
  236. snapshot_persistence,
  237. ))
  238. }
  239. pub struct GridViewRevisionCompactor();
  240. impl RevisionCompactor for GridViewRevisionCompactor {
  241. fn bytes_from_revisions(&self, revisions: Vec<Revision>) -> FlowyResult<Bytes> {
  242. let operations = make_operations_from_revisions::<EmptyAttributes>(revisions)?;
  243. Ok(operations.json_bytes())
  244. }
  245. }