grid_revision_pad.rs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. use crate::errors::{internal_sync_error, SyncError, SyncResult};
  2. use crate::util::cal_diff;
  3. use flowy_sync::util::make_operations_from_revisions;
  4. use grid_model::{
  5. gen_block_id, gen_grid_id, FieldRevision, FieldTypeRevision, GridBlockMetaRevision, GridBlockMetaRevisionChangeset,
  6. GridRevision,
  7. };
  8. use lib_infra::util::md5;
  9. use lib_infra::util::move_vec_element;
  10. use lib_ot::core::{DeltaOperationBuilder, DeltaOperations, EmptyAttributes, OperationTransform};
  11. use revision_model::Revision;
  12. use std::collections::HashMap;
  13. use std::sync::Arc;
  14. pub type GridOperations = DeltaOperations<EmptyAttributes>;
  15. pub type GridOperationsBuilder = DeltaOperationBuilder<EmptyAttributes>;
  16. #[derive(Clone)]
  17. pub struct GridRevisionPad {
  18. grid_rev: Arc<GridRevision>,
  19. operations: GridOperations,
  20. }
  21. pub trait JsonDeserializer {
  22. fn deserialize(&self, type_option_data: Vec<u8>) -> SyncResult<String>;
  23. }
  24. impl GridRevisionPad {
  25. pub fn grid_id(&self) -> String {
  26. self.grid_rev.grid_id.clone()
  27. }
  28. pub async fn duplicate_grid_block_meta(&self) -> (Vec<FieldRevision>, Vec<GridBlockMetaRevision>) {
  29. let fields = self
  30. .grid_rev
  31. .fields
  32. .iter()
  33. .map(|field_rev| field_rev.as_ref().clone())
  34. .collect();
  35. let blocks = self
  36. .grid_rev
  37. .blocks
  38. .iter()
  39. .map(|block| {
  40. let mut duplicated_block = (**block).clone();
  41. duplicated_block.block_id = gen_block_id();
  42. duplicated_block
  43. })
  44. .collect::<Vec<GridBlockMetaRevision>>();
  45. (fields, blocks)
  46. }
  47. pub fn from_operations(operations: GridOperations) -> SyncResult<Self> {
  48. let content = operations.content()?;
  49. let grid: GridRevision = serde_json::from_str(&content).map_err(|e| {
  50. let msg = format!("Deserialize operations to grid failed: {}", e);
  51. tracing::error!("{}", msg);
  52. SyncError::internal().context(msg)
  53. })?;
  54. Ok(Self {
  55. grid_rev: Arc::new(grid),
  56. operations,
  57. })
  58. }
  59. pub fn from_revisions(revisions: Vec<Revision>) -> SyncResult<Self> {
  60. let operations: GridOperations = make_operations_from_revisions(revisions)?;
  61. Self::from_operations(operations)
  62. }
  63. #[tracing::instrument(level = "debug", skip_all, err)]
  64. pub fn create_field_rev(
  65. &mut self,
  66. new_field_rev: FieldRevision,
  67. start_field_id: Option<String>,
  68. ) -> SyncResult<Option<GridRevisionChangeset>> {
  69. self.modify_grid(|grid_meta| {
  70. // Check if the field exists or not
  71. if grid_meta
  72. .fields
  73. .iter()
  74. .any(|field_rev| field_rev.id == new_field_rev.id)
  75. {
  76. tracing::error!("Duplicate grid field");
  77. return Ok(None);
  78. }
  79. let insert_index = match start_field_id {
  80. None => None,
  81. Some(start_field_id) => grid_meta.fields.iter().position(|field| field.id == start_field_id),
  82. };
  83. let new_field_rev = Arc::new(new_field_rev);
  84. match insert_index {
  85. None => grid_meta.fields.push(new_field_rev),
  86. Some(index) => grid_meta.fields.insert(index, new_field_rev),
  87. }
  88. Ok(Some(()))
  89. })
  90. }
  91. pub fn delete_field_rev(&mut self, field_id: &str) -> SyncResult<Option<GridRevisionChangeset>> {
  92. self.modify_grid(
  93. |grid_meta| match grid_meta.fields.iter().position(|field| field.id == field_id) {
  94. None => Ok(None),
  95. Some(index) => {
  96. if grid_meta.fields[index].is_primary {
  97. Err(SyncError::can_not_delete_primary_field())
  98. } else {
  99. grid_meta.fields.remove(index);
  100. Ok(Some(()))
  101. }
  102. }
  103. },
  104. )
  105. }
  106. pub fn duplicate_field_rev(
  107. &mut self,
  108. field_id: &str,
  109. duplicated_field_id: &str,
  110. ) -> SyncResult<Option<GridRevisionChangeset>> {
  111. self.modify_grid(
  112. |grid_meta| match grid_meta.fields.iter().position(|field| field.id == field_id) {
  113. None => Ok(None),
  114. Some(index) => {
  115. let mut duplicate_field_rev = grid_meta.fields[index].as_ref().clone();
  116. duplicate_field_rev.id = duplicated_field_id.to_string();
  117. duplicate_field_rev.name = format!("{} (copy)", duplicate_field_rev.name);
  118. grid_meta.fields.insert(index + 1, Arc::new(duplicate_field_rev));
  119. Ok(Some(()))
  120. }
  121. },
  122. )
  123. }
  124. /// Modifies the current field type of the [FieldTypeRevision]
  125. ///
  126. /// # Arguments
  127. ///
  128. /// * `field_id`: the id of the field
  129. /// * `field_type`: the new field type of the field
  130. /// * `make_default_type_option`: create the field type's type-option data
  131. /// * `type_option_transform`: create the field type's type-option data
  132. ///
  133. ///
  134. pub fn switch_to_field<DT, TT, T>(
  135. &mut self,
  136. field_id: &str,
  137. new_field_type: T,
  138. make_default_type_option: DT,
  139. type_option_transform: TT,
  140. ) -> SyncResult<Option<GridRevisionChangeset>>
  141. where
  142. DT: FnOnce() -> String,
  143. TT: FnOnce(FieldTypeRevision, Option<String>, String) -> String,
  144. T: Into<FieldTypeRevision>,
  145. {
  146. let new_field_type = new_field_type.into();
  147. self.modify_grid(|grid_meta| {
  148. match grid_meta.fields.iter_mut().find(|field_rev| field_rev.id == field_id) {
  149. None => {
  150. tracing::warn!("Can not find the field with id: {}", field_id);
  151. Ok(None)
  152. }
  153. Some(field_rev) => {
  154. let mut_field_rev = Arc::make_mut(field_rev);
  155. let old_field_type_rev = mut_field_rev.ty;
  156. let old_field_type_option = mut_field_rev
  157. .get_type_option_str(mut_field_rev.ty)
  158. .map(|value| value.to_owned());
  159. match mut_field_rev.get_type_option_str(new_field_type) {
  160. Some(new_field_type_option) => {
  161. let transformed_type_option = type_option_transform(
  162. old_field_type_rev,
  163. old_field_type_option,
  164. new_field_type_option.to_owned(),
  165. );
  166. mut_field_rev.insert_type_option_str(&new_field_type, transformed_type_option);
  167. }
  168. None => {
  169. // If the type-option data isn't exist before, creating the default type-option data.
  170. let new_field_type_option = make_default_type_option();
  171. let transformed_type_option =
  172. type_option_transform(old_field_type_rev, old_field_type_option, new_field_type_option);
  173. mut_field_rev.insert_type_option_str(&new_field_type, transformed_type_option);
  174. }
  175. }
  176. mut_field_rev.ty = new_field_type;
  177. Ok(Some(()))
  178. }
  179. }
  180. })
  181. }
  182. pub fn replace_field_rev(&mut self, field_rev: Arc<FieldRevision>) -> SyncResult<Option<GridRevisionChangeset>> {
  183. self.modify_grid(
  184. |grid_meta| match grid_meta.fields.iter().position(|field| field.id == field_rev.id) {
  185. None => Ok(None),
  186. Some(index) => {
  187. grid_meta.fields.remove(index);
  188. grid_meta.fields.insert(index, field_rev);
  189. Ok(Some(()))
  190. }
  191. },
  192. )
  193. }
  194. pub fn move_field(
  195. &mut self,
  196. field_id: &str,
  197. from_index: usize,
  198. to_index: usize,
  199. ) -> SyncResult<Option<GridRevisionChangeset>> {
  200. self.modify_grid(|grid_meta| {
  201. match move_vec_element(
  202. &mut grid_meta.fields,
  203. |field| field.id == field_id,
  204. from_index,
  205. to_index,
  206. )
  207. .map_err(internal_sync_error)?
  208. {
  209. true => Ok(Some(())),
  210. false => Ok(None),
  211. }
  212. })
  213. }
  214. pub fn contain_field(&self, field_id: &str) -> bool {
  215. self.grid_rev.fields.iter().any(|field| field.id == field_id)
  216. }
  217. pub fn get_field_rev(&self, field_id: &str) -> Option<(usize, &Arc<FieldRevision>)> {
  218. self.grid_rev
  219. .fields
  220. .iter()
  221. .enumerate()
  222. .find(|(_, field)| field.id == field_id)
  223. }
  224. pub fn get_field_revs(&self, field_ids: Option<Vec<String>>) -> SyncResult<Vec<Arc<FieldRevision>>> {
  225. match field_ids {
  226. None => Ok(self.grid_rev.fields.clone()),
  227. Some(field_ids) => {
  228. let field_by_field_id = self
  229. .grid_rev
  230. .fields
  231. .iter()
  232. .map(|field| (&field.id, field))
  233. .collect::<HashMap<&String, &Arc<FieldRevision>>>();
  234. let fields = field_ids
  235. .iter()
  236. .flat_map(|field_id| match field_by_field_id.get(&field_id) {
  237. None => {
  238. tracing::error!("Can't find the field with id: {}", field_id);
  239. None
  240. }
  241. Some(field) => Some((*field).clone()),
  242. })
  243. .collect::<Vec<Arc<FieldRevision>>>();
  244. Ok(fields)
  245. }
  246. }
  247. }
  248. pub fn create_block_meta_rev(&mut self, block: GridBlockMetaRevision) -> SyncResult<Option<GridRevisionChangeset>> {
  249. self.modify_grid(|grid_meta| {
  250. if grid_meta.blocks.iter().any(|b| b.block_id == block.block_id) {
  251. tracing::warn!("Duplicate grid block");
  252. Ok(None)
  253. } else {
  254. match grid_meta.blocks.last() {
  255. None => grid_meta.blocks.push(Arc::new(block)),
  256. Some(last_block) => {
  257. if last_block.start_row_index > block.start_row_index
  258. && last_block.len() > block.start_row_index
  259. {
  260. let msg = "GridBlock's start_row_index should be greater than the last_block's start_row_index and its len".to_string();
  261. return Err(SyncError::internal().context(msg))
  262. }
  263. grid_meta.blocks.push(Arc::new(block));
  264. }
  265. }
  266. Ok(Some(()))
  267. }
  268. })
  269. }
  270. pub fn get_block_meta_revs(&self) -> Vec<Arc<GridBlockMetaRevision>> {
  271. self.grid_rev.blocks.clone()
  272. }
  273. pub fn update_block_rev(
  274. &mut self,
  275. changeset: GridBlockMetaRevisionChangeset,
  276. ) -> SyncResult<Option<GridRevisionChangeset>> {
  277. let block_id = changeset.block_id.clone();
  278. self.modify_block(&block_id, |block| {
  279. let mut is_changed = None;
  280. if let Some(row_count) = changeset.row_count {
  281. block.row_count = row_count;
  282. is_changed = Some(());
  283. }
  284. if let Some(start_row_index) = changeset.start_row_index {
  285. block.start_row_index = start_row_index;
  286. is_changed = Some(());
  287. }
  288. Ok(is_changed)
  289. })
  290. }
  291. pub fn grid_md5(&self) -> String {
  292. md5(&self.operations.json_bytes())
  293. }
  294. pub fn operations_json_str(&self) -> String {
  295. self.operations.json_str()
  296. }
  297. pub fn get_fields(&self) -> &[Arc<FieldRevision>] {
  298. &self.grid_rev.fields
  299. }
  300. fn modify_grid<F>(&mut self, f: F) -> SyncResult<Option<GridRevisionChangeset>>
  301. where
  302. F: FnOnce(&mut GridRevision) -> SyncResult<Option<()>>,
  303. {
  304. let cloned_grid = self.grid_rev.clone();
  305. match f(Arc::make_mut(&mut self.grid_rev))? {
  306. None => Ok(None),
  307. Some(_) => {
  308. let old = make_grid_rev_json_str(&cloned_grid)?;
  309. let new = self.json_str()?;
  310. match cal_diff::<EmptyAttributes>(old, new) {
  311. None => Ok(None),
  312. Some(operations) => {
  313. self.operations = self.operations.compose(&operations)?;
  314. Ok(Some(GridRevisionChangeset {
  315. operations,
  316. md5: self.grid_md5(),
  317. }))
  318. }
  319. }
  320. }
  321. }
  322. }
  323. fn modify_block<F>(&mut self, block_id: &str, f: F) -> SyncResult<Option<GridRevisionChangeset>>
  324. where
  325. F: FnOnce(&mut GridBlockMetaRevision) -> SyncResult<Option<()>>,
  326. {
  327. self.modify_grid(
  328. |grid_rev| match grid_rev.blocks.iter().position(|block| block.block_id == block_id) {
  329. None => {
  330. tracing::warn!("[GridMetaPad]: Can't find any block with id: {}", block_id);
  331. Ok(None)
  332. }
  333. Some(index) => {
  334. let block_rev = Arc::make_mut(&mut grid_rev.blocks[index]);
  335. f(block_rev)
  336. }
  337. },
  338. )
  339. }
  340. pub fn modify_field<F>(&mut self, field_id: &str, f: F) -> SyncResult<Option<GridRevisionChangeset>>
  341. where
  342. F: FnOnce(&mut FieldRevision) -> SyncResult<Option<()>>,
  343. {
  344. self.modify_grid(
  345. |grid_rev| match grid_rev.fields.iter().position(|field| field.id == field_id) {
  346. None => {
  347. tracing::warn!("[GridMetaPad]: Can't find any field with id: {}", field_id);
  348. Ok(None)
  349. }
  350. Some(index) => {
  351. let mut_field_rev = Arc::make_mut(&mut grid_rev.fields[index]);
  352. f(mut_field_rev)
  353. }
  354. },
  355. )
  356. }
  357. pub fn json_str(&self) -> SyncResult<String> {
  358. make_grid_rev_json_str(&self.grid_rev)
  359. }
  360. }
  361. pub fn make_grid_rev_json_str(grid_revision: &GridRevision) -> SyncResult<String> {
  362. let json = serde_json::to_string(grid_revision)
  363. .map_err(|err| internal_sync_error(format!("Serialize grid to json str failed. {:?}", err)))?;
  364. Ok(json)
  365. }
  366. pub struct GridRevisionChangeset {
  367. pub operations: GridOperations,
  368. /// md5: the md5 of the grid after applying the change.
  369. pub md5: String,
  370. }
  371. pub fn make_grid_operations(grid_rev: &GridRevision) -> GridOperations {
  372. let json = serde_json::to_string(&grid_rev).unwrap();
  373. GridOperationsBuilder::new().insert(&json).build()
  374. }
  375. pub fn make_grid_revisions(_user_id: &str, grid_rev: &GridRevision) -> Vec<Revision> {
  376. let operations = make_grid_operations(grid_rev);
  377. let bytes = operations.json_bytes();
  378. let revision = Revision::initial_revision(&grid_rev.grid_id, bytes);
  379. vec![revision]
  380. }
  381. impl std::default::Default for GridRevisionPad {
  382. fn default() -> Self {
  383. let grid = GridRevision::new(&gen_grid_id());
  384. let operations = make_grid_operations(&grid);
  385. GridRevisionPad {
  386. grid_rev: Arc::new(grid),
  387. operations,
  388. }
  389. }
  390. }