import { EntityDict, OperateOption, SelectOption, OperationResult, AggregationResult } from "../types/Entity"; import { EntityDict as BaseEntityDict } from '../base-app-domain'; import { OperationRewriter, RowStore, SelectionRewriter } from '../types/RowStore'; import { StorageSchema } from '../types/Storage'; import { SyncContext } from "./SyncRowStore"; import { AsyncContext } from "./AsyncRowStore"; /** * 补全一个不完整的Selection,会将需要的各种连接、过滤和排序的属性加到相应的projection上 * @param schema * @param entity * @param selection * @param context * @param option */ export declare function polishSelection, Op extends SelectOption>(schema: StorageSchema, entity: keyof ED, selection: ED[keyof ED]['Selection'] | ED[keyof ED]['Aggregation'], context?: Cxt, option?: Op): void; /**这个用来处理级联的select和update,对不同能力的 */ export declare abstract class CascadeStore extends RowStore { constructor(storageSchema: StorageSchema); protected abstract supportManyToOneJoin(): boolean; protected abstract supportMultipleCreate(): boolean; private selectionRewriters; private operationRewriters; private reinforceSelectionAsync; private reinforceSelectionSync; private reinforceOperation; registerOperationRewriter(rewriter: OperationRewriter | SyncContext, OperateOption>): void; registerSelectionRewriter(rewriter: SelectionRewriter | SyncContext, SelectOption>): void; protected abstract selectAbjointRow>(entity: T, selection: ED[T]['Selection'], context: Cxt, option: OP): Partial[]; protected abstract countAbjointRow>(entity: T, selection: Pick, context: Cxt, option: OP): number; protected abstract countAbjointRowAsync>(entity: T, selection: Pick, context: Cxt, option: OP): Promise; protected abstract updateAbjointRow>(entity: T, operation: ED[T]['Operation'], context: Cxt, option: OP): number; protected abstract selectAbjointRowAsync>(entity: T, selection: ED[T]['Selection'], context: Cxt, option: OP): Promise[]>; protected abstract updateAbjointRowAsync>(entity: T, operation: ED[T]['Create'] | ED[T]['Update'] | ED[T]['Remove'], context: Cxt, option: OP): Promise; protected abstract aggregateAbjointRowSync>(entity: T, aggregation: ED[T]['Aggregation'], context: Cxt, option: OP): AggregationResult; protected abstract aggregateAbjointRowAsync>(entity: T, aggregation: ED[T]['Aggregation'], context: Cxt, option: OP): Promise>; protected destructCascadeSelect | AsyncContext>(entity: T, projection2: ED[T]['Projection'], context: Cxt, cascadeSelectFn: (entity2: T2, selection: ED[T2]['Selection'], context: Cxt, op: OP) => Partial[] | Promise[]>, aggregateFn: (entity2: T2, aggregation: ED[T2]['Aggregation'], context: Cxt, op: OP) => AggregationResult | Promise>, option: OP, selectionId?: string): { projection: ED[T]["Projection"]; cascadeSelectionFns: ((result: Partial[]) => Promise | void)[]; }; /** * 级联更新 * A --> B 多对一:A CREATE/B CREATE,B data的主键赋到A的data上 A CREATE/B UPDATE,B filter的主键来自A的data A UPDATE/B CREATE,B data的主键赋到A的data上 A UPDATE/B UPDATE,B filter的主键来自A的row A UPDATE/B REMOVE,B filter的主键来自A的row A REMOVE/B UPDATE,B filter的主键来自A的row A REMOVE/B REMOVE,B filter的主键来自A的row 一对多:A CREATE/B CREATE,A data上的主键赋到B的data上 A CREATE/B UPDATE,A data上的主键赋到B的data上 A UPDATE/B CREATE,A filter上的主键赋到B的data上(一定是带主键的filter) A UPDATE/B UPDATE,A filter上的主键赋到B的filter上(一定是带主键的filter) A UPDATE/B REMOVE,A filter上的主键赋到B的filter上(一定是带主键的filter) A REMOVE/B UPDATE,A filter上的主键赋到B的filter上(且B关于A的外键清空) A REMOVE/B REMOVE,A filter上的主键赋到B的filter上 * * 延时更新, * A(业务级别的申请对象) ---> B(业务级别需要更新的对象) * 两者必须通过entity/entityId关联 * 此时需要把对B的更新记录成一条新插入的Modi对象,并将A上的entity/entityId指向该对象(新生成的Modi对象的id与此operation的id保持一致) * @param entity * @param action * @param data * @param context * @param option * @param result * @param filter * @returns */ protected destructCascadeUpdate | AsyncContext, OP extends OperateOption, R>(entity: T, action: ED[T]['Action'], data: ED[T]['CreateOperationData'] | ED[T]['Update']['data'] | ED[T]['Remove']['data'], context: Cxt, option: OP, cascadeUpdate: (entity: T2, operation: ED[T2]['Operation'], context: Cxt, option: OP) => R, filter?: ED[T]['Filter'], bornAt?: number): { data: Record; beforeFns: (() => R)[]; afterFns: (() => R)[]; }; protected preProcessDataCreated(entity: T, data: ED[T]['Create']['data']): void; protected preProcessDataUpdated(action: string, data: Record, async?: true): void; judgeRelation(entity: keyof ED, attr: string): string | 2 | 1 | string[] | 0 | -1; private tryMergeModi; /** * 和具体的update过程无关的例程放在这里,包括对later动作的处理、对oper的记录以及对record的收集等 * @param entity * @param operation * @param context * @param option */ private doUpdateSingleRowAsync; private doUpdateSingleRow; protected cascadeUpdate, OP extends OperateOption>(entity: T, operation: ED[T]['Operation'], context: Cxt, option: OP): OperationResult; /** * * @param entity * @param operation * @param context * @param option */ protected cascadeUpdateAsync, OP extends OperateOption>(entity: T, operation: ED[T]['Operation'], context: Cxt, option: OP): Promise>; protected cascadeSelect>(entity: T, selection: ED[T]['Selection'], context: Cxt, option: OP): Partial[]; /** * 将一次查询的结果集加入result * todo 如果是supportMtoOJoin,这里还要解构(未充分测试) * @param entity * @param rows * @param context */ private addToResultSelections; private addSingleRowToResultSelections; protected cascadeSelectAsync>(entity: T, selection: ED[T]['Selection'], context: Cxt, option: OP): Promise[]>; protected aggregateAsync>(entity: T, aggregation: ED[T]['Aggregation'], context: Cxt, option: OP): Promise>; protected aggregateSync>(entity: T, aggregation: ED[T]['Aggregation'], context: Cxt, option: OP): AggregationResult; protected selectAsync>(entity: T, selection: ED[T]['Selection'], context: Cxt, option: OP): Promise[]>; protected selectSync>(entity: T, selection: ED[T]['Selection'], context: Cxt, option: OP): Partial[]; protected operateSync, OP extends OperateOption>(entity: T, operation: ED[T]['Operation'], context: Cxt, option: OP): OperationResult; protected operateAsync, OP extends OperateOption>(entity: T, operation: ED[T]['Operation'], context: Cxt, option: OP): Promise>; protected countSync>(entity: T, selection: Pick, context: Cxt, option: OP): number; protected countAsync>(entity: T, selection: Pick, context: Cxt, option: OP): Promise; }