Commit fe36f91890dd6a5ba42057e8bc3d8f4d1c205238

Authored by Igor Kulikov
1 parent 887188fe

Alias: Batch support for fetching entities from relations

@@ -1007,16 +1007,40 @@ export class EntityService { @@ -1007,16 +1007,40 @@ export class EntityService {
1007 private entityRelationInfosToEntitiesInfo(entityRelations: Array<EntityRelationInfo>, 1007 private entityRelationInfosToEntitiesInfo(entityRelations: Array<EntityRelationInfo>,
1008 direction: EntitySearchDirection): Observable<Array<EntityInfo>> { 1008 direction: EntitySearchDirection): Observable<Array<EntityInfo>> {
1009 if (entityRelations.length) { 1009 if (entityRelations.length) {
1010 - const tasks: Observable<EntityInfo>[] = []; 1010 + const packs: Observable<EntityInfo>[][] = [];
  1011 + let packTasks: Observable<EntityInfo>[] = [];
1011 entityRelations.forEach((entityRelation) => { 1012 entityRelations.forEach((entityRelation) => {
1012 - tasks.push(this.entityRelationInfoToEntityInfo(entityRelation, direction)); 1013 + packTasks.push(this.entityRelationInfoToEntityInfo(entityRelation, direction));
  1014 + if (packTasks.length === 100) {
  1015 + packs.push(packTasks);
  1016 + packTasks = [];
  1017 + }
1013 }); 1018 });
1014 - return forkJoin(tasks); 1019 + if (packTasks.length) {
  1020 + packs.push(packTasks);
  1021 + }
  1022 + return this.executePack(packs, 0);
1015 } else { 1023 } else {
1016 return of([]); 1024 return of([]);
1017 } 1025 }
1018 } 1026 }
1019 1027
  1028 + private executePack(packs: Observable<EntityInfo>[][], index: number): Observable<Array<EntityInfo>> {
  1029 + return forkJoin(packs[index]).pipe(
  1030 + expand(() => {
  1031 + index++;
  1032 + if (packs[index]) {
  1033 + return forkJoin(packs[index]);
  1034 + } else {
  1035 + return EMPTY;
  1036 + }
  1037 + }
  1038 + ),
  1039 + concatMap((data) => data),
  1040 + toArray()
  1041 + );
  1042 + }
  1043 +
1020 private entityRelationInfoToEntityInfo(entityRelationInfo: EntityRelationInfo, direction: EntitySearchDirection): Observable<EntityInfo> { 1044 private entityRelationInfoToEntityInfo(entityRelationInfo: EntityRelationInfo, direction: EntitySearchDirection): Observable<EntityInfo> {
1021 const entityId = direction === EntitySearchDirection.FROM ? entityRelationInfo.to : entityRelationInfo.from; 1045 const entityId = direction === EntitySearchDirection.FROM ? entityRelationInfo.to : entityRelationInfo.from;
1022 return this.getEntity(entityId.entityType as EntityType, entityId.id, {ignoreLoading: true, ignoreErrors: true}).pipe( 1046 return this.getEntity(entityId.entityType as EntityType, entityId.id, {ignoreLoading: true, ignoreErrors: true}).pipe(