From 6c5c0b8159ec9909965fc62a14543fd490f0e521 Mon Sep 17 00:00:00 2001 From: Xc Date: Thu, 8 May 2025 10:24:27 +0800 Subject: [PATCH] =?UTF-8?q?opRecords=E4=B8=AD=E7=9A=84selection=E6=94=AF?= =?UTF-8?q?=E6=8C=81id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/store/CascadeStore.js | 19 ++++++++++--------- lib/types/Entity.d.ts | 1 + src/store/CascadeStore.ts | 24 +++++++++++++++--------- src/types/Entity.ts | 1 + 4 files changed, 27 insertions(+), 18 deletions(-) diff --git a/lib/store/CascadeStore.js b/lib/store/CascadeStore.js index dcb098f..9340398 100644 --- a/lib/store/CascadeStore.js +++ b/lib/store/CascadeStore.js @@ -1662,7 +1662,7 @@ class CascadeStore extends RowStore_1.RowStore { * @param rows * @param context */ - addToResultSelections(entity, rows, context) { + addToResultSelections(entity, rows, context, id) { if (this.supportManyToOneJoin()) { // 这里的外键连接有可能为空,需要使用所有的行的attr的并集来测试 const attrs = (0, lodash_1.uniq)(rows.map(ele => Object.keys(ele)).flat()); @@ -1671,29 +1671,29 @@ class CascadeStore extends RowStore_1.RowStore { const data = {}; const rel = this.judgeRelation(entity, attr); if (rel === 2) { - this.addToResultSelections(attr, rows.map(ele => ele[attr]).filter(ele => !!ele), context); + this.addToResultSelections(attr, rows.map(ele => ele[attr]).filter(ele => !!ele), context, id); } else if (typeof rel === 'string') { - this.addToResultSelections(rel, rows.map(ele => ele[attr]).filter(ele => !!ele), context); + this.addToResultSelections(rel, rows.map(ele => ele[attr]).filter(ele => !!ele), context, id); } else if (rel instanceof Array) { - this.addToResultSelections(rel[0], rows.map(ele => ele[attr]).reduce((prev, current) => prev.concat(current), []), context); + this.addToResultSelections(rel[0], rows.map(ele => ele[attr]).reduce((prev, current) => prev.concat(current), []), context, id); } else { attrsToPick.push(attr); } } const originRows = rows.map(ele => (0, lodash_1.pick)(ele, attrsToPick)); - this.addSingleRowToResultSelections(entity, originRows, context); + this.addSingleRowToResultSelections(entity, originRows, context, id); } else { - this.addSingleRowToResultSelections(entity, rows, context); + this.addSingleRowToResultSelections(entity, rows, context, id); } } - addSingleRowToResultSelections(entity, rows, context) { + addSingleRowToResultSelections(entity, rows, context, id) { const { opRecords } = context; let lastOperation = opRecords[opRecords.length - 1]; - if (lastOperation && lastOperation.a === 's') { + if (lastOperation && lastOperation.a === 's' && id === lastOperation.id) { const entityBranch = lastOperation.d[entity]; if (entityBranch) { rows.forEach((row) => { @@ -1714,6 +1714,7 @@ class CascadeStore extends RowStore_1.RowStore { } else { lastOperation = { + id, a: 's', d: {}, }; @@ -1758,7 +1759,7 @@ class CascadeStore extends RowStore_1.RowStore { }); } if (!option.dontCollect) { - this.addToResultSelections(entity, rows, context); + this.addToResultSelections(entity, rows, context, selection.id); } if (cascadeSelectionFns.length > 0) { const ruException = []; diff --git a/lib/types/Entity.d.ts b/lib/types/Entity.d.ts index 6a9d535..f66401a 100644 --- a/lib/types/Entity.d.ts +++ b/lib/types/Entity.d.ts @@ -182,6 +182,7 @@ export type CascadeRelationAuth = { [K in R]?: CascadeRelationItem | (CascadeRelationItem | CascadeRelationItem[])[]; }; export type SelectOpResult = { + id?: string; a: 's'; d: { [T in keyof ED]?: { diff --git a/src/store/CascadeStore.ts b/src/store/CascadeStore.ts index 38e0dcb..2144531 100644 --- a/src/store/CascadeStore.ts +++ b/src/store/CascadeStore.ts @@ -2048,7 +2048,7 @@ export abstract class CascadeStore exten * @param rows * @param context */ - private addToResultSelections>(entity: T, rows: Partial[], context: Cxt) { + private addToResultSelections>(entity: T, rows: Partial[], context: Cxt, id?: string) { if (this.supportManyToOneJoin()) { // 这里的外键连接有可能为空,需要使用所有的行的attr的并集来测试 const attrs = uniq(rows.map( @@ -2060,13 +2060,13 @@ export abstract class CascadeStore exten const data: Partial = {} const rel = this.judgeRelation(entity, attr); if (rel === 2) { - this.addToResultSelections(attr, rows.map(ele => ele[attr]!).filter(ele => !!ele), context); + this.addToResultSelections(attr, rows.map(ele => ele[attr]!).filter(ele => !!ele), context, id); } else if (typeof rel === 'string') { - this.addToResultSelections(rel, rows.map(ele => ele[attr]!).filter(ele => !!ele), context); + this.addToResultSelections(rel, rows.map(ele => ele[attr]!).filter(ele => !!ele), context, id); } else if (rel instanceof Array) { - this.addToResultSelections(rel[0], rows.map(ele => ele[attr]!).reduce((prev, current) => prev.concat(current), [] as any[]), context); + this.addToResultSelections(rel[0], rows.map(ele => ele[attr]!).reduce((prev, current) => prev.concat(current), [] as any[]), context, id); } else { attrsToPick.push(attr); @@ -2075,18 +2075,23 @@ export abstract class CascadeStore exten const originRows = rows.map( ele => pick(ele, attrsToPick) ) as Partial[]; - this.addSingleRowToResultSelections(entity, originRows, context); + this.addSingleRowToResultSelections(entity, originRows, context, id); } else { - this.addSingleRowToResultSelections(entity, rows, context); + this.addSingleRowToResultSelections(entity, rows, context, id); } } - private addSingleRowToResultSelections>(entity: T, rows: Partial[], context: Cxt) { + private addSingleRowToResultSelections>( + entity: T, + rows: Partial[], + context: Cxt, + id?: string + ) { const { opRecords } = context; let lastOperation = opRecords[opRecords.length - 1]; - if (lastOperation && lastOperation.a === 's') { + if (lastOperation && lastOperation.a === 's' && id === lastOperation.id) { const entityBranch = (lastOperation as SelectOpResult).d[entity]; if (entityBranch) { rows.forEach( @@ -2109,6 +2114,7 @@ export abstract class CascadeStore exten } else { lastOperation = { + id, a: 's', d: {}, }; @@ -2172,7 +2178,7 @@ export abstract class CascadeStore exten } if (!option.dontCollect) { - this.addToResultSelections(entity, rows, context); + this.addToResultSelections(entity, rows, context, selection.id); } if (cascadeSelectionFns.length > 0) { diff --git a/src/types/Entity.ts b/src/types/Entity.ts index 59d66f7..ad2eb8e 100644 --- a/src/types/Entity.ts +++ b/src/types/Entity.ts @@ -233,6 +233,7 @@ export type CascadeRelationAuth = { // Select的级联可以去重,压缩返回的数据大小 export type SelectOpResult = { + id?: string; a: 's', d: { [T in keyof ED]?: {