Skip to content

Commit eb82292

Browse files
committed
batch
1 parent c0b78c5 commit eb82292

File tree

3 files changed

+75
-39
lines changed

3 files changed

+75
-39
lines changed

packages/services/api/src/modules/organization/providers/organization-members.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -337,10 +337,10 @@ export class OrganizationMembers {
337337

338338
const targetAssignments = filteredProjects.flatMap(project => project.targets.targets);
339339

340-
const targets = await this.storage.findTargetsByIds(
341-
member.organizationId,
342-
targetAssignments.map(target => target.id),
343-
);
340+
const targets = await this.storage.findTargetsByIds({
341+
organizationId: member.organizationId,
342+
targetIds: targetAssignments.map(target => target.id),
343+
});
344344

345345
return {
346346
mode: member.assignedRole.resources.mode === '*' ? ('all' as const) : ('granular' as const),
@@ -468,10 +468,10 @@ export class OrganizationMembers {
468468
}
469469
}
470470

471-
const targets = await this.storage.findTargetsByIds(
472-
organization.id,
473-
Array.from(targetLookupIds),
474-
);
471+
const targets = await this.storage.findTargetsByIds({
472+
organizationId: organization.id,
473+
targetIds: Array.from(targetLookupIds),
474+
});
475475

476476
for (const record of projectTargetAssignments) {
477477
for (const targetRecord of record.targets) {

packages/services/api/src/modules/shared/providers/storage.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ export interface Storage {
205205

206206
getProjects(_: OrganizationSelector): Promise<Project[] | never>;
207207

208-
findProjectsByIds(projectIds: Array<string>): Promise<Map<string, Project>>;
208+
findProjectsByIds(args: { projectIds: Array<string> }): Promise<Map<string, Project>>;
209209

210210
createProject(_: Pick<Project, 'type'> & { slug: string } & OrganizationSelector): Promise<
211211
| {
@@ -304,7 +304,10 @@ export interface Storage {
304304

305305
getTargets(_: ProjectSelector): Promise<readonly Target[]>;
306306

307-
findTargetsByIds(organizationId: string, targetIds: Array<string>): Promise<Map<string, Target>>;
307+
findTargetsByIds(args: {
308+
organizationId: string;
309+
targetIds: Array<string>;
310+
}): Promise<Map<string, Target>>;
308311

309312
getTargetIdsOfOrganization(_: OrganizationSelector): Promise<readonly string[]>;
310313
getTargetIdsOfProject(_: ProjectSelector): Promise<readonly string[]>;

packages/services/storage/src/index.ts

Lines changed: 62 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import {
3232
type SchemaLog,
3333
type SchemaPolicy,
3434
} from '../../api/src/shared/entities';
35-
import { batch } from '../../api/src/shared/helpers';
35+
import { batch, batchBy } from '../../api/src/shared/helpers';
3636
import {
3737
alert_channels,
3838
alerts,
@@ -1398,18 +1398,30 @@ export async function createStorage(
13981398

13991399
return result.rows.map(transformProject);
14001400
},
1401-
async findProjectsByIds(ids) {
1402-
const result = await pool.query<Slonik<projects>>(
1403-
sql`/* findProjectsByIds */ SELECT * FROM projects WHERE id = ANY(${sql.array(ids, 'uuid')}) AND type != 'CUSTOM'`,
1404-
);
1401+
findProjectsByIds: batch<{ projectIds: Array<string> }, Map<string, Project>>(
1402+
async function FindProjectByIdsBatchHandler(args) {
1403+
const allProjectIds = args.flatMap(args => args.projectIds);
1404+
const result = await pool.query<Slonik<projects>>(
1405+
sql`/* findProjectsByIds */ SELECT * FROM projects WHERE id = ANY(${sql.array(allProjectIds, 'uuid')}) AND type != 'CUSTOM'`,
1406+
);
14051407

1406-
const map = new Map<string, Project>();
1407-
result.rows.forEach(row => {
1408-
const project = transformProject(row);
1409-
map.set(project.id, project);
1410-
});
1411-
return map;
1412-
},
1408+
const allProjectsLookupMap = new Map<string, Project>();
1409+
result.rows.forEach(row => {
1410+
const project = transformProject(row);
1411+
allProjectsLookupMap.set(project.id, project);
1412+
});
1413+
return args.map(async arg => {
1414+
const map = new Map<string, Project>();
1415+
for (const projectId of arg.projectIds) {
1416+
const project = allProjectsLookupMap.get(projectId);
1417+
if (!project) continue;
1418+
map.set(projectId, project);
1419+
}
1420+
1421+
return map;
1422+
});
1423+
},
1424+
),
14131425
async updateProjectSlug({ slug, organizationId: organization, projectId: project }) {
14141426
return pool.transaction(async t => {
14151427
const projectSlugExists = await t.exists(
@@ -1701,29 +1713,50 @@ export async function createStorage(
17011713
orgId: organization,
17021714
}));
17031715
},
1704-
async findTargetsByIds(organizationId, targetIds) {
1705-
const map = new Map<string, Target>();
1716+
findTargetsByIds: batchBy<
1717+
{
1718+
organizationId: string;
1719+
targetIds: Array<string>;
1720+
},
1721+
Map<string, Target>
1722+
>(
1723+
org => org.organizationId,
1724+
async function FindTargetsByIdsBatchHandler(args) {
1725+
const resultLookupMap = new Map<string, Target>();
17061726

1707-
if (targetIds.length === 0) {
1708-
return map;
1709-
}
1727+
const allTargetIds = args.flatMap(arg => arg.targetIds);
17101728

1711-
const results = await pool.query<unknown>(sql`/* getTargets */
1712-
SELECT
1729+
if (allTargetIds.length === 0) {
1730+
return args.map(async () => resultLookupMap);
1731+
}
1732+
1733+
const orgId = args[0].organizationId;
1734+
1735+
const results = await pool.query<unknown>(sql`/* getTargets */
1736+
SELECT
17131737
${targetSQLFields}
1714-
FROM
1738+
FROM
17151739
"targets"
1716-
WHERE
1717-
"id" = ANY(${sql.array(targetIds, 'uuid')})
1718-
`);
1740+
WHERE
1741+
"id" = ANY(${sql.array(allTargetIds, 'uuid')})
1742+
`);
17191743

1720-
for (const row of results.rows) {
1721-
const target: Target = { ...TargetModel.parse(row), orgId: organizationId };
1722-
map.set(target.id, target);
1723-
}
1744+
for (const row of results.rows) {
1745+
const target: Target = { ...TargetModel.parse(row), orgId };
1746+
resultLookupMap.set(target.id, target);
1747+
}
17241748

1725-
return map;
1726-
},
1749+
return args.map(async arg => {
1750+
const map = new Map<string, Target>();
1751+
for (const targetId of arg.targetIds) {
1752+
const target = resultLookupMap.get(targetId);
1753+
if (!target) continue;
1754+
map.set(targetId, target);
1755+
}
1756+
return map;
1757+
});
1758+
},
1759+
),
17271760
async getTargetIdsOfOrganization({ organizationId: organization }) {
17281761
const results = await pool.query<Slonik<Pick<targets, 'id'>>>(
17291762
sql`/* getTargetIdsOfOrganization */

0 commit comments

Comments
 (0)