controller.rs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #![allow(clippy::all)]
  2. use crate::entities::FieldType;
  3. #[allow(unused_attributes)]
  4. use crate::entities::SortChangesetNotificationPB;
  5. use crate::services::sort::{SortChangeset, SortType};
  6. use flowy_task::TaskDispatcher;
  7. use grid_rev_model::{CellRevision, FieldRevision, RowRevision, SortCondition, SortRevision};
  8. use lib_infra::future::Fut;
  9. use std::cmp::Ordering;
  10. use std::collections::HashMap;
  11. use std::sync::Arc;
  12. use tokio::sync::RwLock;
  13. pub trait SortDelegate: Send + Sync {
  14. fn get_sort_rev(&self, sort_type: SortType) -> Fut<Vec<Arc<SortRevision>>>;
  15. fn get_field_rev(&self, field_id: &str) -> Fut<Option<Arc<FieldRevision>>>;
  16. fn get_field_revs(&self, field_ids: Option<Vec<String>>) -> Fut<Vec<Arc<FieldRevision>>>;
  17. }
  18. pub struct SortController {
  19. #[allow(dead_code)]
  20. view_id: String,
  21. #[allow(dead_code)]
  22. handler_id: String,
  23. #[allow(dead_code)]
  24. delegate: Box<dyn SortDelegate>,
  25. task_scheduler: Arc<RwLock<TaskDispatcher>>,
  26. #[allow(dead_code)]
  27. sorts: Vec<SortRevision>,
  28. #[allow(dead_code)]
  29. row_orders: HashMap<String, usize>,
  30. }
  31. impl SortController {
  32. pub fn new<T>(view_id: &str, handler_id: &str, delegate: T, task_scheduler: Arc<RwLock<TaskDispatcher>>) -> Self
  33. where
  34. T: SortDelegate + 'static,
  35. {
  36. Self {
  37. view_id: view_id.to_string(),
  38. handler_id: handler_id.to_string(),
  39. delegate: Box::new(delegate),
  40. task_scheduler,
  41. sorts: vec![],
  42. row_orders: HashMap::new(),
  43. }
  44. }
  45. pub async fn close(&self) {
  46. self.task_scheduler
  47. .write()
  48. .await
  49. .unregister_handler(&self.handler_id)
  50. .await;
  51. }
  52. pub fn sort_rows(&self, _rows: &mut Vec<Arc<RowRevision>>) {
  53. // rows.par_sort_by(|left, right| cmp_row(left, right, &self.sorts));
  54. }
  55. pub async fn did_receive_changes(&mut self, _changeset: SortChangeset) -> Option<SortChangesetNotificationPB> {
  56. None
  57. }
  58. }
  59. #[allow(dead_code)]
  60. fn cmp_row(
  61. left: &Arc<RowRevision>,
  62. right: &Arc<RowRevision>,
  63. sorts: &[SortRevision],
  64. field_revs: &[Arc<FieldRevision>],
  65. ) -> Ordering {
  66. let mut order = Ordering::Equal;
  67. for sort in sorts.iter() {
  68. let cmp_order = match (left.cells.get(&sort.field_id), right.cells.get(&sort.field_id)) {
  69. (Some(left_cell), Some(right_cell)) => {
  70. let field_type: FieldType = sort.field_type.into();
  71. match field_revs.iter().find(|field_rev| field_rev.id == sort.field_id) {
  72. None => Ordering::Equal,
  73. Some(field_rev) => cmp_cell(left_cell, right_cell, field_rev, field_type),
  74. }
  75. }
  76. (Some(_), None) => Ordering::Greater,
  77. (None, Some(_)) => Ordering::Less,
  78. _ => Ordering::Equal,
  79. };
  80. if cmp_order.is_ne() {
  81. // If the cmp_order is not Ordering::Equal, then break the loop.
  82. order = match sort.condition {
  83. SortCondition::Ascending => cmp_order,
  84. SortCondition::Descending => cmp_order.reverse(),
  85. };
  86. break;
  87. }
  88. }
  89. order
  90. }
  91. #[allow(dead_code)]
  92. fn cmp_cell(
  93. _left: &CellRevision,
  94. _right: &CellRevision,
  95. _field_rev: &Arc<FieldRevision>,
  96. field_type: FieldType,
  97. ) -> Ordering {
  98. let cal_order = || {
  99. let order = match &field_type {
  100. // FieldType::RichText => {
  101. // let left_cell = TypeCellData::try_from(left).ok()?.into();
  102. // let right_cell = TypeCellData::try_from(right).ok()?.into();
  103. // field_rev
  104. // .get_type_option::<RichTextTypeOptionPB>(field_rev.ty)?
  105. // .apply_cmp(&left_cell, &right_cell)
  106. // }
  107. // FieldType::Number => field_rev
  108. // .get_type_option::<NumberTypeOptionPB>(field_rev.ty)?
  109. // .apply_cmp(&left_cell, &right_cell),
  110. _ => Ordering::Equal,
  111. };
  112. Option::<Ordering>::Some(order)
  113. };
  114. cal_order().unwrap_or(Ordering::Equal)
  115. }