Skip to content

Commit c8daa21

Browse files
authored
chore: duplicate view with or without embeded (#441)
* chore: duplicate view with or without embeded * chore: fmt
1 parent fa83ec5 commit c8daa21

File tree

6 files changed

+62
-11
lines changed

6 files changed

+62
-11
lines changed

collab/src/database/database.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1483,16 +1483,25 @@ impl Database {
14831483
self.body.fields.get_all_fields(&txn)
14841484
}
14851485

1486+
/// Collect full database data for duplication/import/export.
1487+
/// If `include_embedded` is false, embedded views are excluded.
14861488
pub async fn get_database_data(
14871489
&self,
14881490
chunk_size: usize,
14891491
auto_fetch: bool,
1492+
include_embedded: bool,
14901493
) -> Result<DatabaseData, CollabError> {
14911494
let txn = self.collab.transact();
14921495

14931496
let database_id = self.body.get_database_id(&txn)?;
14941497
let inline_view_id = self.body.get_inline_view_id(&txn);
1495-
let views = self.get_all_views(true);
1498+
let views = self
1499+
.body
1500+
.views
1501+
.get_all_views(&txn, include_embedded)
1502+
.into_iter()
1503+
.filter(|view| !view.is_inline)
1504+
.collect();
14961505
let fields = self.body.get_fields_in_view(&txn, &inline_view_id, None);
14971506
let rows_stream = self.get_all_rows(chunk_size, None, auto_fetch).await?;
14981507
let rows: Vec<Row> = rows_stream
@@ -1523,7 +1532,7 @@ impl Database {
15231532
}
15241533

15251534
pub async fn to_json_value(&self) -> Result<JsonValue, CollabError> {
1526-
let database_data = self.get_database_data(20, false).await?;
1535+
let database_data = self.get_database_data(20, false, false).await?;
15271536
Ok(serde_json::to_value(&database_data).unwrap())
15281537
}
15291538

collab/src/database/database_remapper.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ impl DatabaseCollabRemapper {
8787
body: database_body,
8888
collab_service,
8989
};
90-
let database_data = database.get_database_data(20, false).await?;
90+
let database_data = database.get_database_data(20, false, true).await?;
9191
Ok(database_data)
9292
}
9393

collab/src/database/entity.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -223,14 +223,14 @@ pub struct CreateDatabaseParams {
223223
}
224224

225225
impl CreateDatabaseParams {
226-
/// This function creates a converts a `CreateDatabaseParams` that can be used to create a new
227-
/// database with the same data inside the given `DatabaseData` struct containing all the
228-
/// data of a database. The internal `database_id`, the database views' `view_id`s and the rows'
229-
/// `row_id`s will all be regenerated.
226+
/// Convert a `DatabaseData` into `CreateDatabaseParams` for duplicating a database.
227+
/// The internal `database_id`, database views' `view_id`s, and rows' `row_id`s are regenerated.
228+
/// If `include_embedded` is false, embedded views are not duplicated.
230229
pub fn from_database_data(
231230
data: DatabaseData,
232231
database_view_id: DatabaseViewId,
233232
new_database_view_id: DatabaseViewId,
233+
include_embedded: bool,
234234
) -> Self {
235235
let database_id = gen_database_id();
236236
let timestamp = timestamp();
@@ -257,6 +257,7 @@ impl CreateDatabaseParams {
257257
let create_view_params = data
258258
.views
259259
.into_iter()
260+
.filter(|view| include_embedded || !view.embedded)
260261
.map(|view| CreateViewParams {
261262
database_id,
262263
view_id: if view.id == database_view_id {

collab/tests/database/database_test/view_test.rs

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use assert_json_diff::assert_json_eq;
55
use collab::core::collab::{CollabOptions, default_client_id};
66
use collab::core::origin::CollabOrigin;
77
use collab::database::database::{DatabaseBody, DatabaseData, gen_row_id};
8-
use collab::database::entity::CreateViewParams;
8+
use collab::database::entity::{CreateDatabaseParams, CreateViewParams};
99
use collab::database::fields::Field;
1010
use collab::database::rows::{CreateRowParams, Row};
1111
use collab::database::views::{DatabaseLayout, LayoutSetting, OrderObjectPosition};
@@ -249,11 +249,52 @@ async fn duplicate_database_view_test() {
249249
assert_eq!(view.database_id, duplicated_view.database_id);
250250
}
251251

252+
#[tokio::test]
253+
async fn duplicate_database_excludes_embedded_views_test() {
254+
let database_id = uuid::Uuid::new_v4();
255+
let mut database_test = create_database_with_default_data(1, &database_id.to_string()).await;
256+
257+
let embedded_view_id = Uuid::new_v4();
258+
database_test
259+
.create_linked_view(CreateViewParams {
260+
database_id,
261+
view_id: embedded_view_id,
262+
name: "embedded view".to_string(),
263+
embedded: true,
264+
..Default::default()
265+
})
266+
.unwrap();
267+
268+
let data = database_test
269+
.get_database_data(20, false, true)
270+
.await
271+
.unwrap();
272+
273+
let non_embedded_view_id = data.views.iter().find(|v| !v.embedded).unwrap().id;
274+
275+
let params_without_embedded = CreateDatabaseParams::from_database_data(
276+
data.clone(),
277+
non_embedded_view_id,
278+
Uuid::new_v4(),
279+
false,
280+
);
281+
assert_eq!(params_without_embedded.views.len(), 1);
282+
assert!(params_without_embedded.views.iter().all(|v| !v.embedded));
283+
284+
let params_with_embedded =
285+
CreateDatabaseParams::from_database_data(data, non_embedded_view_id, Uuid::new_v4(), true);
286+
assert_eq!(params_with_embedded.views.len(), 2);
287+
assert!(params_with_embedded.views.iter().any(|v| v.embedded));
288+
}
289+
252290
#[tokio::test]
253291
async fn database_data_serde_test() {
254292
let database_id = uuid::Uuid::new_v4();
255293
let database_test = create_database_with_default_data(1, &database_id.to_string()).await;
256-
let database_data = database_test.get_database_data(20, false).await.unwrap();
294+
let database_data = database_test
295+
.get_database_data(20, false, false)
296+
.await
297+
.unwrap();
257298

258299
let json = database_data.to_json().unwrap();
259300
let database_data2 = DatabaseData::from_json(&json).unwrap();

collab/tests/importer/workspace/database_collab_remapper.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ async fn test_parse_real_database_json() {
4343
let fields = database.get_all_fields();
4444
assert_eq!(fields.len(), 5);
4545

46-
let database_data = database.get_database_data(20, false).await.unwrap();
46+
let database_data = database.get_database_data(20, false, true).await.unwrap();
4747
assert_eq!(database_data.rows.len(), 5);
4848

4949
let original_uuids = [

collab/tests/importer/workspace/workspace_remapper_test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ async fn test_workspace_remapper_with_row_meta() {
115115
assert_eq!(databases.len(), 1);
116116

117117
let database = &databases[0];
118-
let database_data = database.get_database_data(20, false).await.unwrap();
118+
let database_data = database.get_database_data(20, false, true).await.unwrap();
119119

120120
assert_eq!(database_data.row_metas.len(), 4);
121121
assert_eq!(database_data.rows.len(), 4);

0 commit comments

Comments
 (0)