Merge branch 'dev' into release
This commit is contained in:
commit
975b24b6bd
|
|
@ -349,7 +349,7 @@ export class Cache extends Feature {
|
|||
opers.forEach((oper) => {
|
||||
const { entity, operation } = oper;
|
||||
this.cacheStore.operate(entity, operation, this.context, {
|
||||
checkerTypes: ['logical'], // 这里不能检查data,不然在数据没填完前会有大量异常
|
||||
checkerTypes: ['logical'],
|
||||
dontCollect: true,
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import { judgeRelation } from "oak-domain/lib/store/relation";
|
|||
import { Feature } from '../types/Feature';
|
||||
import { generateNewId } from 'oak-domain/lib/utils/uuid';
|
||||
export const MODI_NEXT_PATH_SUFFIX = ':next';
|
||||
const START_LSN = 100;
|
||||
function mergeOperation(schema, entity, oper1, oper2) {
|
||||
const { action, data } = oper2;
|
||||
const operMerged = cloneDeep(oper1);
|
||||
|
|
@ -90,7 +91,7 @@ class UpdateLogManager {
|
|||
constructor(schema, entity, maxLsn) {
|
||||
this.schema = schema,
|
||||
this.entity = entity,
|
||||
this.maxLsn = maxLsn || 0;
|
||||
this.maxLsn = maxLsn || START_LSN;
|
||||
}
|
||||
/**
|
||||
* 合并两个filter完全一致的更新
|
||||
|
|
@ -165,7 +166,7 @@ class UpdateLogManager {
|
|||
rollback(lsn) {
|
||||
const newLogs = this.logs.filter(ele => ele.lsn <= lsn);
|
||||
this.logs = newLogs;
|
||||
this.maxLsn = lsn;
|
||||
this.maxLsn = lsn || START_LSN;
|
||||
}
|
||||
makeOperations() {
|
||||
const opers = {};
|
||||
|
|
@ -1431,7 +1432,7 @@ class SingleNode extends Node {
|
|||
saveRefreshResult(data) {
|
||||
const ids = Object.keys(data);
|
||||
assert(ids.length === 1);
|
||||
this.id = ids[0];
|
||||
this.setId(ids[0]);
|
||||
this.sr = data[ids[0]];
|
||||
this.passRsToChild();
|
||||
// this.publish();
|
||||
|
|
@ -1743,7 +1744,7 @@ export class RunningTree extends Feature {
|
|||
this.nodeCountDict = {};
|
||||
this.pageNodeStack = {};
|
||||
this.singletonDict = {};
|
||||
this.logSerailNumber = 100;
|
||||
this.logSerailNumber = START_LSN;
|
||||
}
|
||||
increaseNodeCount(path) {
|
||||
if (!this.nodeCountDict[path]) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "oak-frontend-base",
|
||||
"version": "5.2.5",
|
||||
"version": "5.2.6",
|
||||
"description": "oak框架中前端与业务逻辑无关的平台部分",
|
||||
"author": {
|
||||
"name": "XuChang"
|
||||
|
|
|
|||
|
|
@ -15,10 +15,11 @@ import { ActionDef } from '../types/Page';
|
|||
import { generateNewId } from 'oak-domain/lib/utils/uuid';
|
||||
|
||||
export const MODI_NEXT_PATH_SUFFIX = ':next';
|
||||
const START_LSN = 100;
|
||||
|
||||
type LegalOperation<ED extends EntityDict & BaseEntityDict, T extends keyof ED> = ED[T]['CreateSingle']
|
||||
| ED[T]['Update']
|
||||
| ED[T]['Remove'];
|
||||
| ED[T]['Update']
|
||||
| ED[T]['Remove'];
|
||||
|
||||
type UpdateLog<ED extends EntityDict & BaseEntityDict, T extends keyof ED> = {
|
||||
lsn: number;
|
||||
|
|
@ -26,7 +27,7 @@ type UpdateLog<ED extends EntityDict & BaseEntityDict, T extends keyof ED> = {
|
|||
};
|
||||
|
||||
|
||||
function mergeOperation<ED extends EntityDict & BaseEntityDict, T extends keyof ED> (
|
||||
function mergeOperation<ED extends EntityDict & BaseEntityDict, T extends keyof ED>(
|
||||
schema: StorageSchema<ED>,
|
||||
entity: T,
|
||||
oper1: LegalOperation<ED, T>,
|
||||
|
|
@ -83,7 +84,7 @@ function mergeOperation<ED extends EntityDict & BaseEntityDict, T extends keyof
|
|||
dataMerged[attr] = cloneDeep(data[attr]);
|
||||
}
|
||||
}
|
||||
else if (typeof rel === 'string') {
|
||||
else if (typeof rel === 'string') {
|
||||
if (dataMerged[attr]) {
|
||||
const merged = mergeOperation(
|
||||
schema,
|
||||
|
|
@ -116,7 +117,7 @@ function mergeOperation<ED extends EntityDict & BaseEntityDict, T extends keyof
|
|||
}
|
||||
}
|
||||
return operMerged;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 树结点上的更新日志管理
|
||||
*/
|
||||
|
|
@ -129,8 +130,8 @@ class UpdateLogManager<ED extends EntityDict & BaseEntityDict, T extends keyof E
|
|||
|
||||
constructor(schema: StorageSchema<ED>, entity: T, maxLsn?: number) {
|
||||
this.schema = schema,
|
||||
this.entity = entity,
|
||||
this.maxLsn = maxLsn || 0;
|
||||
this.entity = entity,
|
||||
this.maxLsn = maxLsn || START_LSN;
|
||||
}
|
||||
/**
|
||||
* 合并两个filter完全一致的更新
|
||||
|
|
@ -213,7 +214,7 @@ class UpdateLogManager<ED extends EntityDict & BaseEntityDict, T extends keyof E
|
|||
ele => ele.lsn <= lsn
|
||||
);
|
||||
this.logs = newLogs;
|
||||
this.maxLsn = lsn;
|
||||
this.maxLsn = lsn || START_LSN;
|
||||
}
|
||||
|
||||
makeOperations() {
|
||||
|
|
@ -981,7 +982,7 @@ class ListNode<
|
|||
undefinedAttrs.push(k);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
undefinedAttrs.forEach(
|
||||
(attr) => unset(data, attr)
|
||||
);
|
||||
|
|
@ -1017,16 +1018,16 @@ class ListNode<
|
|||
if (childOperations) {
|
||||
childOperations.forEach(
|
||||
(childOperation) => this.ulManager.push(ulmLsn + 100, childOperation.operation as any)
|
||||
);
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const operations = this.ulManager.makeOperations();
|
||||
this.ulManager.rollback(ulmLsn);
|
||||
|
||||
return operations.map(
|
||||
(operation) => {
|
||||
const { filter, ...rest} = operation;
|
||||
const { filter, ...rest } = operation;
|
||||
return {
|
||||
entity: this.entity,
|
||||
operation: {
|
||||
|
|
@ -1389,7 +1390,7 @@ class SingleNode<ED extends EntityDict & BaseEntityDict,
|
|||
if (id !== this.id) {
|
||||
const operations = this.ulManager.makeOperations();
|
||||
assert(operations.length <= 1);
|
||||
const [ operation ] = operations;
|
||||
const [operation] = operations;
|
||||
// 如果本身是create, 这里无视就行(因为框架原因会调用一次)
|
||||
if (operation?.action === 'create') {
|
||||
if (operation.data.id === id) {
|
||||
|
|
@ -1417,7 +1418,7 @@ class SingleNode<ED extends EntityDict & BaseEntityDict,
|
|||
}
|
||||
const operations = this.ulManager.makeOperations();
|
||||
assert(operations.length <= 1);
|
||||
const [ operation ] = operations;
|
||||
const [operation] = operations;
|
||||
if (operation && operation?.action === 'create') {
|
||||
return operation.data.id;
|
||||
}
|
||||
|
|
@ -1506,14 +1507,14 @@ class SingleNode<ED extends EntityDict & BaseEntityDict,
|
|||
(attr) => unset(data, attr)
|
||||
);
|
||||
|
||||
this.ulManager.push(lsn, {
|
||||
this.ulManager.push(lsn, {
|
||||
action: action || 'update',
|
||||
data,
|
||||
filter: {
|
||||
id: this.getId()!,
|
||||
}
|
||||
} as unknown as Omit<ED[T]['Operation'], "id">);
|
||||
|
||||
|
||||
|
||||
// 处理外键,如果update的数据中有相应的外键,其子对象上的动作应当被clean掉
|
||||
// 并将sr传递到子组件上
|
||||
|
|
@ -1544,7 +1545,7 @@ class SingleNode<ED extends EntityDict & BaseEntityDict,
|
|||
action: 'remove',
|
||||
data: {},
|
||||
filter: {
|
||||
id,
|
||||
id,
|
||||
}
|
||||
} as unknown as Omit<ED[T]['Remove'], "id">);
|
||||
|
||||
|
|
@ -1558,7 +1559,7 @@ class SingleNode<ED extends EntityDict & BaseEntityDict,
|
|||
action: 'update',
|
||||
data: {},
|
||||
filter: {
|
||||
id,
|
||||
id,
|
||||
}
|
||||
} as unknown as Omit<ED[T]['Update'], "id">);
|
||||
super.setDirty();
|
||||
|
|
@ -1579,7 +1580,7 @@ class SingleNode<ED extends EntityDict & BaseEntityDict,
|
|||
assert(childOperations.length === 1);
|
||||
this.ulManager.push(lsnMax + 100, {
|
||||
action: 'update',
|
||||
data: {
|
||||
data: {
|
||||
[ele2]: childOperations[0].operation,
|
||||
},
|
||||
filter: {
|
||||
|
|
@ -1594,7 +1595,7 @@ class SingleNode<ED extends EntityDict & BaseEntityDict,
|
|||
data: {
|
||||
[ele2]: childOperations.map(
|
||||
({ operation }) => operation
|
||||
),
|
||||
),
|
||||
},
|
||||
filter: {
|
||||
id: this.getId(),
|
||||
|
|
@ -1607,12 +1608,12 @@ class SingleNode<ED extends EntityDict & BaseEntityDict,
|
|||
this.ulManager.rollback(lsnMax);
|
||||
|
||||
assert(operations.length <= 1);
|
||||
const [ operation ] = operations;
|
||||
|
||||
const [operation] = operations;
|
||||
|
||||
if (operation) {
|
||||
const { filter, ...rest } = operation;
|
||||
const intrinsticFilter = this.getIntrinsticFilters();
|
||||
|
||||
|
||||
return [
|
||||
{
|
||||
entity: this.entity,
|
||||
|
|
@ -1728,7 +1729,7 @@ class SingleNode<ED extends EntityDict & BaseEntityDict,
|
|||
saveRefreshResult(data: Record<string, any>) {
|
||||
const ids = Object.keys(data);
|
||||
assert(ids.length === 1);
|
||||
this.id = ids[0];
|
||||
this.setId(ids[0]);
|
||||
this.sr = data[ids[0]!];
|
||||
this.passRsToChild();
|
||||
|
||||
|
|
@ -1784,7 +1785,7 @@ class SingleNode<ED extends EntityDict & BaseEntityDict,
|
|||
|
||||
private getFilter(): ED[T]['Selection']['filter'] | undefined {
|
||||
// 如果是新建,等于没有filter
|
||||
const [ operation ] = this.ulManager.makeOperations();
|
||||
const [operation] = this.ulManager.makeOperations();
|
||||
if (operation?.action === 'create') {
|
||||
return;
|
||||
}
|
||||
|
|
@ -2022,7 +2023,7 @@ class VirtualNode<ED extends EntityDict & BaseEntityDict> extends Feature {
|
|||
for (const ele in this.children) {
|
||||
this.children[ele].clean(lsn, dontPublish);
|
||||
}
|
||||
|
||||
|
||||
if (!lsn) {
|
||||
this.dirty = false;
|
||||
}
|
||||
|
|
@ -2107,7 +2108,7 @@ export class RunningTree<ED extends EntityDict & BaseEntityDict> extends Feature
|
|||
this.nodeCountDict = {};
|
||||
this.pageNodeStack = {};
|
||||
this.singletonDict = {};
|
||||
this.logSerailNumber = 100;
|
||||
this.logSerailNumber = START_LSN;
|
||||
}
|
||||
|
||||
private increaseNodeCount(path: string) {
|
||||
|
|
@ -2799,10 +2800,10 @@ export class RunningTree<ED extends EntityDict & BaseEntityDict> extends Feature
|
|||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
savePoint() {
|
||||
const lsn = this.logSerailNumber;
|
||||
this.logSerailNumber ++;
|
||||
this.logSerailNumber++;
|
||||
return lsn;
|
||||
}
|
||||
|
||||
|
|
@ -2812,7 +2813,7 @@ export class RunningTree<ED extends EntityDict & BaseEntityDict> extends Feature
|
|||
* @param lsn 要清除到某个指定的savepoint,不设则完全清空
|
||||
* @param dontPublish
|
||||
*/
|
||||
clean(path: string, lsn?:number, dontPublish?: true) {
|
||||
clean(path: string, lsn?: number, dontPublish?: true) {
|
||||
const node = this.findNode(path)!;
|
||||
|
||||
node.clean(lsn, dontPublish);
|
||||
|
|
|
|||
Loading…
Reference in New Issue