实现递增的seq
This commit is contained in:
parent
d710bdc7d0
commit
fdff94cfcc
|
|
@ -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: {
|
||||
|
|
|
|||
33
es/store.js
33
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(),
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
33
lib/store.js
33
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(),
|
||||
|
|
|
|||
36
src/store.ts
36
src/store.ts
|
|
@ -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()!,
|
||||
|
|
|
|||
Loading…
Reference in New Issue