row_loader.rs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. use crate::entities::{BlockPB, RepeatedBlockPB, RowPB};
  2. use flowy_error::FlowyResult;
  3. use flowy_grid_data_model::revision::RowRevision;
  4. use std::collections::HashMap;
  5. use std::sync::Arc;
  6. pub struct GridBlockSnapshot {
  7. pub(crate) block_id: String,
  8. pub row_revs: Vec<Arc<RowRevision>>,
  9. }
  10. pub(crate) fn block_from_row_orders(row_orders: Vec<RowPB>) -> Vec<BlockPB> {
  11. let mut map: HashMap<String, BlockPB> = HashMap::new();
  12. row_orders.into_iter().for_each(|row_info| {
  13. // Memory Optimization: escape clone block_id
  14. let block_id = row_info.block_id().to_owned();
  15. let cloned_block_id = block_id.clone();
  16. map.entry(block_id)
  17. .or_insert_with(|| BlockPB::new(&cloned_block_id, vec![]))
  18. .rows
  19. .push(row_info);
  20. });
  21. map.into_values().collect::<Vec<_>>()
  22. }
  23. //
  24. // #[inline(always)]
  25. // fn make_cell_by_field_id(
  26. // field_map: &HashMap<&String, &FieldRevision>,
  27. // field_id: String,
  28. // cell_rev: CellRevision,
  29. // ) -> Option<(String, Cell)> {
  30. // let field_rev = field_map.get(&field_id)?;
  31. // let data = decode_cell_data(cell_rev.data, field_rev).data;
  32. // let cell = Cell::new(&field_id, data);
  33. // Some((field_id, cell))
  34. // }
  35. pub(crate) fn make_row_orders_from_row_revs(row_revs: &[Arc<RowRevision>]) -> Vec<RowPB> {
  36. row_revs.iter().map(RowPB::from).collect::<Vec<_>>()
  37. }
  38. pub(crate) fn make_row_from_row_rev(row_rev: Arc<RowRevision>) -> Option<RowPB> {
  39. make_rows_from_row_revs(&[row_rev]).pop()
  40. }
  41. pub(crate) fn make_rows_from_row_revs(row_revs: &[Arc<RowRevision>]) -> Vec<RowPB> {
  42. let make_row = |row_rev: &Arc<RowRevision>| RowPB {
  43. block_id: row_rev.block_id.clone(),
  44. id: row_rev.id.clone(),
  45. height: row_rev.height,
  46. };
  47. row_revs.iter().map(make_row).collect::<Vec<_>>()
  48. }
  49. pub(crate) fn make_grid_blocks(
  50. block_ids: Option<Vec<String>>,
  51. block_snapshots: Vec<GridBlockSnapshot>,
  52. ) -> FlowyResult<RepeatedBlockPB> {
  53. match block_ids {
  54. None => Ok(block_snapshots
  55. .into_iter()
  56. .map(|snapshot| {
  57. let row_orders = make_row_orders_from_row_revs(&snapshot.row_revs);
  58. BlockPB::new(&snapshot.block_id, row_orders)
  59. })
  60. .collect::<Vec<BlockPB>>()
  61. .into()),
  62. Some(block_ids) => {
  63. let block_meta_data_map: HashMap<&String, &Vec<Arc<RowRevision>>> = block_snapshots
  64. .iter()
  65. .map(|data| (&data.block_id, &data.row_revs))
  66. .collect();
  67. let mut grid_blocks = vec![];
  68. for block_id in block_ids {
  69. match block_meta_data_map.get(&block_id) {
  70. None => {}
  71. Some(row_revs) => {
  72. let row_orders = make_row_orders_from_row_revs(row_revs);
  73. grid_blocks.push(BlockPB::new(&block_id, row_orders));
  74. }
  75. }
  76. }
  77. Ok(grid_blocks.into())
  78. }
  79. }
  80. }