增加了selectchecker,更改了contextBuilder的调用参数

This commit is contained in:
Xu Chang 2022-05-06 19:25:44 +08:00
parent 411d1bc496
commit b84a28170a
11 changed files with 40 additions and 32 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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的约束

View File

@ -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);

View File

@ -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;

10
lib/types/Auth.d.ts vendored
View File

@ -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>;

View File

@ -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;

View File

@ -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']>,

View File

@ -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!);

View File

@ -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;

View File

@ -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>;