opRecords中的selection支持id
This commit is contained in:
parent
abad1f2d8f
commit
6c5c0b8159
|
|
@ -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 = [];
|
||||
|
|
|
|||
|
|
@ -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]?: {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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]?: {
|
||||
|
|
|
|||
Loading…
Reference in New Issue