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