diff --git a/lib/store/CascadeStore.d.ts b/lib/store/CascadeStore.d.ts index 67287f1..158efc5 100644 --- a/lib/store/CascadeStore.d.ts +++ b/lib/store/CascadeStore.d.ts @@ -1,13 +1,14 @@ import { Context } from '../types/Context'; -import { DeduceCreateOperation, DeduceCreateSingleOperation, DeduceRemoveOperation, DeduceUpdateOperation, EntityDict, OperateParams, OperationResult, SelectRowShape } from "../types/Entity"; +import { DeduceCreateMultipleOperation, DeduceCreateOperation, DeduceCreateSingleOperation, DeduceRemoveOperation, DeduceUpdateOperation, EntityDict, OperateParams, OperationResult, SelectRowShape } from "../types/Entity"; import { RowStore } from '../types/RowStore'; import { StorageSchema } from '../types/Storage'; /**这个用来处理级联的select和update,对不同能力的 */ export declare abstract class CascadeStore> extends RowStore { constructor(storageSchema: StorageSchema); protected abstract supportManyToOneJoin(): boolean; + protected abstract supportMultipleCreate(): boolean; protected abstract selectAbjointRow(entity: T, selection: S, context: Cxt, params?: OperateParams): Promise[]>; - protected abstract updateAbjointRow(entity: T, operation: DeduceCreateSingleOperation | DeduceUpdateOperation | DeduceRemoveOperation, context: Cxt, params?: OperateParams): Promise; + protected abstract updateAbjointRow(entity: T, operation: DeduceCreateMultipleOperation | DeduceCreateSingleOperation | DeduceUpdateOperation | DeduceRemoveOperation, context: Cxt, params?: OperateParams): Promise; protected cascadeSelect(entity: T, selection: S, context: Cxt, params?: OperateParams): Promise[]>; /** * 级联更新 diff --git a/lib/store/CascadeStore.js b/lib/store/CascadeStore.js index fcab3fe..52d22a2 100644 --- a/lib/store/CascadeStore.js +++ b/lib/store/CascadeStore.js @@ -201,14 +201,23 @@ class CascadeStore extends RowStore_1.RowStore { const opData = {}; const result = {}; if (action === 'create' && data instanceof Array) { - for (const dataEle of data) { - const result2 = await this.cascadeUpdate(entity, { + const multipleCreate = this.supportMultipleCreate(); + if (multipleCreate) { + return await this.cascadeUpdate(entity, { action, - data: dataEle, + data, }, context, params); - this.mergeOperationResult(result, result2); } - return result; + else { + for (const dataEle of data) { + const result2 = await this.cascadeUpdate(entity, { + action, + data: dataEle, + }, context, params); + this.mergeOperationResult(result, result2); + } + return result; + } } const data2 = data; for (const attr in data2) { diff --git a/lib/types/Entity.d.ts b/lib/types/Entity.d.ts index ef4233f..bdef10d 100644 --- a/lib/types/Entity.d.ts +++ b/lib/types/Entity.d.ts @@ -98,7 +98,7 @@ export declare type DeduceOperation = DeduceCreat export declare type CreateOpResult = { a: 'c'; e: T; - d: ED[T]['OpSchema']; + d: ED[T]['OpSchema'] | ED[T]['OpSchema'][]; }; export declare type UpdateOpResult = { a: 'u'; diff --git a/src/store/CascadeStore.ts b/src/store/CascadeStore.ts index 3531a98..128a2ac 100644 --- a/src/store/CascadeStore.ts +++ b/src/store/CascadeStore.ts @@ -2,6 +2,7 @@ import assert from "assert"; import { assign, keys } from "lodash"; import { Context } from '../types/Context'; import { + DeduceCreateMultipleOperation, DeduceCreateOperation, DeduceCreateSingleOperation, DeduceFilter, DeduceRemoveOperation, DeduceSelection, DeduceUpdateOperation, EntityDict, EntityShape, OperateParams, OperationResult, SelectionResult, SelectRowShape } from "../types/Entity"; @@ -16,6 +17,7 @@ export abstract class CascadeStore( entity: T, selection: S, @@ -24,7 +26,7 @@ export abstract class CascadeStore( entity: T, - operation: DeduceCreateSingleOperation | DeduceUpdateOperation | DeduceRemoveOperation, + operation: DeduceCreateMultipleOperation | DeduceCreateSingleOperation | DeduceUpdateOperation | DeduceRemoveOperation, context: Cxt, params?: OperateParams): Promise; @@ -261,14 +263,23 @@ export abstract class CascadeStore = {}; if (action === 'create' && data instanceof Array) { - for (const dataEle of data) { - const result2 = await this.cascadeUpdate(entity, { + const multipleCreate = this.supportMultipleCreate(); + if (multipleCreate) { + return await this.cascadeUpdate(entity, { action, - data: dataEle, + data, }, context, params); - this.mergeOperationResult(result, result2); } - return result; + else { + for (const dataEle of data) { + const result2 = await this.cascadeUpdate(entity, { + action, + data: dataEle, + }, context, params); + this.mergeOperationResult(result, result2); + } + return result; + } } const data2 = data as (DeduceCreateSingleOperation | DeduceUpdateOperation | DeduceRemoveOperation)['data']; diff --git a/src/types/Entity.ts b/src/types/Entity.ts index d7a08af..30fcb8b 100644 --- a/src/types/Entity.ts +++ b/src/types/Entity.ts @@ -134,7 +134,7 @@ export type DeduceOperation = DeduceCreateOperati export type CreateOpResult = { a: 'c'; e: T; - d: ED[T]['OpSchema']; + d: ED[T]['OpSchema'] | ED[T]['OpSchema'][]; }; export type UpdateOpResult = {