opRecords中的selection支持id

This commit is contained in:
Xu Chang 2025-05-08 10:24:27 +08:00
parent abad1f2d8f
commit 6c5c0b8159
4 changed files with 27 additions and 18 deletions

View File

@ -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 = [];

View File

@ -182,6 +182,7 @@ export type CascadeRelationAuth<R extends string> = {
[K in R]?: CascadeRelationItem | (CascadeRelationItem | CascadeRelationItem[])[];
};
export type SelectOpResult<ED extends EntityDict> = {
id?: string;
a: 's';
d: {
[T in keyof ED]?: {

View File

@ -2048,7 +2048,7 @@ export abstract class CascadeStore<ED extends EntityDict & BaseEntityDict> exten
* @param rows
* @param context
*/
private addToResultSelections<T extends keyof ED, Cxt extends AsyncContext<ED>>(entity: T, rows: Partial<ED[T]['Schema']>[], context: Cxt) {
private addToResultSelections<T extends keyof ED, Cxt extends AsyncContext<ED>>(entity: T, rows: Partial<ED[T]['Schema']>[], context: Cxt, id?: string) {
if (this.supportManyToOneJoin()) {
// 这里的外键连接有可能为空需要使用所有的行的attr的并集来测试
const attrs = uniq(rows.map(
@ -2060,13 +2060,13 @@ export abstract class CascadeStore<ED extends EntityDict & BaseEntityDict> exten
const data: Partial<ED[T]['Schema']> = {}
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<ED extends EntityDict & BaseEntityDict> exten
const originRows = rows.map(
ele => pick(ele, attrsToPick)
) as Partial<ED[T]['Schema']>[];
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<T extends keyof ED, Cxt extends AsyncContext<ED>>(entity: T, rows: Partial<ED[T]['OpSchema']>[], context: Cxt) {
private addSingleRowToResultSelections<T extends keyof ED, Cxt extends AsyncContext<ED>>(
entity: T,
rows: Partial<ED[T]['OpSchema']>[],
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<ED>).d[entity];
if (entityBranch) {
rows.forEach(
@ -2109,6 +2114,7 @@ export abstract class CascadeStore<ED extends EntityDict & BaseEntityDict> exten
}
else {
lastOperation = {
id,
a: 's',
d: {},
};
@ -2172,7 +2178,7 @@ export abstract class CascadeStore<ED extends EntityDict & BaseEntityDict> exten
}
if (!option.dontCollect) {
this.addToResultSelections(entity, rows, context);
this.addToResultSelections(entity, rows, context, selection.id);
}
if (cascadeSelectionFns.length > 0) {

View File

@ -233,6 +233,7 @@ export type CascadeRelationAuth<R extends string> = {
// Select的级联可以去重压缩返回的数据大小
export type SelectOpResult<ED extends EntityDict> = {
id?: string;
a: 's',
d: {
[T in keyof ED]?: {