Skip to content

Commit 20d5b03

Browse files
authored
feat: implement batch update for view operations (#1825)
* feat: implement batch update for view operations * fix: adjust database table name handling for SQLite in view service * fix: schema type * fix: correct version increment logic in view service * feat: implement createFields batch update view operations * refactor: streamline view update logic and enhance context handling * refactor: rename initViewColumnMeta function params * refactor: optimize batch update logic - change batch update view by temp table to case when - add batch update view e2e
1 parent b44bb6d commit 20d5b03

6 files changed

Lines changed: 308 additions & 93 deletions

File tree

apps/nestjs-backend/src/features/field/field-calculate/field-creating.service.ts

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Injectable, Logger } from '@nestjs/common';
2-
import type { IColumnMeta } from '@teable/core';
2+
import type { IColumn, IColumnMeta } from '@teable/core';
33
import { FieldType } from '@teable/core';
44
import { PrismaService } from '@teable/db-main-prisma';
55
import { ViewService } from '../../view/view.service';
@@ -19,7 +19,11 @@ export class FieldCreatingService {
1919
private readonly fieldSupplementService: FieldSupplementService
2020
) {}
2121

22-
async createFieldItem(tableId: string, field: IFieldInstance, columnMeta?: IColumnMeta) {
22+
async createFieldItem(
23+
tableId: string,
24+
field: IFieldInstance,
25+
initViewColumnMap?: Record<string, IColumn>
26+
) {
2327
const fieldId = field.id;
2428

2529
await this.fieldSupplementService.createReference(field);
@@ -32,21 +36,33 @@ export class FieldCreatingService {
3236

3337
await this.fieldService.batchCreateFields(tableId, dbTableName, [field]);
3438

35-
await this.viewService.initViewColumnMeta(tableId, [fieldId], columnMeta && [columnMeta]);
39+
await this.viewService.initViewColumnMeta(
40+
tableId,
41+
[fieldId],
42+
initViewColumnMap && [initViewColumnMap]
43+
);
3644
}
3745

38-
async createFields(tableId: string, fieldInstances: IFieldInstance[], columnMeta?: IColumnMeta) {
46+
async createFields(
47+
tableId: string,
48+
fieldInstances: IFieldInstance[],
49+
initViewColumnMap?: Record<string, IColumn>
50+
) {
3951
const { dbTableName } = await this.prismaService.txClient().tableMeta.findUniqueOrThrow({
4052
where: { id: tableId },
4153
select: { dbTableName: true },
4254
});
4355

4456
for (const field of fieldInstances) {
45-
const fieldId = field.id;
4657
await this.fieldSupplementService.createReference(field);
4758
await this.fieldSupplementService.createFieldTaskReference(tableId, field);
48-
await this.viewService.initViewColumnMeta(tableId, [fieldId], columnMeta && [columnMeta]);
4959
}
60+
const fieldIds = fieldInstances.map((field) => field.id);
61+
await this.viewService.initViewColumnMeta(
62+
tableId,
63+
fieldIds,
64+
initViewColumnMap && fieldIds.map(() => initViewColumnMap)
65+
);
5066

5167
await this.fieldService.batchCreateFieldsAtOnce(tableId, dbTableName, fieldInstances);
5268
}

apps/nestjs-backend/src/features/field/field-calculate/field-view-sync.service.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ export class FieldViewSyncService {
206206
return;
207207
}
208208

209+
const opsMap: { [viewId: string]: IOtOperation[] } = {};
209210
for (let i = 0; i < views.length; i++) {
210211
const filterString = views[i].filter;
211212
// empty filter or the field is not in filter, skip
@@ -221,9 +222,10 @@ export class FieldViewSyncService {
221222
newValue: newFilter ? (newFilter?.filterSet?.length ? newFilter : null) : null,
222223
oldValue: filter,
223224
});
224-
225-
await this.viewService.updateViewByOps(tableId, views[i].id, [ops]);
225+
opsMap[views[i].id] = [ops];
226226
}
227+
228+
await this.viewService.batchUpdateViewByOps(tableId, opsMap);
227229
}
228230

229231
async getLinkForeignFields(tableId: string) {

apps/nestjs-backend/src/features/view/open-api/view-open-api.service.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -418,16 +418,18 @@ export class ViewOpenApiService {
418418
this.logger.log(`lucky view shuffle! ${tableId}`, 'shuffle');
419419

420420
await this.prismaService.$tx(async () => {
421+
const opsMap: { [viewId: string]: IOtOperation[] } = {};
421422
for (let i = 0; i < views.length; i++) {
422423
const view = views[i];
423-
await this.viewService.updateViewByOps(tableId, view.id, [
424+
opsMap[view.id] = [
424425
ViewOpBuilder.editor.setViewProperty.build({
425426
key: 'order',
426427
newValue: i,
427428
oldValue: view.order,
428429
}),
429-
]);
430+
];
430431
}
432+
await this.viewService.batchUpdateViewByOps(tableId, opsMap);
431433
});
432434
}
433435

0 commit comments

Comments
 (0)