database_editor.rs 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389
  1. use std::collections::HashMap;
  2. use std::ops::Deref;
  3. use std::sync::Arc;
  4. use bytes::Bytes;
  5. use collab_database::database::Database as InnerDatabase;
  6. use collab_database::fields::{Field, TypeOptionData};
  7. use collab_database::rows::{Cell, Cells, CreateRowParams, Row, RowCell, RowId};
  8. use collab_database::views::{DatabaseLayout, DatabaseView, LayoutSetting};
  9. use futures::StreamExt;
  10. use parking_lot::Mutex;
  11. use tokio::sync::{broadcast, RwLock};
  12. use flowy_error::{internal_error, ErrorCode, FlowyError, FlowyResult};
  13. use flowy_task::TaskDispatcher;
  14. use lib_infra::future::{to_fut, Fut};
  15. use crate::entities::*;
  16. use crate::notification::{send_notification, DatabaseNotification};
  17. use crate::services::cell::{
  18. apply_cell_changeset, get_cell_protobuf, AnyTypeCache, CellCache, ToCellChangeset,
  19. };
  20. use crate::services::database::util::database_view_setting_pb_from_view;
  21. use crate::services::database::{RowDetail, UpdatedRow};
  22. use crate::services::database_view::{DatabaseViewChanged, DatabaseViewData, DatabaseViews};
  23. use crate::services::field::checklist_type_option::{ChecklistCellChangeset, ChecklistCellData};
  24. use crate::services::field::{
  25. default_type_option_data_from_type, select_type_option_from_field, transform_type_option,
  26. type_option_data_from_pb_or_default, type_option_to_pb, DateCellData, SelectOptionCellChangeset,
  27. SelectOptionIds, TypeOptionCellDataHandler, TypeOptionCellExt,
  28. };
  29. use crate::services::filter::Filter;
  30. use crate::services::group::{
  31. default_group_setting, GroupSetting, GroupSettingChangeset, RowChangeset,
  32. };
  33. use crate::services::share::csv::{CSVExport, CSVFormat};
  34. use crate::services::sort::Sort;
  35. #[derive(Clone)]
  36. pub struct DatabaseEditor {
  37. database: MutexDatabase,
  38. pub cell_cache: CellCache,
  39. database_views: Arc<DatabaseViews>,
  40. }
  41. impl DatabaseEditor {
  42. pub async fn new(
  43. database: MutexDatabase,
  44. task_scheduler: Arc<RwLock<TaskDispatcher>>,
  45. ) -> FlowyResult<Self> {
  46. let cell_cache = AnyTypeCache::<u64>::new();
  47. let database_view_data = Arc::new(DatabaseViewDataImpl {
  48. database: database.clone(),
  49. task_scheduler: task_scheduler.clone(),
  50. cell_cache: cell_cache.clone(),
  51. });
  52. let database_id = database.lock().get_database_id();
  53. // Receive database sync state and send to frontend via the notification
  54. let mut sync_state = database.lock().subscribe_sync_state();
  55. let cloned_database_id = database_id.clone();
  56. tokio::spawn(async move {
  57. while let Some(sync_state) = sync_state.next().await {
  58. send_notification(
  59. &cloned_database_id,
  60. DatabaseNotification::DidUpdateDatabaseSyncUpdate,
  61. )
  62. .payload(DatabaseSyncStatePB::from(sync_state))
  63. .send();
  64. }
  65. });
  66. // Receive database snapshot state and send to frontend via the notification
  67. let mut snapshot_state = database.lock().subscribe_snapshot_state();
  68. tokio::spawn(async move {
  69. while let Some(snapshot_state) = snapshot_state.next().await {
  70. if let Some(new_snapshot_id) = snapshot_state.snapshot_id() {
  71. tracing::debug!("Did create database snapshot: {}", new_snapshot_id);
  72. send_notification(
  73. &database_id,
  74. DatabaseNotification::DidUpdateDatabaseSnapshotState,
  75. )
  76. .payload(DatabaseSnapshotStatePB { new_snapshot_id })
  77. .send();
  78. }
  79. }
  80. });
  81. let database_views =
  82. Arc::new(DatabaseViews::new(database.clone(), cell_cache.clone(), database_view_data).await?);
  83. Ok(Self {
  84. database,
  85. cell_cache,
  86. database_views,
  87. })
  88. }
  89. #[tracing::instrument(level = "debug", skip_all)]
  90. pub async fn close_view_editor(&self, view_id: &str) -> bool {
  91. self.database_views.close_view(view_id).await
  92. }
  93. pub async fn close(&self) {}
  94. pub async fn update_view_layout(
  95. &self,
  96. view_id: &str,
  97. layout_type: DatabaseLayout,
  98. ) -> FlowyResult<()> {
  99. let view_editor = self.database_views.get_view_editor(view_id).await?;
  100. view_editor.v_update_layout_type(layout_type).await?;
  101. Ok(())
  102. }
  103. pub async fn subscribe_view_changed(
  104. &self,
  105. view_id: &str,
  106. ) -> FlowyResult<broadcast::Receiver<DatabaseViewChanged>> {
  107. let view_editor = self.database_views.get_view_editor(view_id).await?;
  108. Ok(view_editor.notifier.subscribe())
  109. }
  110. pub fn get_field(&self, field_id: &str) -> Option<Field> {
  111. self.database.lock().fields.get_field(field_id)
  112. }
  113. pub async fn set_group_by_field(&self, view_id: &str, field_id: &str) -> FlowyResult<()> {
  114. {
  115. let database = self.database.lock();
  116. let field = database.fields.get_field(field_id);
  117. if let Some(field) = field {
  118. let group_setting = default_group_setting(&field);
  119. database.insert_group_setting(view_id, group_setting);
  120. }
  121. }
  122. let view_editor = self.database_views.get_view_editor(view_id).await?;
  123. view_editor.v_initialize_new_group(field_id).await?;
  124. Ok(())
  125. }
  126. pub async fn delete_group(&self, params: DeleteGroupParams) -> FlowyResult<()> {
  127. self
  128. .database
  129. .lock()
  130. .delete_group_setting(&params.view_id, &params.group_id);
  131. let view_editor = self.database_views.get_view_editor(&params.view_id).await?;
  132. view_editor.v_delete_group(params).await?;
  133. Ok(())
  134. }
  135. /// Returns the delete view ids.
  136. /// If the view is inline view, all the reference views will be deleted. So the return value
  137. /// will be the reference view ids and the inline view id. Otherwise, the return value will
  138. /// be the view id.
  139. pub async fn delete_database_view(&self, view_id: &str) -> FlowyResult<Vec<String>> {
  140. Ok(self.database.lock().delete_view(view_id))
  141. }
  142. pub async fn update_group_setting(
  143. &self,
  144. view_id: &str,
  145. group_setting_changeset: GroupSettingChangeset,
  146. ) -> FlowyResult<()> {
  147. let view_editor = self.database_views.get_view_editor(view_id).await?;
  148. view_editor
  149. .update_group_setting(group_setting_changeset)
  150. .await?;
  151. Ok(())
  152. }
  153. #[tracing::instrument(level = "trace", skip_all, err)]
  154. pub async fn create_or_update_filter(&self, params: UpdateFilterParams) -> FlowyResult<()> {
  155. let view_editor = self.database_views.get_view_editor(&params.view_id).await?;
  156. view_editor.v_insert_filter(params).await?;
  157. Ok(())
  158. }
  159. pub async fn delete_filter(&self, params: DeleteFilterParams) -> FlowyResult<()> {
  160. let view_editor = self.database_views.get_view_editor(&params.view_id).await?;
  161. view_editor.v_delete_filter(params).await?;
  162. Ok(())
  163. }
  164. pub async fn create_or_update_sort(&self, params: UpdateSortParams) -> FlowyResult<Sort> {
  165. let view_editor = self.database_views.get_view_editor(&params.view_id).await?;
  166. let sort = view_editor.v_insert_sort(params).await?;
  167. Ok(sort)
  168. }
  169. pub async fn delete_sort(&self, params: DeleteSortParams) -> FlowyResult<()> {
  170. let view_editor = self.database_views.get_view_editor(&params.view_id).await?;
  171. view_editor.v_delete_sort(params).await?;
  172. Ok(())
  173. }
  174. pub async fn get_all_filters(&self, view_id: &str) -> RepeatedFilterPB {
  175. if let Ok(view_editor) = self.database_views.get_view_editor(view_id).await {
  176. view_editor.v_get_all_filters().await.into()
  177. } else {
  178. RepeatedFilterPB { items: vec![] }
  179. }
  180. }
  181. pub async fn get_filter(&self, view_id: &str, filter_id: &str) -> Option<Filter> {
  182. if let Ok(view_editor) = self.database_views.get_view_editor(view_id).await {
  183. Some(view_editor.v_get_filter(filter_id).await?)
  184. } else {
  185. None
  186. }
  187. }
  188. pub async fn get_all_sorts(&self, view_id: &str) -> RepeatedSortPB {
  189. if let Ok(view_editor) = self.database_views.get_view_editor(view_id).await {
  190. view_editor.v_get_all_sorts().await.into()
  191. } else {
  192. RepeatedSortPB { items: vec![] }
  193. }
  194. }
  195. pub async fn delete_all_sorts(&self, view_id: &str) {
  196. if let Ok(view_editor) = self.database_views.get_view_editor(view_id).await {
  197. let _ = view_editor.v_delete_all_sorts().await;
  198. }
  199. }
  200. /// Returns a list of fields of the view.
  201. /// If `field_ids` is not provided, all the fields will be returned in the order of the field that
  202. /// defined in the view. Otherwise, the fields will be returned in the order of the `field_ids`.
  203. pub fn get_fields(&self, view_id: &str, field_ids: Option<Vec<String>>) -> Vec<Field> {
  204. let database = self.database.lock();
  205. let field_ids = field_ids.unwrap_or_else(|| {
  206. database
  207. .fields
  208. .get_all_field_orders()
  209. .into_iter()
  210. .map(|field| field.id)
  211. .collect()
  212. });
  213. database.get_fields_in_view(view_id, Some(field_ids))
  214. }
  215. pub async fn update_field(&self, params: FieldChangesetParams) -> FlowyResult<()> {
  216. self
  217. .database
  218. .lock()
  219. .fields
  220. .update_field(&params.field_id, |update| {
  221. update
  222. .set_name_if_not_none(params.name)
  223. .set_width_at_if_not_none(params.width.map(|value| value as i64))
  224. .set_visibility_if_not_none(params.visibility);
  225. });
  226. self
  227. .notify_did_update_database_field(&params.field_id)
  228. .await?;
  229. Ok(())
  230. }
  231. pub async fn delete_field(&self, field_id: &str) -> FlowyResult<()> {
  232. let is_primary = self
  233. .database
  234. .lock()
  235. .fields
  236. .get_field(field_id)
  237. .map(|field| field.is_primary)
  238. .unwrap_or(false);
  239. if is_primary {
  240. return Err(FlowyError::new(
  241. ErrorCode::Internal,
  242. "Can not delete primary field",
  243. ));
  244. }
  245. let database_id = {
  246. let database = self.database.lock();
  247. database.delete_field(field_id);
  248. database.get_database_id()
  249. };
  250. let notified_changeset =
  251. DatabaseFieldChangesetPB::delete(&database_id, vec![FieldIdPB::from(field_id)]);
  252. self.notify_did_update_database(notified_changeset).await?;
  253. Ok(())
  254. }
  255. pub async fn update_field_type_option(
  256. &self,
  257. view_id: &str,
  258. field_id: &str,
  259. type_option_data: TypeOptionData,
  260. old_field: Field,
  261. ) -> FlowyResult<()> {
  262. let field_type = FieldType::from(old_field.field_type);
  263. self
  264. .database
  265. .lock()
  266. .fields
  267. .update_field(field_id, |update| {
  268. if old_field.is_primary {
  269. tracing::warn!("Cannot update primary field type");
  270. } else {
  271. update.update_type_options(|type_options_update| {
  272. type_options_update.insert(&field_type.to_string(), type_option_data);
  273. });
  274. }
  275. });
  276. self
  277. .database_views
  278. .did_update_field_type_option(view_id, field_id, &old_field)
  279. .await?;
  280. let _ = self.notify_did_update_database_field(field_id).await;
  281. Ok(())
  282. }
  283. pub async fn switch_to_field_type(
  284. &self,
  285. field_id: &str,
  286. new_field_type: &FieldType,
  287. ) -> FlowyResult<()> {
  288. let field = self.database.lock().fields.get_field(field_id);
  289. match field {
  290. None => {},
  291. Some(field) => {
  292. if field.is_primary {
  293. return Err(FlowyError::new(
  294. ErrorCode::Internal,
  295. "Can not update primary field's field type",
  296. ));
  297. }
  298. let old_field_type = FieldType::from(field.field_type);
  299. let old_type_option = field.get_any_type_option(old_field_type.clone());
  300. let new_type_option = field
  301. .get_any_type_option(new_field_type)
  302. .unwrap_or_else(|| default_type_option_data_from_type(new_field_type));
  303. let transformed_type_option = transform_type_option(
  304. &new_type_option,
  305. new_field_type,
  306. old_type_option,
  307. old_field_type,
  308. );
  309. self
  310. .database
  311. .lock()
  312. .fields
  313. .update_field(field_id, |update| {
  314. update
  315. .set_field_type(new_field_type.into())
  316. .set_type_option(new_field_type.into(), Some(transformed_type_option));
  317. });
  318. },
  319. }
  320. self.notify_did_update_database_field(field_id).await?;
  321. Ok(())
  322. }
  323. pub async fn duplicate_field(&self, view_id: &str, field_id: &str) -> FlowyResult<()> {
  324. let is_primary = self
  325. .database
  326. .lock()
  327. .fields
  328. .get_field(field_id)
  329. .map(|field| field.is_primary)
  330. .unwrap_or(false);
  331. if is_primary {
  332. return Err(FlowyError::new(
  333. ErrorCode::Internal,
  334. "Can not duplicate primary field",
  335. ));
  336. }
  337. let value = self
  338. .database
  339. .lock()
  340. .duplicate_field(view_id, field_id, |field| format!("{} (copy)", field.name));
  341. if let Some((index, duplicated_field)) = value {
  342. let _ = self
  343. .notify_did_insert_database_field(duplicated_field, index)
  344. .await;
  345. }
  346. Ok(())
  347. }
  348. // consider returning a result. But most of the time, it should be fine to just ignore the error.
  349. pub async fn duplicate_row(&self, view_id: &str, group_id: Option<String>, row_id: &RowId) {
  350. let params = self.database.lock().duplicate_row(row_id);
  351. match params {
  352. None => {
  353. tracing::warn!("Failed to duplicate row: {}", row_id);
  354. },
  355. Some(params) => {
  356. let _ = self.create_row(view_id, group_id, params).await;
  357. },
  358. }
  359. }
  360. pub async fn move_row(&self, view_id: &str, from: RowId, to: RowId) {
  361. let database = self.database.lock();
  362. if let (Some(row_meta), Some(from_index), Some(to_index)) = (
  363. database.get_row_meta(&from),
  364. database.index_of_row(view_id, &from),
  365. database.index_of_row(view_id, &to),
  366. ) {
  367. database.views.update_database_view(view_id, |view| {
  368. view.move_row_order(from_index as u32, to_index as u32);
  369. });
  370. drop(database);
  371. let delete_row_id = from.into_inner();
  372. let insert_row = InsertedRowPB::new(RowMetaPB::from(&row_meta)).with_index(to_index as i32);
  373. let changes =
  374. RowsChangePB::from_move(view_id.to_string(), vec![delete_row_id], vec![insert_row]);
  375. send_notification(view_id, DatabaseNotification::DidUpdateViewRows)
  376. .payload(changes)
  377. .send();
  378. }
  379. }
  380. pub async fn create_row(
  381. &self,
  382. view_id: &str,
  383. group_id: Option<String>,
  384. mut params: CreateRowParams,
  385. ) -> FlowyResult<Option<RowDetail>> {
  386. for view in self.database_views.editors().await {
  387. view.v_will_create_row(&mut params.cells, &group_id).await;
  388. }
  389. let result = self.database.lock().create_row_in_view(view_id, params);
  390. if let Some((index, row_order)) = result {
  391. tracing::trace!("create row: {:?} at {}", row_order, index);
  392. let row = self.database.lock().get_row(&row_order.id);
  393. let row_meta = self.database.lock().get_row_meta(&row_order.id);
  394. if let (Some(row), Some(meta)) = (row, row_meta) {
  395. let row_detail = RowDetail { row, meta };
  396. for view in self.database_views.editors().await {
  397. view.v_did_create_row(&row_detail, &group_id, index).await;
  398. }
  399. return Ok(Some(row_detail));
  400. }
  401. }
  402. Ok(None)
  403. }
  404. pub async fn get_field_type_option_data(&self, field_id: &str) -> Option<(Field, Bytes)> {
  405. let field = self.database.lock().fields.get_field(field_id);
  406. field.map(|field| {
  407. let field_type = FieldType::from(field.field_type);
  408. let type_option = field
  409. .get_any_type_option(field_type.clone())
  410. .unwrap_or_else(|| default_type_option_data_from_type(&field_type));
  411. (field, type_option_to_pb(type_option, &field_type))
  412. })
  413. }
  414. pub async fn create_field_with_type_option(
  415. &self,
  416. view_id: &str,
  417. field_type: &FieldType,
  418. type_option_data: Option<Vec<u8>>,
  419. ) -> (Field, Bytes) {
  420. let name = field_type.default_name();
  421. let type_option_data = match type_option_data {
  422. None => default_type_option_data_from_type(field_type),
  423. Some(type_option_data) => type_option_data_from_pb_or_default(type_option_data, field_type),
  424. };
  425. let (index, field) =
  426. self
  427. .database
  428. .lock()
  429. .create_field_with_mut(view_id, name, field_type.into(), |field| {
  430. field
  431. .type_options
  432. .insert(field_type.to_string(), type_option_data.clone());
  433. });
  434. let _ = self
  435. .notify_did_insert_database_field(field.clone(), index)
  436. .await;
  437. (field, type_option_to_pb(type_option_data, field_type))
  438. }
  439. pub async fn move_field(
  440. &self,
  441. view_id: &str,
  442. field_id: &str,
  443. from: i32,
  444. to: i32,
  445. ) -> FlowyResult<()> {
  446. let (database_id, field) = {
  447. let database = self.database.lock();
  448. database.views.update_database_view(view_id, |view_update| {
  449. view_update.move_field_order(from as u32, to as u32);
  450. });
  451. let field = database.fields.get_field(field_id);
  452. let database_id = database.get_database_id();
  453. (database_id, field)
  454. };
  455. if let Some(field) = field {
  456. let delete_field = FieldIdPB::from(field_id);
  457. let insert_field = IndexFieldPB::from_field(field, to as usize);
  458. let notified_changeset = DatabaseFieldChangesetPB {
  459. view_id: database_id,
  460. inserted_fields: vec![insert_field],
  461. deleted_fields: vec![delete_field],
  462. updated_fields: vec![],
  463. };
  464. self.notify_did_update_database(notified_changeset).await?;
  465. }
  466. Ok(())
  467. }
  468. pub async fn get_rows(&self, view_id: &str) -> FlowyResult<Vec<Arc<RowDetail>>> {
  469. let view_editor = self.database_views.get_view_editor(view_id).await?;
  470. Ok(view_editor.v_get_rows().await)
  471. }
  472. pub fn get_row(&self, view_id: &str, row_id: &RowId) -> Option<Row> {
  473. if self.database.lock().views.is_row_exist(view_id, row_id) {
  474. self.database.lock().get_row(row_id)
  475. } else {
  476. None
  477. }
  478. }
  479. pub fn get_row_meta(&self, view_id: &str, row_id: &RowId) -> Option<RowMetaPB> {
  480. if self.database.lock().views.is_row_exist(view_id, row_id) {
  481. let row_meta = self.database.lock().get_row_meta(row_id)?;
  482. Some(RowMetaPB {
  483. id: row_id.clone().into_inner(),
  484. document_id: row_meta.document_id,
  485. icon: row_meta.icon_url,
  486. cover: row_meta.cover_url,
  487. })
  488. } else {
  489. tracing::warn!("the row:{} is exist in view:{}", row_id.as_str(), view_id);
  490. None
  491. }
  492. }
  493. pub fn get_row_detail(&self, view_id: &str, row_id: &RowId) -> Option<RowDetail> {
  494. if self.database.lock().views.is_row_exist(view_id, row_id) {
  495. let meta = self.database.lock().get_row_meta(row_id)?;
  496. let row = self.database.lock().get_row(row_id)?;
  497. Some(RowDetail { row, meta })
  498. } else {
  499. tracing::warn!("the row:{} is exist in view:{}", row_id.as_str(), view_id);
  500. None
  501. }
  502. }
  503. pub async fn delete_row(&self, row_id: &RowId) {
  504. let row = self.database.lock().remove_row(row_id);
  505. if let Some(row) = row {
  506. tracing::trace!("Did delete row:{:?}", row);
  507. for view in self.database_views.editors().await {
  508. view.v_did_delete_row(&row).await;
  509. }
  510. }
  511. }
  512. #[tracing::instrument(level = "trace", skip_all)]
  513. pub async fn update_row_meta(&self, row_id: &RowId, changeset: UpdateRowMetaParams) {
  514. self.database.lock().update_row_meta(row_id, |meta_update| {
  515. meta_update
  516. .insert_cover_if_not_none(changeset.cover_url)
  517. .insert_icon_if_not_none(changeset.icon_url);
  518. });
  519. // Use the temporary row meta to get rid of the lock that not implement the `Send` or 'Sync' trait.
  520. let row_meta = self.database.lock().get_row_meta(row_id);
  521. if let Some(row_meta) = row_meta {
  522. for view in self.database_views.editors().await {
  523. view.v_did_update_row_meta(row_id, &row_meta).await;
  524. }
  525. // Notifies the client that the row meta has been updated.
  526. send_notification(row_id.as_str(), DatabaseNotification::DidUpdateRowMeta)
  527. .payload(RowMetaPB::from(&row_meta))
  528. .send();
  529. }
  530. }
  531. pub async fn get_cell(&self, field_id: &str, row_id: &RowId) -> Option<Cell> {
  532. let database = self.database.lock();
  533. let field = database.fields.get_field(field_id)?;
  534. let field_type = FieldType::from(field.field_type);
  535. // If the cell data is referenced, return the reference data. Otherwise, return an empty cell.
  536. match field_type {
  537. FieldType::LastEditedTime | FieldType::CreatedTime => database
  538. .get_row(row_id)
  539. .map(|row| {
  540. if field_type.is_created_time() {
  541. DateCellData::new(row.created_at, true)
  542. } else {
  543. DateCellData::new(row.modified_at, true)
  544. }
  545. })
  546. .map(Cell::from),
  547. _ => database.get_cell(field_id, row_id).cell,
  548. }
  549. }
  550. pub async fn get_cell_pb(&self, field_id: &str, row_id: &RowId) -> Option<CellPB> {
  551. let (field, cell) = {
  552. let database = self.database.lock();
  553. let field = database.fields.get_field(field_id)?;
  554. let field_type = FieldType::from(field.field_type);
  555. // If the cell data is referenced, return the reference data. Otherwise, return an empty cell.
  556. let cell = match field_type {
  557. FieldType::LastEditedTime | FieldType::CreatedTime => database
  558. .get_row(row_id)
  559. .map(|row| {
  560. if field_type.is_created_time() {
  561. DateCellData::new(row.created_at, true)
  562. } else {
  563. DateCellData::new(row.modified_at, true)
  564. }
  565. })
  566. .map(Cell::from),
  567. _ => database.get_cell(field_id, row_id).cell,
  568. }?;
  569. (field, cell)
  570. };
  571. let field_type = FieldType::from(field.field_type);
  572. let cell_bytes = get_cell_protobuf(&cell, &field, Some(self.cell_cache.clone()));
  573. Some(CellPB {
  574. field_id: field_id.to_string(),
  575. row_id: row_id.clone().into(),
  576. data: cell_bytes.to_vec(),
  577. field_type: Some(field_type),
  578. })
  579. }
  580. pub async fn get_cells_for_field(&self, view_id: &str, field_id: &str) -> Vec<RowCell> {
  581. let database = self.database.lock();
  582. if let Some(field) = database.fields.get_field(field_id) {
  583. let field_type = FieldType::from(field.field_type);
  584. match field_type {
  585. FieldType::LastEditedTime | FieldType::CreatedTime => database
  586. .get_rows_for_view(view_id)
  587. .into_iter()
  588. .map(|row| {
  589. let data = if field_type.is_created_time() {
  590. DateCellData::new(row.created_at, true)
  591. } else {
  592. DateCellData::new(row.modified_at, true)
  593. };
  594. RowCell {
  595. row_id: row.id,
  596. cell: Some(Cell::from(data)),
  597. }
  598. })
  599. .collect(),
  600. _ => database.get_cells_for_field(view_id, field_id),
  601. }
  602. } else {
  603. vec![]
  604. }
  605. }
  606. pub async fn update_cell_with_changeset<T>(
  607. &self,
  608. view_id: &str,
  609. row_id: RowId,
  610. field_id: &str,
  611. cell_changeset: T,
  612. ) -> FlowyResult<()>
  613. where
  614. T: ToCellChangeset,
  615. {
  616. let (field, cell) = {
  617. let database = self.database.lock();
  618. let field = match database.fields.get_field(field_id) {
  619. Some(field) => Ok(field),
  620. None => {
  621. let msg = format!("Field with id:{} not found", &field_id);
  622. Err(FlowyError::internal().context(msg))
  623. },
  624. }?;
  625. (field, database.get_cell(field_id, &row_id).cell)
  626. };
  627. let new_cell =
  628. apply_cell_changeset(cell_changeset, cell, &field, Some(self.cell_cache.clone()))?;
  629. self.update_cell(view_id, row_id, field_id, new_cell).await
  630. }
  631. /// Update a cell in the database.
  632. /// This will notify all views that the cell has been updated.
  633. pub async fn update_cell(
  634. &self,
  635. view_id: &str,
  636. row_id: RowId,
  637. field_id: &str,
  638. new_cell: Cell,
  639. ) -> FlowyResult<()> {
  640. // Get the old row before updating the cell. It would be better to get the old cell
  641. let old_row = { self.get_row_detail(view_id, &row_id) };
  642. // Get all auto updated fields. It will be used to notify the frontend
  643. // that the fields have been updated.
  644. let auto_updated_fields = self.get_auto_updated_fields(view_id);
  645. self.database.lock().update_row(&row_id, |row_update| {
  646. row_update.update_cells(|cell_update| {
  647. cell_update.insert(field_id, new_cell);
  648. });
  649. });
  650. let option_row = self.get_row_detail(view_id, &row_id);
  651. if let Some(new_row_detail) = option_row {
  652. let updated_row =
  653. UpdatedRow::new(&new_row_detail.row.id).with_field_ids(vec![field_id.to_string()]);
  654. let changes = RowsChangePB::from_update(view_id.to_string(), updated_row.into());
  655. send_notification(view_id, DatabaseNotification::DidUpdateViewRows)
  656. .payload(changes)
  657. .send();
  658. for view in self.database_views.editors().await {
  659. view
  660. .v_did_update_row(&old_row, &new_row_detail, field_id)
  661. .await;
  662. }
  663. }
  664. // Collect all the updated field's id. Notify the frontend that all of them have been updated.
  665. let mut auto_updated_field_ids = auto_updated_fields
  666. .into_iter()
  667. .map(|field| field.id)
  668. .collect::<Vec<String>>();
  669. auto_updated_field_ids.push(field_id.to_string());
  670. let changeset = auto_updated_field_ids
  671. .into_iter()
  672. .map(|field_id| CellChangesetNotifyPB {
  673. view_id: view_id.to_string(),
  674. row_id: row_id.clone().into_inner(),
  675. field_id,
  676. })
  677. .collect();
  678. notify_did_update_cell(changeset).await;
  679. Ok(())
  680. }
  681. /// Just create an option for the field's type option. The option is save to the database.
  682. pub async fn create_select_option(
  683. &self,
  684. field_id: &str,
  685. option_name: String,
  686. ) -> Option<SelectOptionPB> {
  687. let field = self.database.lock().fields.get_field(field_id)?;
  688. let type_option = select_type_option_from_field(&field).ok()?;
  689. let select_option = type_option.create_option(&option_name);
  690. Some(SelectOptionPB::from(select_option))
  691. }
  692. /// Insert the options into the field's type option and update the cell content with the new options.
  693. /// Only used for single select and multiple select.
  694. pub async fn insert_select_options(
  695. &self,
  696. view_id: &str,
  697. field_id: &str,
  698. row_id: RowId,
  699. options: Vec<SelectOptionPB>,
  700. ) -> FlowyResult<()> {
  701. let field = self
  702. .database
  703. .lock()
  704. .fields
  705. .get_field(field_id)
  706. .ok_or_else(|| {
  707. FlowyError::record_not_found().context(format!("Field with id:{} not found", &field_id))
  708. })?;
  709. debug_assert!(FieldType::from(field.field_type).is_select_option());
  710. let mut type_option = select_type_option_from_field(&field)?;
  711. let cell_changeset = SelectOptionCellChangeset {
  712. insert_option_ids: options.iter().map(|option| option.id.clone()).collect(),
  713. ..Default::default()
  714. };
  715. options
  716. .into_iter()
  717. .for_each(|option| type_option.insert_option(option.into()));
  718. // Update the field's type option
  719. self
  720. .update_field_type_option(view_id, field_id, type_option.to_type_option_data(), field)
  721. .await?;
  722. // Insert the options into the cell
  723. self
  724. .update_cell_with_changeset(view_id, row_id, field_id, cell_changeset)
  725. .await?;
  726. Ok(())
  727. }
  728. pub async fn delete_select_options(
  729. &self,
  730. view_id: &str,
  731. field_id: &str,
  732. row_id: RowId,
  733. options: Vec<SelectOptionPB>,
  734. ) -> FlowyResult<()> {
  735. let field = match self.database.lock().fields.get_field(field_id) {
  736. Some(field) => Ok(field),
  737. None => {
  738. let msg = format!("Field with id:{} not found", &field_id);
  739. Err(FlowyError::internal().context(msg))
  740. },
  741. }?;
  742. let mut type_option = select_type_option_from_field(&field)?;
  743. let cell_changeset = SelectOptionCellChangeset {
  744. delete_option_ids: options.iter().map(|option| option.id.clone()).collect(),
  745. ..Default::default()
  746. };
  747. for option in options {
  748. type_option.delete_option(option.into());
  749. }
  750. self
  751. .database
  752. .lock()
  753. .fields
  754. .update_field(field_id, |update| {
  755. update.set_type_option(field.field_type, Some(type_option.to_type_option_data()));
  756. });
  757. self
  758. .update_cell_with_changeset(view_id, row_id, field_id, cell_changeset)
  759. .await?;
  760. Ok(())
  761. }
  762. pub async fn get_select_options(&self, row_id: RowId, field_id: &str) -> SelectOptionCellDataPB {
  763. let field = self.database.lock().fields.get_field(field_id);
  764. match field {
  765. None => SelectOptionCellDataPB::default(),
  766. Some(field) => {
  767. let cell = self.database.lock().get_cell(field_id, &row_id).cell;
  768. let ids = match cell {
  769. None => SelectOptionIds::new(),
  770. Some(cell) => SelectOptionIds::from(&cell),
  771. };
  772. match select_type_option_from_field(&field) {
  773. Ok(type_option) => type_option.get_selected_options(ids).into(),
  774. Err(_) => SelectOptionCellDataPB::default(),
  775. }
  776. },
  777. }
  778. }
  779. pub async fn get_checklist_option(&self, row_id: RowId, field_id: &str) -> ChecklistCellDataPB {
  780. let row_cell = self.database.lock().get_cell(field_id, &row_id);
  781. let cell_data = match row_cell.cell {
  782. None => ChecklistCellData::default(),
  783. Some(cell) => ChecklistCellData::from(&cell),
  784. };
  785. ChecklistCellDataPB::from(cell_data)
  786. }
  787. pub async fn set_checklist_options(
  788. &self,
  789. view_id: &str,
  790. row_id: RowId,
  791. field_id: &str,
  792. changeset: ChecklistCellChangeset,
  793. ) -> FlowyResult<()> {
  794. let field = self
  795. .database
  796. .lock()
  797. .fields
  798. .get_field(field_id)
  799. .ok_or_else(|| {
  800. FlowyError::record_not_found().context(format!("Field with id:{} not found", &field_id))
  801. })?;
  802. debug_assert!(FieldType::from(field.field_type).is_checklist());
  803. self
  804. .update_cell_with_changeset(view_id, row_id, field_id, changeset)
  805. .await?;
  806. Ok(())
  807. }
  808. #[tracing::instrument(level = "trace", skip_all, err)]
  809. pub async fn load_groups(&self, view_id: &str) -> FlowyResult<RepeatedGroupPB> {
  810. let view = self.database_views.get_view_editor(view_id).await?;
  811. let groups = view.v_load_groups().await.unwrap_or_default();
  812. Ok(RepeatedGroupPB { items: groups })
  813. }
  814. #[tracing::instrument(level = "trace", skip_all, err)]
  815. pub async fn get_group(&self, view_id: &str, group_id: &str) -> FlowyResult<GroupPB> {
  816. let view = self.database_views.get_view_editor(view_id).await?;
  817. let group = view.v_get_group(group_id).await?;
  818. Ok(group)
  819. }
  820. #[tracing::instrument(level = "trace", skip_all, err)]
  821. pub async fn move_group(
  822. &self,
  823. view_id: &str,
  824. from_group: &str,
  825. to_group: &str,
  826. ) -> FlowyResult<()> {
  827. // Do nothing if the group is the same
  828. if from_group == to_group {
  829. return Ok(());
  830. }
  831. let view = self.database_views.get_view_editor(view_id).await?;
  832. view.v_move_group(from_group, to_group).await?;
  833. Ok(())
  834. }
  835. #[tracing::instrument(level = "trace", skip_all, err)]
  836. pub async fn move_group_row(
  837. &self,
  838. view_id: &str,
  839. to_group: &str,
  840. from_row: RowId,
  841. to_row: Option<RowId>,
  842. ) -> FlowyResult<()> {
  843. let row_detail = self.get_row_detail(view_id, &from_row);
  844. match row_detail {
  845. None => {
  846. tracing::warn!(
  847. "Move row between group failed, can not find the row:{}",
  848. from_row
  849. )
  850. },
  851. Some(row_detail) => {
  852. let mut row_changeset = RowChangeset::new(row_detail.row.id.clone());
  853. let view = self.database_views.get_view_editor(view_id).await?;
  854. view
  855. .v_move_group_row(&row_detail, &mut row_changeset, to_group, to_row)
  856. .await;
  857. tracing::trace!("Row data changed: {:?}", row_changeset);
  858. self.database.lock().update_row(&row_detail.row.id, |row| {
  859. row.set_cells(Cells::from(row_changeset.cell_by_field_id.clone()));
  860. });
  861. let cell_changesets = cell_changesets_from_cell_by_field_id(
  862. view_id,
  863. row_changeset.row_id,
  864. row_changeset.cell_by_field_id,
  865. );
  866. notify_did_update_cell(cell_changesets).await;
  867. },
  868. }
  869. Ok(())
  870. }
  871. pub async fn group_by_field(&self, view_id: &str, field_id: &str) -> FlowyResult<()> {
  872. let view = self.database_views.get_view_editor(view_id).await?;
  873. view.v_grouping_by_field(field_id).await?;
  874. Ok(())
  875. }
  876. pub async fn set_layout_setting(&self, view_id: &str, layout_setting: LayoutSettingParams) {
  877. tracing::trace!("set_layout_setting: {:?}", layout_setting);
  878. if let Ok(view) = self.database_views.get_view_editor(view_id).await {
  879. let _ = view.v_set_layout_settings(layout_setting).await;
  880. };
  881. }
  882. pub async fn get_layout_setting(
  883. &self,
  884. view_id: &str,
  885. layout_ty: DatabaseLayout,
  886. ) -> Option<LayoutSettingParams> {
  887. let view = self.database_views.get_view_editor(view_id).await.ok()?;
  888. let layout_setting = view.v_get_layout_settings(&layout_ty).await;
  889. Some(layout_setting)
  890. }
  891. #[tracing::instrument(level = "trace", skip_all)]
  892. pub async fn get_all_calendar_events(&self, view_id: &str) -> Vec<CalendarEventPB> {
  893. match self.database_views.get_view_editor(view_id).await {
  894. Ok(view) => view.v_get_all_calendar_events().await.unwrap_or_default(),
  895. Err(_) => {
  896. tracing::warn!("Can not find the view: {}", view_id);
  897. vec![]
  898. },
  899. }
  900. }
  901. #[tracing::instrument(level = "trace", skip_all)]
  902. pub async fn get_all_no_date_calendar_events(
  903. &self,
  904. view_id: &str,
  905. ) -> FlowyResult<Vec<NoDateCalendarEventPB>> {
  906. let _database_view = self.database_views.get_view_editor(view_id).await?;
  907. todo!()
  908. }
  909. #[tracing::instrument(level = "trace", skip_all)]
  910. pub async fn get_calendar_event(&self, view_id: &str, row_id: RowId) -> Option<CalendarEventPB> {
  911. let view = self.database_views.get_view_editor(view_id).await.ok()?;
  912. view.v_get_calendar_event(row_id).await
  913. }
  914. #[tracing::instrument(level = "trace", skip_all, err)]
  915. async fn notify_did_insert_database_field(&self, field: Field, index: usize) -> FlowyResult<()> {
  916. let database_id = self.database.lock().get_database_id();
  917. let index_field = IndexFieldPB::from_field(field, index);
  918. let notified_changeset = DatabaseFieldChangesetPB::insert(&database_id, vec![index_field]);
  919. let _ = self.notify_did_update_database(notified_changeset).await;
  920. Ok(())
  921. }
  922. #[tracing::instrument(level = "trace", skip_all, err)]
  923. async fn notify_did_update_database_field(&self, field_id: &str) -> FlowyResult<()> {
  924. let (database_id, field) = {
  925. let database = self.database.lock();
  926. let database_id = database.get_database_id();
  927. let field = database.fields.get_field(field_id);
  928. (database_id, field)
  929. };
  930. if let Some(field) = field {
  931. let updated_field = FieldPB::from(field);
  932. let notified_changeset =
  933. DatabaseFieldChangesetPB::update(&database_id, vec![updated_field.clone()]);
  934. self.notify_did_update_database(notified_changeset).await?;
  935. send_notification(field_id, DatabaseNotification::DidUpdateField)
  936. .payload(updated_field)
  937. .send();
  938. }
  939. Ok(())
  940. }
  941. async fn notify_did_update_database(
  942. &self,
  943. changeset: DatabaseFieldChangesetPB,
  944. ) -> FlowyResult<()> {
  945. let views = self.database.lock().get_all_views_description();
  946. for view in views {
  947. send_notification(&view.id, DatabaseNotification::DidUpdateFields)
  948. .payload(changeset.clone())
  949. .send();
  950. }
  951. Ok(())
  952. }
  953. pub async fn get_database_view_setting(
  954. &self,
  955. view_id: &str,
  956. ) -> FlowyResult<DatabaseViewSettingPB> {
  957. let view = self
  958. .database
  959. .lock()
  960. .get_view(view_id)
  961. .ok_or_else(|| FlowyError::record_not_found().context("Can't find the database view"))?;
  962. Ok(database_view_setting_pb_from_view(view))
  963. }
  964. pub async fn get_database_data(&self, view_id: &str) -> FlowyResult<DatabasePB> {
  965. let database_view = self.database_views.get_view_editor(view_id).await?;
  966. let view = database_view
  967. .get_view()
  968. .await
  969. .ok_or_else(FlowyError::record_not_found)?;
  970. let rows = database_view.v_get_rows().await;
  971. let (database_id, fields, is_linked) = {
  972. let database = self.database.lock();
  973. let database_id = database.get_database_id();
  974. let fields = database
  975. .fields
  976. .get_all_field_orders()
  977. .into_iter()
  978. .map(FieldIdPB::from)
  979. .collect();
  980. let is_linked = database.is_inline_view(view_id);
  981. (database_id, fields, is_linked)
  982. };
  983. let rows = rows
  984. .into_iter()
  985. .map(|row_detail| RowMetaPB::from(&row_detail.meta))
  986. .collect::<Vec<RowMetaPB>>();
  987. Ok(DatabasePB {
  988. id: database_id,
  989. fields,
  990. rows,
  991. layout_type: view.layout.into(),
  992. is_linked,
  993. })
  994. }
  995. pub async fn export_csv(&self, style: CSVFormat) -> FlowyResult<String> {
  996. let database = self.database.clone();
  997. let csv = tokio::task::spawn_blocking(move || {
  998. let database_guard = database.lock();
  999. let csv = CSVExport.export_database(&database_guard, style)?;
  1000. Ok::<String, FlowyError>(csv)
  1001. })
  1002. .await
  1003. .map_err(internal_error)??;
  1004. Ok(csv)
  1005. }
  1006. fn get_auto_updated_fields(&self, view_id: &str) -> Vec<Field> {
  1007. self
  1008. .database
  1009. .lock()
  1010. .get_fields_in_view(view_id, None)
  1011. .into_iter()
  1012. .filter(|f| FieldType::from(f.field_type).is_auto_update())
  1013. .collect::<Vec<Field>>()
  1014. }
  1015. /// Only expose this method for testing
  1016. #[cfg(debug_assertions)]
  1017. pub fn get_mutex_database(&self) -> &MutexDatabase {
  1018. &self.database
  1019. }
  1020. }
  1021. pub(crate) async fn notify_did_update_cell(changesets: Vec<CellChangesetNotifyPB>) {
  1022. for changeset in changesets {
  1023. let id = format!("{}:{}", changeset.row_id, changeset.field_id);
  1024. send_notification(&id, DatabaseNotification::DidUpdateCell).send();
  1025. }
  1026. }
  1027. fn cell_changesets_from_cell_by_field_id(
  1028. view_id: &str,
  1029. row_id: RowId,
  1030. cell_by_field_id: HashMap<String, Cell>,
  1031. ) -> Vec<CellChangesetNotifyPB> {
  1032. let row_id = row_id.into_inner();
  1033. cell_by_field_id
  1034. .into_keys()
  1035. .map(|field_id| CellChangesetNotifyPB {
  1036. view_id: view_id.to_string(),
  1037. row_id: row_id.clone(),
  1038. field_id,
  1039. })
  1040. .collect()
  1041. }
  1042. #[derive(Clone)]
  1043. pub struct MutexDatabase(Arc<Mutex<Arc<InnerDatabase>>>);
  1044. impl MutexDatabase {
  1045. pub(crate) fn new(database: Arc<InnerDatabase>) -> Self {
  1046. Self(Arc::new(Mutex::new(database)))
  1047. }
  1048. }
  1049. impl Deref for MutexDatabase {
  1050. type Target = Arc<Mutex<Arc<InnerDatabase>>>;
  1051. fn deref(&self) -> &Self::Target {
  1052. &self.0
  1053. }
  1054. }
  1055. unsafe impl Sync for MutexDatabase {}
  1056. unsafe impl Send for MutexDatabase {}
  1057. struct DatabaseViewDataImpl {
  1058. database: MutexDatabase,
  1059. task_scheduler: Arc<RwLock<TaskDispatcher>>,
  1060. cell_cache: CellCache,
  1061. }
  1062. impl DatabaseViewData for DatabaseViewDataImpl {
  1063. fn get_database(&self) -> Arc<InnerDatabase> {
  1064. self.database.lock().clone()
  1065. }
  1066. fn get_view(&self, view_id: &str) -> Fut<Option<DatabaseView>> {
  1067. let view = self.database.lock().get_view(view_id);
  1068. to_fut(async move { view })
  1069. }
  1070. fn get_fields(&self, view_id: &str, field_ids: Option<Vec<String>>) -> Fut<Vec<Arc<Field>>> {
  1071. let fields = self.database.lock().get_fields_in_view(view_id, field_ids);
  1072. to_fut(async move { fields.into_iter().map(Arc::new).collect() })
  1073. }
  1074. fn get_field(&self, field_id: &str) -> Fut<Option<Arc<Field>>> {
  1075. let field = self
  1076. .database
  1077. .lock()
  1078. .fields
  1079. .get_field(field_id)
  1080. .map(Arc::new);
  1081. to_fut(async move { field })
  1082. }
  1083. fn create_field(
  1084. &self,
  1085. view_id: &str,
  1086. name: &str,
  1087. field_type: FieldType,
  1088. type_option_data: TypeOptionData,
  1089. ) -> Fut<Field> {
  1090. let (_, field) = self.database.lock().create_field_with_mut(
  1091. view_id,
  1092. name.to_string(),
  1093. field_type.clone().into(),
  1094. |field| {
  1095. field
  1096. .type_options
  1097. .insert(field_type.to_string(), type_option_data);
  1098. },
  1099. );
  1100. to_fut(async move { field })
  1101. }
  1102. fn get_primary_field(&self) -> Fut<Option<Arc<Field>>> {
  1103. let field = self
  1104. .database
  1105. .lock()
  1106. .fields
  1107. .get_primary_field()
  1108. .map(Arc::new);
  1109. to_fut(async move { field })
  1110. }
  1111. fn index_of_row(&self, view_id: &str, row_id: &RowId) -> Fut<Option<usize>> {
  1112. let index = self.database.lock().index_of_row(view_id, row_id);
  1113. to_fut(async move { index })
  1114. }
  1115. fn get_row(&self, view_id: &str, row_id: &RowId) -> Fut<Option<(usize, Arc<RowDetail>)>> {
  1116. let index = self.database.lock().index_of_row(view_id, row_id);
  1117. let row = self.database.lock().get_row(row_id);
  1118. let row_meta = self.database.lock().get_row_meta(row_id);
  1119. to_fut(async move {
  1120. match (index, row, row_meta) {
  1121. (Some(index), Some(row), Some(row_meta)) => {
  1122. let row_detail = RowDetail {
  1123. row,
  1124. meta: row_meta,
  1125. };
  1126. Some((index, Arc::new(row_detail)))
  1127. },
  1128. _ => None,
  1129. }
  1130. })
  1131. }
  1132. fn get_rows(&self, view_id: &str) -> Fut<Vec<Arc<RowDetail>>> {
  1133. let database = self.database.lock();
  1134. let rows = database.get_rows_for_view(view_id);
  1135. let row_details = rows
  1136. .into_iter()
  1137. .flat_map(|row| {
  1138. database
  1139. .get_row_meta(&row.id)
  1140. .map(|meta| RowDetail { row, meta })
  1141. })
  1142. .collect::<Vec<RowDetail>>();
  1143. to_fut(async move { row_details.into_iter().map(Arc::new).collect() })
  1144. }
  1145. fn get_cells_for_field(&self, view_id: &str, field_id: &str) -> Fut<Vec<Arc<RowCell>>> {
  1146. let cells = self.database.lock().get_cells_for_field(view_id, field_id);
  1147. to_fut(async move { cells.into_iter().map(Arc::new).collect() })
  1148. }
  1149. fn get_cell_in_row(&self, field_id: &str, row_id: &RowId) -> Fut<Arc<RowCell>> {
  1150. let cell = self.database.lock().get_cell(field_id, row_id);
  1151. to_fut(async move { Arc::new(cell) })
  1152. }
  1153. fn get_layout_for_view(&self, view_id: &str) -> DatabaseLayout {
  1154. self.database.lock().views.get_database_view_layout(view_id)
  1155. }
  1156. fn get_group_setting(&self, view_id: &str) -> Vec<GroupSetting> {
  1157. self.database.lock().get_all_group_setting(view_id)
  1158. }
  1159. fn insert_group_setting(&self, view_id: &str, setting: GroupSetting) {
  1160. self.database.lock().insert_group_setting(view_id, setting);
  1161. }
  1162. fn get_sort(&self, view_id: &str, sort_id: &str) -> Option<Sort> {
  1163. self.database.lock().get_sort::<Sort>(view_id, sort_id)
  1164. }
  1165. fn insert_sort(&self, view_id: &str, sort: Sort) {
  1166. self.database.lock().insert_sort(view_id, sort);
  1167. }
  1168. fn remove_sort(&self, view_id: &str, sort_id: &str) {
  1169. self.database.lock().remove_sort(view_id, sort_id);
  1170. }
  1171. fn get_all_sorts(&self, view_id: &str) -> Vec<Sort> {
  1172. self.database.lock().get_all_sorts::<Sort>(view_id)
  1173. }
  1174. fn remove_all_sorts(&self, view_id: &str) {
  1175. self.database.lock().remove_all_sorts(view_id);
  1176. }
  1177. fn get_all_filters(&self, view_id: &str) -> Vec<Arc<Filter>> {
  1178. self
  1179. .database
  1180. .lock()
  1181. .get_all_filters(view_id)
  1182. .into_iter()
  1183. .map(Arc::new)
  1184. .collect()
  1185. }
  1186. fn delete_filter(&self, view_id: &str, filter_id: &str) {
  1187. self.database.lock().remove_filter(view_id, filter_id);
  1188. }
  1189. fn insert_filter(&self, view_id: &str, filter: Filter) {
  1190. self.database.lock().insert_filter(view_id, filter);
  1191. }
  1192. fn get_filter(&self, view_id: &str, filter_id: &str) -> Option<Filter> {
  1193. self
  1194. .database
  1195. .lock()
  1196. .get_filter::<Filter>(view_id, filter_id)
  1197. }
  1198. fn get_filter_by_field_id(&self, view_id: &str, field_id: &str) -> Option<Filter> {
  1199. self
  1200. .database
  1201. .lock()
  1202. .get_filter_by_field_id::<Filter>(view_id, field_id)
  1203. }
  1204. fn get_layout_setting(&self, view_id: &str, layout_ty: &DatabaseLayout) -> Option<LayoutSetting> {
  1205. self.database.lock().get_layout_setting(view_id, layout_ty)
  1206. }
  1207. fn insert_layout_setting(
  1208. &self,
  1209. view_id: &str,
  1210. layout_ty: &DatabaseLayout,
  1211. layout_setting: LayoutSetting,
  1212. ) {
  1213. self
  1214. .database
  1215. .lock()
  1216. .insert_layout_setting(view_id, layout_ty, layout_setting);
  1217. }
  1218. fn get_layout_type(&self, view_id: &str) -> DatabaseLayout {
  1219. self.database.lock().views.get_database_view_layout(view_id)
  1220. }
  1221. fn update_layout_type(&self, view_id: &str, layout_type: &DatabaseLayout) {
  1222. self
  1223. .database
  1224. .lock()
  1225. .update_layout_type(view_id, layout_type);
  1226. }
  1227. fn get_task_scheduler(&self) -> Arc<RwLock<TaskDispatcher>> {
  1228. self.task_scheduler.clone()
  1229. }
  1230. fn get_type_option_cell_handler(
  1231. &self,
  1232. field: &Field,
  1233. field_type: &FieldType,
  1234. ) -> Option<Box<dyn TypeOptionCellDataHandler>> {
  1235. TypeOptionCellExt::new_with_cell_data_cache(field, Some(self.cell_cache.clone()))
  1236. .get_type_option_cell_data_handler(field_type)
  1237. }
  1238. }