实现递增的seq

This commit is contained in:
Xu Chang 2023-11-30 18:41:19 +08:00
parent d710bdc7d0
commit fdff94cfcc
5 changed files with 93 additions and 15 deletions

3
es/store.d.ts vendored
View File

@ -14,8 +14,11 @@ export interface TreeStoreOperateOption extends OperateOption {
}
export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends CascadeStore<ED> {
private store;
private seq;
private activeTxnDict;
private stat;
private getNextSeq;
private setMaxSeq;
protected supportMultipleCreate(): boolean;
protected supportManyToOneJoin(): boolean;
resetInitialData(data: {

View File

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

3
lib/store.d.ts vendored
View File

@ -14,8 +14,11 @@ export interface TreeStoreOperateOption extends OperateOption {
}
export default class TreeStore<ED extends EntityDict & BaseEntityDict> extends CascadeStore<ED> {
private store;
private seq;
private activeTxnDict;
private stat;
private getNextSeq;
private setMaxSeq;
protected supportMultipleCreate(): boolean;
protected supportManyToOneJoin(): boolean;
resetInitialData(data: {

View File

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

View File

@ -53,6 +53,9 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> 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<ED extends EntityDict & BaseEntityDict> 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<ED extends EntityDict & BaseEntityDict> 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<ED extends EntityDict & BaseEntityDict> extends C
remove: 0,
commit: 0,
};
this.seq = {};
}
private constructRow<Cxt extends Context, OP extends TreeStoreSelectOption>(node: RowNode, context: Cxt, option?: OP) {
@ -1346,10 +1374,8 @@ export default class TreeStore<ED extends EntityDict & BaseEntityDict> 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()!,