增加了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 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;

View File

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

View File

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

View File

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

View File

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

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

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

View File

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

View File

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

View File

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

View File

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

View File

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