row_loader.rs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. use crate::services::row::deserialize_cell_data;
  2. use flowy_error::FlowyResult;
  3. use flowy_grid_data_model::entities::{
  4. Cell, CellMeta, FieldMeta, GridBlock, GridBlockMeta, RepeatedGridBlock, RepeatedRowOrder, Row, RowMeta, RowOrder,
  5. };
  6. use rayon::iter::{IntoParallelIterator, ParallelIterator};
  7. use std::collections::HashMap;
  8. use std::ops::Deref;
  9. use std::sync::Arc;
  10. pub(crate) struct RowIdsPerBlock {
  11. pub(crate) block_id: String,
  12. pub(crate) row_ids: Vec<String>,
  13. }
  14. impl RowIdsPerBlock {
  15. pub fn new(block_id: &str) -> Self {
  16. RowIdsPerBlock {
  17. block_id: block_id.to_owned(),
  18. row_ids: vec![],
  19. }
  20. }
  21. }
  22. pub(crate) struct GridBlockMetaDataSnapshot {
  23. pub(crate) block_id: String,
  24. pub(crate) row_metas: Vec<Arc<RowMeta>>,
  25. }
  26. pub(crate) fn make_row_ids_per_block(row_orders: &[RowOrder]) -> Vec<RowIdsPerBlock> {
  27. let mut map: HashMap<&String, RowIdsPerBlock> = HashMap::new();
  28. row_orders.iter().for_each(|row_order| {
  29. let block_id = &row_order.block_id;
  30. let row_id = row_order.row_id.clone();
  31. map.entry(&block_id)
  32. .or_insert_with(|| RowIdsPerBlock::new(&block_id))
  33. .row_ids
  34. .push(row_id);
  35. });
  36. map.into_values().collect::<Vec<_>>()
  37. }
  38. pub(crate) fn make_grid_blocks(
  39. field_metas: &[FieldMeta],
  40. grid_block_meta_snapshots: Vec<GridBlockMetaDataSnapshot>,
  41. ) -> FlowyResult<RepeatedGridBlock> {
  42. Ok(grid_block_meta_snapshots
  43. .into_iter()
  44. .map(|row_metas_per_block| {
  45. let rows = make_rows_from_row_metas(field_metas, &row_metas_per_block.row_metas);
  46. GridBlock {
  47. block_id: row_metas_per_block.block_id,
  48. rows,
  49. }
  50. })
  51. .collect::<Vec<GridBlock>>()
  52. .into())
  53. }
  54. #[inline(always)]
  55. pub fn make_cell(
  56. field_map: &HashMap<&String, &FieldMeta>,
  57. field_id: String,
  58. raw_cell: CellMeta,
  59. ) -> Option<(String, Cell)> {
  60. let field_meta = field_map.get(&field_id)?;
  61. match deserialize_cell_data(raw_cell.data, field_meta) {
  62. Ok(content) => {
  63. let cell = Cell::new(&field_id, content);
  64. Some((field_id, cell))
  65. }
  66. Err(e) => {
  67. tracing::error!("{}", e);
  68. None
  69. }
  70. }
  71. }
  72. pub(crate) fn make_rows_from_row_metas(fields: &[FieldMeta], row_metas: &Vec<Arc<RowMeta>>) -> Vec<Row> {
  73. let field_meta_map = fields
  74. .iter()
  75. .map(|field_meta| (&field_meta.id, field_meta))
  76. .collect::<HashMap<&String, &FieldMeta>>();
  77. let make_row = |row_meta: &Arc<RowMeta>| {
  78. let cell_by_field_id = row_meta
  79. .cell_by_field_id
  80. .clone()
  81. .into_par_iter()
  82. .flat_map(|(field_id, raw_cell)| make_cell(&field_meta_map, field_id, raw_cell))
  83. .collect::<HashMap<String, Cell>>();
  84. Row {
  85. id: row_meta.id.clone(),
  86. cell_by_field_id,
  87. height: row_meta.height,
  88. }
  89. };
  90. row_metas.into_iter().map(make_row).collect::<Vec<_>>()
  91. }
  92. pub(crate) fn make_grid_block_from_block_metas(
  93. field_metas: &[FieldMeta],
  94. grid_block_metas: Vec<GridBlockMeta>,
  95. grid_block_meta_snapshots: Vec<GridBlockMetaDataSnapshot>,
  96. ) -> FlowyResult<RepeatedGridBlock> {
  97. let block_meta_snapshot_map: HashMap<&String, &Vec<Arc<RowMeta>>> = grid_block_meta_snapshots
  98. .iter()
  99. .map(|snapshot| (&snapshot.block_id, &snapshot.row_metas))
  100. .collect();
  101. let mut grid_blocks = vec![];
  102. for grid_block_meta in grid_block_metas {
  103. match block_meta_snapshot_map.get(&grid_block_meta.block_id) {
  104. None => {}
  105. Some(row_metas) => {
  106. let rows = make_rows_from_row_metas(&field_metas, row_metas);
  107. grid_blocks.push(GridBlock::new(&grid_block_meta.block_id, rows));
  108. }
  109. }
  110. }
  111. Ok(grid_blocks.into())
  112. }