增加了selectchecker,更改了contextBuilder的调用参数
This commit is contained in:
parent
411d1bc496
commit
b84a28170a
|
|
@ -13,7 +13,7 @@ export declare class TriggerExecutor<ED extends EntityDict, Cxt extends Context<
|
|||
private volatileEntities;
|
||||
private logger;
|
||||
private contextBuilder;
|
||||
constructor(contextBuilder: () => Cxt, logger?: Logger);
|
||||
constructor(contextBuilder: (scene: string) => Cxt, logger?: Logger);
|
||||
registerChecker<T extends keyof ED>(checker: Checker<ED, T, Cxt>): void;
|
||||
registerTrigger<T extends keyof ED>(trigger: Trigger<ED, T, Cxt>): void;
|
||||
unregisterTrigger<T extends keyof ED>(trigger: Trigger<ED, T, Cxt>): void;
|
||||
|
|
|
|||
|
|
@ -167,7 +167,7 @@ class TriggerExecutor extends Trigger_1.Executor {
|
|||
}
|
||||
onCommit(trigger, operation, params) {
|
||||
return async () => {
|
||||
const context = this.contextBuilder();
|
||||
const context = this.contextBuilder('triggerExecutor: onCommit');
|
||||
await context.begin();
|
||||
const number = await trigger.fn({
|
||||
operation: operation,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { StorageSchema } from '../types';
|
||||
import { EntityDict } from "../types/Entity";
|
||||
export declare function addFilterSegment<ED extends EntityDict, T extends keyof ED>(segment: ED[T]['Selection']['filter'], filter2?: ED[T]['Selection']['filter']): ED[T]["Selection"]["filter"];
|
||||
export declare function addFilterSegment<ED extends EntityDict, T extends keyof ED>(segment2: ED[T]['Selection']['filter'], filter2?: ED[T]['Selection']['filter']): ED[T]["Selection"]["filter"];
|
||||
export declare function combineFilters<ED extends EntityDict, T extends keyof ED>(filters: Array<ED[T]['Selection']['filter']>): ED[T]["Selection"]["filter"];
|
||||
/**
|
||||
* 判断filter是否包含conditionalFilter中的查询条件,即filter查询的结果一定满足conditionalFilter的约束
|
||||
|
|
|
|||
|
|
@ -1,14 +1,10 @@
|
|||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.contains = exports.combineFilters = exports.addFilterSegment = void 0;
|
||||
const assert_1 = __importDefault(require("assert"));
|
||||
const lodash_1 = require("lodash");
|
||||
function addFilterSegment(segment, filter2) {
|
||||
function addFilterSegment(segment2, filter2) {
|
||||
const filter = filter2 ? (0, lodash_1.cloneDeep)(filter2) : {};
|
||||
(0, assert_1.default)(segment);
|
||||
const segment = segment2 ? (0, lodash_1.cloneDeep)(segment2) : {};
|
||||
if ((0, lodash_1.intersection)((0, lodash_1.keys)(filter), (0, lodash_1.keys)(segment)).length > 0) {
|
||||
if (filter.hasOwnProperty('$and')) {
|
||||
filter.$and.push(segment);
|
||||
|
|
|
|||
|
|
@ -45,17 +45,17 @@ function judgeRelation(schema, entity, attr) {
|
|||
(0, assert_1.default)(false);
|
||||
}
|
||||
}
|
||||
else if ((attributes.hasOwnProperty(`${attr}Id`))) {
|
||||
const { type, ref } = attributes[`${attr}Id`];
|
||||
(0, assert_1.default)(type === 'ref');
|
||||
return ref;
|
||||
}
|
||||
else if (attributes.hasOwnProperty('entity')
|
||||
&& attributes.hasOwnProperty('entityId')
|
||||
&& schema.hasOwnProperty(attr)) {
|
||||
// 反向指针的外键
|
||||
return 2;
|
||||
}
|
||||
else if ((attributes.hasOwnProperty(`${attr}Id`))) {
|
||||
const { type, ref } = attributes[`${attr}Id`];
|
||||
(0, assert_1.default)(type === 'ref');
|
||||
return ref;
|
||||
}
|
||||
else {
|
||||
(0, assert_1.default)(Entity_1.initinctiveAttributes.includes(attr), `${attr}属性找不到`);
|
||||
return 1;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { EntityDict } from "../types/Entity";
|
||||
import { Context } from "./Context";
|
||||
import { CreateTriggerBase, RemoveTriggerBase, UpdateTriggerBase, CheckerType } from "./Trigger";
|
||||
import { CreateTriggerBase, RemoveTriggerBase, UpdateTriggerBase, CheckerType, SelectTriggerBefore } from "./Trigger";
|
||||
export declare type CreateChecker<ED extends EntityDict, T extends keyof ED, Cxt extends Context<ED>> = {
|
||||
type: CheckerType;
|
||||
action: 'create';
|
||||
|
|
@ -19,4 +19,10 @@ export declare type RemoveChecker<ED extends EntityDict, T extends keyof ED, Cxt
|
|||
entity: T;
|
||||
checker: RemoveTriggerBase<ED, T, Cxt>['fn'];
|
||||
};
|
||||
export declare type Checker<ED extends EntityDict, T extends keyof ED, Cxt extends Context<ED>> = CreateChecker<ED, T, Cxt> | UpdateChecker<ED, T, Cxt> | RemoveChecker<ED, T, Cxt>;
|
||||
export declare type SelectChecker<ED extends EntityDict, T extends keyof ED, Cxt extends Context<ED>> = {
|
||||
type: CheckerType;
|
||||
action: 'select';
|
||||
entity: T;
|
||||
checker: SelectTriggerBefore<ED, T, Cxt>['fn'];
|
||||
};
|
||||
export declare type Checker<ED extends EntityDict, T extends keyof ED, Cxt extends Context<ED>> = CreateChecker<ED, T, Cxt> | UpdateChecker<ED, T, Cxt> | RemoveChecker<ED, T, Cxt> | SelectChecker<ED, T, Cxt>;
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ class RWLock {
|
|||
this.writeWaiter = [];
|
||||
}
|
||||
async acquire(mode) {
|
||||
// console.log('acquire');
|
||||
if (mode === 'S') {
|
||||
while (this.writeNumber > 0) {
|
||||
const p = new Promise((resolve) => this.readWaiter.push(resolve));
|
||||
|
|
@ -38,7 +37,6 @@ class RWLock {
|
|||
}
|
||||
}
|
||||
async release() {
|
||||
// console.log('release');
|
||||
if (this.writeNumber) {
|
||||
(0, assert_1.default)(this.writeNumber === 1);
|
||||
this.writeNumber = 0;
|
||||
|
|
|
|||
|
|
@ -32,9 +32,9 @@ export class TriggerExecutor<ED extends EntityDict, Cxt extends Context<ED>> ext
|
|||
private volatileEntities: Array<keyof ED>;
|
||||
|
||||
private logger: Logger;
|
||||
private contextBuilder: () => Cxt;
|
||||
private contextBuilder: (scene: string) => Cxt;
|
||||
|
||||
constructor(contextBuilder: () => Cxt, logger: Logger = console) {
|
||||
constructor(contextBuilder: (scene: string) => Cxt, logger: Logger = console) {
|
||||
super();
|
||||
this.contextBuilder = contextBuilder;
|
||||
this.logger = logger;
|
||||
|
|
@ -211,7 +211,7 @@ export class TriggerExecutor<ED extends EntityDict, Cxt extends Context<ED>> ext
|
|||
private onCommit<T extends keyof ED>(
|
||||
trigger: Trigger<ED, T, Cxt>, operation: ED[T]['Operation'], params?: OperateParams) {
|
||||
return async () => {
|
||||
const context = this.contextBuilder();
|
||||
const context = this.contextBuilder('triggerExecutor: onCommit');
|
||||
await context.begin();
|
||||
const number = await (trigger as CreateTrigger<ED, T, Cxt>).fn({
|
||||
operation: operation as DeduceCreateOperation<ED[T]['Schema']>,
|
||||
|
|
|
|||
|
|
@ -3,9 +3,9 @@ import { assign, cloneDeep, intersection, keys } from "lodash";
|
|||
import { StorageSchema } from '../types';
|
||||
import { DeduceFilter, EntityDict } from "../types/Entity";
|
||||
|
||||
export function addFilterSegment<ED extends EntityDict, T extends keyof ED>(segment: ED[T]['Selection']['filter'], filter2?: ED[T]['Selection']['filter']) {
|
||||
const filter: ED[T]['Selection']['filter'] = filter2 ? cloneDeep(filter2) : {};
|
||||
assert(segment);
|
||||
export function addFilterSegment<ED extends EntityDict, T extends keyof ED>(segment2: ED[T]['Selection']['filter'], filter2?: ED[T]['Selection']['filter']) {
|
||||
const filter: ED[T]['Selection']['filter'] = filter2 ? cloneDeep(filter2) : {};
|
||||
const segment: ED[T]['Selection']['filter'] = segment2 ? cloneDeep(segment2) : {};
|
||||
if (intersection(keys(filter), keys(segment)).length > 0) {
|
||||
if (filter!.hasOwnProperty('$and')) {
|
||||
filter!.$and!.push(segment!);
|
||||
|
|
|
|||
|
|
@ -47,17 +47,17 @@ export function judgeRelation<ED extends {
|
|||
assert(false);
|
||||
}
|
||||
}
|
||||
else if ((attributes.hasOwnProperty(`${attr}Id`))){
|
||||
const { type, ref } = attributes[`${attr}Id`];
|
||||
assert (type === 'ref');
|
||||
return ref!;
|
||||
}
|
||||
else if (attributes.hasOwnProperty('entity')
|
||||
&& attributes.hasOwnProperty('entityId')
|
||||
&& schema.hasOwnProperty(attr)) {
|
||||
// 反向指针的外键
|
||||
return 2;
|
||||
}
|
||||
else if ((attributes.hasOwnProperty(`${attr}Id`))){
|
||||
const { type, ref } = attributes[`${attr}Id`];
|
||||
assert (type === 'ref');
|
||||
return ref!;
|
||||
}
|
||||
else {
|
||||
assert(initinctiveAttributes.includes(attr), `${attr}属性找不到`);
|
||||
return 1;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { EntityDict } from "../types/Entity";
|
||||
import { Context } from "./Context";
|
||||
import { CreateTriggerBase, RemoveTriggerBase, UpdateTriggerBase, CheckerType } from "./Trigger";
|
||||
import { CreateTriggerBase, RemoveTriggerBase, UpdateTriggerBase, CheckerType, SelectTriggerBefore } from "./Trigger";
|
||||
|
||||
export type CreateChecker<ED extends EntityDict, T extends keyof ED, Cxt extends Context<ED>> = {
|
||||
type: CheckerType;
|
||||
|
|
@ -20,7 +20,15 @@ export type RemoveChecker<ED extends EntityDict, T extends keyof ED, Cxt extends
|
|||
type: CheckerType;
|
||||
action: 'remove';
|
||||
entity: T;
|
||||
checker: RemoveTriggerBase<ED, T, Cxt>['fn'],
|
||||
checker: RemoveTriggerBase<ED, T, Cxt>['fn'];
|
||||
};
|
||||
|
||||
export type Checker<ED extends EntityDict, T extends keyof ED, Cxt extends Context<ED>> = CreateChecker<ED, T, Cxt> | UpdateChecker<ED, T, Cxt> | RemoveChecker<ED, T, Cxt>;
|
||||
export type SelectChecker<ED extends EntityDict, T extends keyof ED, Cxt extends Context<ED>> = {
|
||||
type: CheckerType;
|
||||
action: 'select';
|
||||
entity: T;
|
||||
checker: SelectTriggerBefore<ED, T, Cxt>['fn'];
|
||||
}
|
||||
|
||||
export type Checker<ED extends EntityDict, T extends keyof ED, Cxt extends Context<ED>> =
|
||||
CreateChecker<ED, T, Cxt> | UpdateChecker<ED, T, Cxt> | RemoveChecker<ED, T, Cxt> | SelectChecker<ED, T, Cxt>;
|
||||
|
|
|
|||
Loading…
Reference in New Issue