create的opRecord支持多行

This commit is contained in:
Xu Chang 2022-06-16 15:28:03 +08:00
parent 20f62e55c5
commit 7014ab0f66
5 changed files with 36 additions and 15 deletions

View File

@ -1,13 +1,14 @@
import { Context } from '../types/Context'; 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 { RowStore } from '../types/RowStore';
import { StorageSchema } from '../types/Storage'; import { StorageSchema } from '../types/Storage';
/**这个用来处理级联的select和update对不同能力的 */ /**这个用来处理级联的select和update对不同能力的 */
export declare abstract class CascadeStore<ED extends EntityDict, Cxt extends Context<ED>> extends RowStore<ED, Cxt> { export declare abstract class CascadeStore<ED extends EntityDict, Cxt extends Context<ED>> extends RowStore<ED, Cxt> {
constructor(storageSchema: StorageSchema<ED>); constructor(storageSchema: StorageSchema<ED>);
protected abstract supportManyToOneJoin(): boolean; protected abstract supportManyToOneJoin(): boolean;
protected abstract supportMultipleCreate(): boolean;
protected abstract selectAbjointRow<T extends keyof ED, S extends ED[T]['Selection']>(entity: T, selection: S, context: Cxt, params?: OperateParams): Promise<SelectRowShape<ED[T]['Schema'], S['data']>[]>; protected abstract selectAbjointRow<T extends keyof ED, S extends ED[T]['Selection']>(entity: T, selection: S, context: Cxt, params?: OperateParams): Promise<SelectRowShape<ED[T]['Schema'], S['data']>[]>;
protected abstract updateAbjointRow<T extends keyof ED>(entity: T, operation: DeduceCreateSingleOperation<ED[T]['Schema']> | DeduceUpdateOperation<ED[T]['Schema']> | DeduceRemoveOperation<ED[T]['Schema']>, context: Cxt, params?: OperateParams): Promise<number>; protected abstract updateAbjointRow<T extends keyof ED>(entity: T, operation: DeduceCreateMultipleOperation<ED[T]['Schema']> | DeduceCreateSingleOperation<ED[T]['Schema']> | DeduceUpdateOperation<ED[T]['Schema']> | DeduceRemoveOperation<ED[T]['Schema']>, context: Cxt, params?: OperateParams): Promise<number>;
protected cascadeSelect<T extends keyof ED, S extends ED[T]['Selection']>(entity: T, selection: S, context: Cxt, params?: OperateParams): Promise<SelectRowShape<ED[T]['Schema'], S['data']>[]>; protected cascadeSelect<T extends keyof ED, S extends ED[T]['Selection']>(entity: T, selection: S, context: Cxt, params?: OperateParams): Promise<SelectRowShape<ED[T]['Schema'], S['data']>[]>;
/** /**
* *

View File

@ -201,14 +201,23 @@ class CascadeStore extends RowStore_1.RowStore {
const opData = {}; const opData = {};
const result = {}; const result = {};
if (action === 'create' && data instanceof Array) { if (action === 'create' && data instanceof Array) {
for (const dataEle of data) { const multipleCreate = this.supportMultipleCreate();
const result2 = await this.cascadeUpdate(entity, { if (multipleCreate) {
return await this.cascadeUpdate(entity, {
action, action,
data: dataEle, data,
}, context, params); }, 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; const data2 = data;
for (const attr in data2) { for (const attr in data2) {

View File

@ -98,7 +98,7 @@ export declare type DeduceOperation<SH extends GeneralEntityShape> = DeduceCreat
export declare type CreateOpResult<ED extends EntityDict, T extends keyof ED> = { export declare type CreateOpResult<ED extends EntityDict, T extends keyof ED> = {
a: 'c'; a: 'c';
e: T; e: T;
d: ED[T]['OpSchema']; d: ED[T]['OpSchema'] | ED[T]['OpSchema'][];
}; };
export declare type UpdateOpResult<ED extends EntityDict, T extends keyof ED> = { export declare type UpdateOpResult<ED extends EntityDict, T extends keyof ED> = {
a: 'u'; a: 'u';

View File

@ -2,6 +2,7 @@ import assert from "assert";
import { assign, keys } from "lodash"; import { assign, keys } from "lodash";
import { Context } from '../types/Context'; import { Context } from '../types/Context';
import { import {
DeduceCreateMultipleOperation,
DeduceCreateOperation, DeduceCreateSingleOperation, DeduceFilter, DeduceRemoveOperation, DeduceSelection, DeduceCreateOperation, DeduceCreateSingleOperation, DeduceFilter, DeduceRemoveOperation, DeduceSelection,
DeduceUpdateOperation, EntityDict, EntityShape, OperateParams, OperationResult, SelectionResult, SelectRowShape DeduceUpdateOperation, EntityDict, EntityShape, OperateParams, OperationResult, SelectionResult, SelectRowShape
} from "../types/Entity"; } from "../types/Entity";
@ -16,6 +17,7 @@ export abstract class CascadeStore<ED extends EntityDict, Cxt extends Context<ED
super(storageSchema); super(storageSchema);
} }
protected abstract supportManyToOneJoin(): boolean; protected abstract supportManyToOneJoin(): boolean;
protected abstract supportMultipleCreate(): boolean;
protected abstract selectAbjointRow<T extends keyof ED, S extends ED[T]['Selection']>( protected abstract selectAbjointRow<T extends keyof ED, S extends ED[T]['Selection']>(
entity: T, entity: T,
selection: S, selection: S,
@ -24,7 +26,7 @@ export abstract class CascadeStore<ED extends EntityDict, Cxt extends Context<ED
protected abstract updateAbjointRow<T extends keyof ED>( protected abstract updateAbjointRow<T extends keyof ED>(
entity: T, entity: T,
operation: DeduceCreateSingleOperation<ED[T]['Schema']> | DeduceUpdateOperation<ED[T]['Schema']> | DeduceRemoveOperation<ED[T]['Schema']>, operation: DeduceCreateMultipleOperation<ED[T]['Schema']> | DeduceCreateSingleOperation<ED[T]['Schema']> | DeduceUpdateOperation<ED[T]['Schema']> | DeduceRemoveOperation<ED[T]['Schema']>,
context: Cxt, context: Cxt,
params?: OperateParams): Promise<number>; params?: OperateParams): Promise<number>;
@ -261,14 +263,23 @@ export abstract class CascadeStore<ED extends EntityDict, Cxt extends Context<ED
const result: OperationResult<ED> = {}; const result: OperationResult<ED> = {};
if (action === 'create' && data instanceof Array) { if (action === 'create' && data instanceof Array) {
for (const dataEle of data) { const multipleCreate = this.supportMultipleCreate();
const result2 = await this.cascadeUpdate(entity, { if (multipleCreate) {
return await this.cascadeUpdate(entity, {
action, action,
data: dataEle, data,
}, context, params); }, 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<ED[T]['Schema']> | DeduceUpdateOperation<ED[T]['Schema']> | DeduceRemoveOperation<ED[T]['Schema']>)['data']; const data2 = data as (DeduceCreateSingleOperation<ED[T]['Schema']> | DeduceUpdateOperation<ED[T]['Schema']> | DeduceRemoveOperation<ED[T]['Schema']>)['data'];

View File

@ -134,7 +134,7 @@ export type DeduceOperation<SH extends GeneralEntityShape> = DeduceCreateOperati
export type CreateOpResult<ED extends EntityDict, T extends keyof ED> = { export type CreateOpResult<ED extends EntityDict, T extends keyof ED> = {
a: 'c'; a: 'c';
e: T; e: T;
d: ED[T]['OpSchema']; d: ED[T]['OpSchema'] | ED[T]['OpSchema'][];
}; };
export type UpdateOpResult<ED extends EntityDict, T extends keyof ED> = { export type UpdateOpResult<ED extends EntityDict, T extends keyof ED> = {