Merge branch 'dev' into release

This commit is contained in:
Xu Chang 2023-01-20 20:03:23 +08:00
commit 68a592037e
3 changed files with 25 additions and 26 deletions

6
lib/store.d.ts vendored
View File

@ -1,4 +1,4 @@
import { DeduceCreateSingleOperation, DeduceRemoveOperation, DeduceUpdateOperation, OperationResult, OperateOption, OpRecord, EntityDict, SelectOption, AggregationResult } from "oak-domain/lib/types/Entity"; import { OperationResult, OperateOption, OpRecord, EntityDict, SelectOption, AggregationResult } from "oak-domain/lib/types/Entity";
import { EntityDict as BaseEntityDict } from 'oak-domain/lib/base-app-domain'; import { EntityDict as BaseEntityDict } from 'oak-domain/lib/base-app-domain';
import { StorageSchema } from 'oak-domain/lib/types/Storage'; import { StorageSchema } from 'oak-domain/lib/types/Storage';
import { NodeDict } from "./types/type"; import { NodeDict } from "./types/type";
@ -50,9 +50,9 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
private translateFilter; private translateFilter;
private translateSorter; private translateSorter;
protected selectAbjointRow<T extends keyof ED, OP extends TreeStoreSelectOption, Cxt extends Context>(entity: T, selection: ED[T]['Selection'], context: Cxt, option?: OP): Partial<ED[T]['Schema']>[]; protected selectAbjointRow<T extends keyof ED, OP extends TreeStoreSelectOption, Cxt extends Context>(entity: T, selection: ED[T]['Selection'], context: Cxt, option?: OP): Partial<ED[T]['Schema']>[];
protected updateAbjointRow<T extends keyof ED, OP extends TreeStoreOperateOption, Cxt extends Context>(entity: T, operation: DeduceCreateSingleOperation<ED[T]['Schema']> | DeduceUpdateOperation<ED[T]['Schema']> | DeduceRemoveOperation<ED[T]['Schema']>, context: Cxt, option?: OP): number; protected updateAbjointRow<T extends keyof ED, OP extends TreeStoreOperateOption, Cxt extends Context>(entity: T, operation: ED[T]['CreateSingle'] | ED[T]['Update'] | ED[T]['Remove'], context: Cxt, option?: OP): number;
protected selectAbjointRowAsync<T extends keyof ED, OP extends TreeStoreSelectOption, Cxt extends Context>(entity: T, selection: ED[T]['Selection'], context: Cxt, option?: OP): Promise<Partial<ED[T]["Schema"]>[]>; protected selectAbjointRowAsync<T extends keyof ED, OP extends TreeStoreSelectOption, Cxt extends Context>(entity: T, selection: ED[T]['Selection'], context: Cxt, option?: OP): Promise<Partial<ED[T]["Schema"]>[]>;
protected updateAbjointRowAsync<T extends keyof ED, OP extends TreeStoreOperateOption, Cxt extends Context>(entity: T, operation: DeduceCreateSingleOperation<ED[T]['Schema']> | DeduceUpdateOperation<ED[T]['Schema']> | DeduceRemoveOperation<ED[T]['Schema']>, context: Cxt, option?: OP): Promise<number>; protected updateAbjointRowAsync<T extends keyof ED, OP extends TreeStoreOperateOption, Cxt extends Context>(entity: T, operation: ED[T]['CreateSingle'] | ED[T]['Update'] | ED[T]['Remove'], context: Cxt, option?: OP): Promise<number>;
protected operateSync<T extends keyof ED, OP extends TreeStoreOperateOption, Cxt extends SyncContext<ED>>(entity: T, operation: ED[T]['Operation'], context: Cxt, option: OP): OperationResult<ED>; protected operateSync<T extends keyof ED, OP extends TreeStoreOperateOption, Cxt extends SyncContext<ED>>(entity: T, operation: ED[T]['Operation'], context: Cxt, option: OP): OperationResult<ED>;
protected operateAsync<T extends keyof ED, OP extends TreeStoreOperateOption, Cxt extends AsyncContext<ED>>(entity: T, operation: ED[T]['Operation'], context: Cxt, option: OP): Promise<OperationResult<ED>>; protected operateAsync<T extends keyof ED, OP extends TreeStoreOperateOption, Cxt extends AsyncContext<ED>>(entity: T, operation: ED[T]['Operation'], context: Cxt, option: OP): Promise<OperationResult<ED>>;
/** /**

View File

@ -1,6 +1,6 @@
{ {
"name": "oak-memory-tree-store", "name": "oak-memory-tree-store",
"version": "2.2.0", "version": "2.2.1",
"description": "oak框架中内存级store的实现", "description": "oak框架中内存级store的实现",
"author": { "author": {
"name": "XuChang" "name": "XuChang"
@ -9,8 +9,7 @@
"lib/**/*" "lib/**/*"
], ],
"dependencies": { "dependencies": {
"luxon": "^2.3.0", "oak-domain": "^2.4.0",
"oak-domain": "^2.3.0",
"uuid": "^8.3.2" "uuid": "^8.3.2"
}, },
"scripts": { "scripts": {

View File

@ -1,9 +1,8 @@
import { cloneDeep, get, groupBy, set, unset } from 'oak-domain/lib/utils/lodash'; import { cloneDeep, get, groupBy, set, unset } from 'oak-domain/lib/utils/lodash';
import { assert } from 'oak-domain/lib/utils/assert'; import { assert } from 'oak-domain/lib/utils/assert';
import { import {
DeduceCreateSingleOperation, DeduceFilter, DeduceSelection, EntityShape, DeduceRemoveOperation, EntityShape, OperationResult, OperateOption, OpRecord,
DeduceUpdateOperation, DeduceSorter, DeduceSorterAttr, OperationResult, OperateOption, OpRecord, UpdateOpResult, RemoveOpResult, SelectOpResult,
DeduceCreateOperationData, UpdateOpResult, RemoveOpResult, SelectOpResult,
EntityDict, SelectOption, DeleteAtAttribute, AggregationResult, AggregationOp EntityDict, SelectOption, DeleteAtAttribute, AggregationResult, AggregationOp
} from "oak-domain/lib/types/Entity"; } from "oak-domain/lib/types/Entity";
import { ExpressionKey, EXPRESSION_PREFIX, NodeId, RefAttr } from 'oak-domain/lib/types/Demand'; import { ExpressionKey, EXPRESSION_PREFIX, NodeId, RefAttr } from 'oak-domain/lib/types/Demand';
@ -198,7 +197,7 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
private translateLogicFilter<T extends keyof ED, OP extends TreeStoreSelectOption, Cxt extends Context>( private translateLogicFilter<T extends keyof ED, OP extends TreeStoreSelectOption, Cxt extends Context>(
entity: T, entity: T,
filter: DeduceFilter<ED[T]['Schema']>, filter: NonNullable<ED[T]['Selection']['filter']>,
attr: string, attr: string,
context: Cxt, context: Cxt,
option?: OP): (node: RowNode, nodeDict: NodeDict, exprResolveFns: Array<ExprResolveFn>) => boolean { option?: OP): (node: RowNode, nodeDict: NodeDict, exprResolveFns: Array<ExprResolveFn>) => boolean {
@ -206,7 +205,7 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
case '$and': { case '$and': {
const filters = filter[attr]; const filters = filter[attr];
const fns = filters!.map( const fns = filters!.map(
ele => this.translateFilter(entity, ele, context, option) (ele: NonNullable<ED[T]['Selection']['filter']>) => this.translateFilter(entity, ele, context, option)
); );
return (node, nodeDict, exprResolveFns) => { return (node, nodeDict, exprResolveFns) => {
for (const fn of fns) { for (const fn of fns) {
@ -220,7 +219,7 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
case '$or': { case '$or': {
const filters = filter[attr]; const filters = filter[attr];
const fns = filters!.map( const fns = filters!.map(
ele => this.translateFilter(entity, ele, context, option) (ele : NonNullable<ED[T]['Selection']['filter']>) => this.translateFilter(entity, ele, context, option)
); );
return (node, nodeDict, exprResolveFns) => { return (node, nodeDict, exprResolveFns) => {
for (const fn of fns) { for (const fn of fns) {
@ -534,7 +533,7 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
const option2 = Object.assign({}, option, { nodeDict }); const option2 = Object.assign({}, option, { nodeDict });
const legalSets = this.selectAbjointRow(inData.entity, inData, context, option2).map( const legalSets = this.selectAbjointRow(inData.entity, inData, context, option2).map(
(ele) => { (ele) => {
const { data } = inData as DeduceSelection<ED[keyof ED]['Schema']>; const { data } = inData as ED[keyof ED]['Selection'];
const key = Object.keys(data)[0]; const key = Object.keys(data)[0];
return (ele as any)[key]; return (ele as any)[key];
} }
@ -563,7 +562,7 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
try { try {
const legalSets = this.selectAbjointRow(inData.entity, inData, context, option).map( const legalSets = this.selectAbjointRow(inData.entity, inData, context, option).map(
(ele) => { (ele) => {
const { data } = inData as DeduceSelection<ED[keyof ED]['Schema']>; const { data } = inData as ED[keyof ED]['Selection'];
const key = Object.keys(data)[0]; const key = Object.keys(data)[0];
return (ele as any)[key]; return (ele as any)[key];
} }
@ -580,7 +579,7 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
const option2 = Object.assign({}, option, { nodeDict }); const option2 = Object.assign({}, option, { nodeDict });
const legalSets = this.selectAbjointRow(inData.entity, inData, context, option2).map( const legalSets = this.selectAbjointRow(inData.entity, inData, context, option2).map(
(ele) => { (ele) => {
const { data } = inData as DeduceSelection<ED[keyof ED]['Schema']>; const { data } = inData as ED[keyof ED]['Selection'];
const key = Object.keys(data)[0]; const key = Object.keys(data)[0];
return (ele as any)[key]; return (ele as any)[key];
} }
@ -616,7 +615,7 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
private translateFilter<T extends keyof ED, OP extends TreeStoreSelectOption, Cxt extends Context>( private translateFilter<T extends keyof ED, OP extends TreeStoreSelectOption, Cxt extends Context>(
entity: T, entity: T,
filter: DeduceFilter<ED[T]['Schema']>, filter: ED[T]['Selection']['filter'],
context: Cxt, context: Cxt,
option?: OP): (node: RowNode, nodeDict: NodeDict, exprResolveFns: Array<ExprResolveFn>) => boolean { option?: OP): (node: RowNode, nodeDict: NodeDict, exprResolveFns: Array<ExprResolveFn>) => boolean {
const fns: Array<(node: RowNode, nodeDict: NodeDict, exprResolveFns: Array<ExprResolveFn>) => boolean> = []; const fns: Array<(node: RowNode, nodeDict: NodeDict, exprResolveFns: Array<ExprResolveFn>) => boolean> = [];
@ -629,7 +628,7 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
})['#id']; })['#id'];
} }
else if (['$and', '$or', '$xor', '$not'].includes(attr)) { else if (['$and', '$or', '$xor', '$not'].includes(attr)) {
fns.push(this.translateLogicFilter(entity, filter, attr, context, option)); fns.push(this.translateLogicFilter(entity, filter!, attr, context, option));
} }
else if (attr.toLowerCase().startsWith(EXPRESSION_PREFIX)) { else if (attr.toLowerCase().startsWith(EXPRESSION_PREFIX)) {
const fn = this.translateExpression(entity, (filter as any)[attr], context, option); const fn = this.translateExpression(entity, (filter as any)[attr], context, option);
@ -730,7 +729,7 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
private translateSorter<T extends keyof ED, OP extends TreeStoreSelectOption, Cxt extends Context>( private translateSorter<T extends keyof ED, OP extends TreeStoreSelectOption, Cxt extends Context>(
entity: T, entity: T,
sorter: DeduceSorter<ED[T]['Schema']>, sorter: NonNullable<ED[T]['Selection']['sorter']>,
context: Cxt, context: Cxt,
option?: OP): option?: OP):
(row1: object | null | undefined, row2: object | null | undefined) => number { (row1: object | null | undefined, row2: object | null | undefined) => number {
@ -738,7 +737,8 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
row1: object | null | undefined, row1: object | null | undefined,
row2: object | null | undefined, row2: object | null | undefined,
entity2: T2, entity2: T2,
sortAttr: DeduceSorterAttr<ED[T2]['Schema']>, direction?: 'asc' | 'desc'): number => { sortAttr: NonNullable<ED[T]['Selection']['sorter']>[number]['$attr'],
direction?: NonNullable<ED[T]['Selection']['sorter']>[number]['$direction']): number => {
const row11 = row1 as any; const row11 = row1 as any;
const row22 = row2 as any; const row22 = row2 as any;
assert(Object.keys(sortAttr).length === 1); assert(Object.keys(sortAttr).length === 1);
@ -881,14 +881,14 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
protected updateAbjointRow<T extends keyof ED, OP extends TreeStoreOperateOption, Cxt extends Context>( protected updateAbjointRow<T extends keyof ED, OP extends TreeStoreOperateOption, Cxt extends Context>(
entity: T, entity: T,
operation: DeduceCreateSingleOperation<ED[T]['Schema']> | DeduceUpdateOperation<ED[T]['Schema']> | DeduceRemoveOperation<ED[T]['Schema']>, operation: ED[T]['CreateSingle'] | ED[T]['Update'] | ED[T]['Remove'],
context: Cxt, context: Cxt,
option?: OP): number { option?: OP): number {
const { data, action, id: operId } = operation; const { data, action, id: operId } = operation;
switch (action) { switch (action) {
case 'create': { case 'create': {
const { id } = data as DeduceCreateOperationData<ED[T]["Schema"]>; const { id } = data as ED[T]['CreateSingle']['data'];
assert(id); assert(id);
// const node = this.store[entity] && (this.store[entity]!)[id as string]; // const node = this.store[entity] && (this.store[entity]!)[id as string];
// const row = node && this.constructRow(node, context) || {}; // const row = node && this.constructRow(node, context) || {};
@ -973,7 +973,7 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
protected async updateAbjointRowAsync<T extends keyof ED, OP extends TreeStoreOperateOption, Cxt extends Context>( protected async updateAbjointRowAsync<T extends keyof ED, OP extends TreeStoreOperateOption, Cxt extends Context>(
entity: T, entity: T,
operation: DeduceCreateSingleOperation<ED[T]['Schema']> | DeduceUpdateOperation<ED[T]['Schema']> | DeduceRemoveOperation<ED[T]['Schema']>, operation: ED[T]['CreateSingle'] | ED[T]['Update'] | ED[T]['Remove'],
context: Cxt, context: Cxt,
option?: OP) { option?: OP) {
return this.updateAbjointRow(entity, operation, context, option); return this.updateAbjointRow(entity, operation, context, option);
@ -1169,7 +1169,7 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
// 再计算sorter // 再计算sorter
if (sorter) { if (sorter) {
const sorterFn = this.translateSorter(entity, sorter, context, option); const sorterFn = this.translateSorter(entity, sorter as NonNullable<ED[T]['Selection']['sorter']>, context, option);
rows2.sort(sorterFn); rows2.sort(sorterFn);
} }
@ -1602,7 +1602,7 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
this.updateAbjointRow(e, { this.updateAbjointRow(e, {
id: 'dummy', id: 'dummy',
action: 'update', action: 'update',
data: dd, data: dd as any,
filter: { filter: {
id: dd.id, id: dd.id,
} as any, } as any,
@ -1622,7 +1622,7 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
this.updateAbjointRow(e, { this.updateAbjointRow(e, {
id: 'dummy', id: 'dummy',
action: 'update', action: 'update',
data: d, data: d as any,
filter: { filter: {
id: d.id, id: d.id,
} as any, } as any,
@ -1666,7 +1666,7 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends C
this.updateAbjointRow(entity, { this.updateAbjointRow(entity, {
id: 'dummy', id: 'dummy',
action: 'update', action: 'update',
data: d[entity]![id], data: d[entity]![id] as any,
filter: { filter: {
id, id,
} as any, } as any,