diff --git a/es/store.d.ts b/es/store.d.ts index 0ecb905..1495bd8 100644 --- a/es/store.d.ts +++ b/es/store.d.ts @@ -14,8 +14,11 @@ export interface TreeStoreOperateOption extends OperateOption { } export default class TreeStore extends CascadeStore { private store; + private seq; private activeTxnDict; private stat; + private getNextSeq; + private setMaxSeq; protected supportMultipleCreate(): boolean; protected supportManyToOneJoin(): boolean; resetInitialData(data: { diff --git a/es/store.js b/es/store.js index 88e3f05..ded3640 100644 --- a/es/store.js +++ b/es/store.js @@ -18,8 +18,28 @@ class OakExpressionUnresolvedException extends OakException { ; export default class TreeStore extends CascadeStore { store; + seq; activeTxnDict; stat; + getNextSeq(entity) { + if (this.seq[entity]) { + const seq = this.seq[entity]; + this.seq[entity]++; + return seq; + } + this.seq[entity] = 2; + return 1; + } + setMaxSeq(entity, seq) { + if (this.seq[entity]) { + if (this.seq[entity] < seq) { + this.seq[entity] = seq; + } + } + else { + this.seq[entity] = seq; + } + } /* treeStore改成同步以后不会再出现 private async waitOnTxn(id: string, context: Cxt) { // 先检查自己的等待者中有没有id,以避免死锁 @@ -78,10 +98,14 @@ export default class TreeStore extends CascadeStore { }); } if (!row.$$seq$$) { + const seq = this.getNextSeq(entity); Object.assign(row, { - $$seq$$: Math.ceil((Math.random() + 1000) * 100), + $$seq$$: seq, }); } + else { + this.setMaxSeq(entity, row.$$seq$$); + } assert(row.id && !row.id.includes('.')); set(this.store, `${entity}.${row.id}.$current`, row); } @@ -113,6 +137,7 @@ export default class TreeStore extends CascadeStore { remove: 0, commit: 0, }; + this.seq = {}; } constructRow(node, context, option) { let data = cloneDeep(node.$current); @@ -1123,10 +1148,8 @@ export default class TreeStore extends CascadeStore { throw new OakCongruentRowExists(entity, this.constructRow(node, context, option)); } if (!data.$$seq$$) { - // tree-store随意生成即可 - Object.assign(data, { - $$seq$$: Math.ceil((Math.random() + 1000) * 100), - }); + const seq = this.getNextSeq(entity); + data.$$seq$$ = seq; } const node2 = { $txnId: context.getCurrentTxnId(), diff --git a/lib/store.d.ts b/lib/store.d.ts index 0ecb905..1495bd8 100644 --- a/lib/store.d.ts +++ b/lib/store.d.ts @@ -14,8 +14,11 @@ export interface TreeStoreOperateOption extends OperateOption { } export default class TreeStore extends CascadeStore { private store; + private seq; private activeTxnDict; private stat; + private getNextSeq; + private setMaxSeq; protected supportMultipleCreate(): boolean; protected supportManyToOneJoin(): boolean; resetInitialData(data: { diff --git a/lib/store.js b/lib/store.js index b7ab2a6..9d6e6b5 100644 --- a/lib/store.js +++ b/lib/store.js @@ -20,8 +20,28 @@ class OakExpressionUnresolvedException extends Exception_1.OakException { ; class TreeStore extends CascadeStore_1.CascadeStore { store; + seq; activeTxnDict; stat; + getNextSeq(entity) { + if (this.seq[entity]) { + const seq = this.seq[entity]; + this.seq[entity]++; + return seq; + } + this.seq[entity] = 2; + return 1; + } + setMaxSeq(entity, seq) { + if (this.seq[entity]) { + if (this.seq[entity] < seq) { + this.seq[entity] = seq; + } + } + else { + this.seq[entity] = seq; + } + } /* treeStore改成同步以后不会再出现 private async waitOnTxn(id: string, context: Cxt) { // 先检查自己的等待者中有没有id,以避免死锁 @@ -80,10 +100,14 @@ class TreeStore extends CascadeStore_1.CascadeStore { }); } if (!row.$$seq$$) { + const seq = this.getNextSeq(entity); Object.assign(row, { - $$seq$$: Math.ceil((Math.random() + 1000) * 100), + $$seq$$: seq, }); } + else { + this.setMaxSeq(entity, row.$$seq$$); + } (0, assert_1.assert)(row.id && !row.id.includes('.')); (0, lodash_1.set)(this.store, `${entity}.${row.id}.$current`, row); } @@ -115,6 +139,7 @@ class TreeStore extends CascadeStore_1.CascadeStore { remove: 0, commit: 0, }; + this.seq = {}; } constructRow(node, context, option) { let data = (0, lodash_1.cloneDeep)(node.$current); @@ -1125,10 +1150,8 @@ class TreeStore extends CascadeStore_1.CascadeStore { throw new Exception_1.OakCongruentRowExists(entity, this.constructRow(node, context, option)); } if (!data.$$seq$$) { - // tree-store随意生成即可 - Object.assign(data, { - $$seq$$: Math.ceil((Math.random() + 1000) * 100), - }); + const seq = this.getNextSeq(entity); + data.$$seq$$ = seq; } const node2 = { $txnId: context.getCurrentTxnId(), diff --git a/src/store.ts b/src/store.ts index e92b6fb..b231e71 100644 --- a/src/store.ts +++ b/src/store.ts @@ -53,6 +53,9 @@ export default class TreeStore extends C [ID: string]: RowNode; }; }; + private seq: { + [T in keyof ED]?: number; + } private activeTxnDict: { [T: string]: { nodeHeader?: RowNode; @@ -72,6 +75,26 @@ export default class TreeStore extends C commit: number; }; + private getNextSeq(entity: keyof ED) { + if (this.seq[entity]) { + const seq = this.seq[entity]; + this.seq[entity] ++; + return seq; + } + this.seq[entity] = 2; + return 1; + } + + private setMaxSeq(entity: keyof ED, seq: number) { + if (this.seq[entity]) { + if (this.seq[entity] < seq) { + this.seq[entity] = seq; + } + } + else { + this.seq[entity] = seq; + } + } /* treeStore改成同步以后不会再出现 private async waitOnTxn(id: string, context: Cxt) { // 先检查自己的等待者中有没有id,以避免死锁 @@ -140,10 +163,14 @@ export default class TreeStore extends C }); } if (!row.$$seq$$) { + const seq = this.getNextSeq(entity); Object.assign(row, { - $$seq$$: Math.ceil((Math.random() + 1000) * 100), + $$seq$$: seq, }); } + else { + this.setMaxSeq(entity, row.$$seq$$); + } assert(row.id && !row.id.includes('.')); set(this.store, `${entity}.${row.id}.$current`, row); } @@ -181,6 +208,7 @@ export default class TreeStore extends C remove: 0, commit: 0, }; + this.seq = {}; } private constructRow(node: RowNode, context: Cxt, option?: OP) { @@ -1346,10 +1374,8 @@ export default class TreeStore extends C throw new OakCongruentRowExists(entity as string, this.constructRow(node, context, option)!); } if (!data.$$seq$$) { - // tree-store随意生成即可 - Object.assign(data, { - $$seq$$: Math.ceil((Math.random() + 1000) * 100), - }); + const seq = this.getNextSeq(entity); + data.$$seq$$ = seq; } const node2: RowNode = { $txnId: context.getCurrentTxnId()!,