1. รวม query_employeePosMaster กับ query_employeeTempPosMaster ให้ดึงแบบขนานด้วย Promise.all
2. ตัด full-table scan ของ ProfileEmployee ออก โดยเปลี่ยนจาก find({ select: ["id"] }) ทั้งตาราง มาเป็น query เฉพาะ current_holderId ที่อ้างถึงจริงในชุดข้อมูล publish
3. เก็บ normalization ของ _orgemployeePosMaster และ _orgemployeeTempPosMaster ไว้หลัง query ชุดเดียวกัน ทำให้ block นี้กระชับขึ้นและลด read cost ที่ไม่จำเป็น
This commit is contained in:
parent
b5c75379ff
commit
e7e4e2075b
1 changed files with 35 additions and 29 deletions
|
|
@ -1161,21 +1161,38 @@ async function handler_org(msg: amqp.ConsumeMessage): Promise<boolean> {
|
||||||
}
|
}
|
||||||
console.timeEnd("[AMQ] clone_permissionProfiles");
|
console.timeEnd("[AMQ] clone_permissionProfiles");
|
||||||
|
|
||||||
//หา dna posmaster ถ้าไม่มีให้เอาตัวเองเป็น dna
|
console.time("[AMQ] query_employee_org_structures");
|
||||||
console.time("[AMQ] query_employeePosMaster");
|
const [orgemployeePosMaster, orgemployeeTempPosMaster] = await Promise.all([
|
||||||
const orgemployeePosMaster = await repoEmployeePosmaster.find({
|
repoEmployeePosmaster.find({
|
||||||
where: { orgRevisionId: orgRevisionPublish.id },
|
where: { orgRevisionId: orgRevisionPublish.id },
|
||||||
relations: ["positions"],
|
relations: ["positions"],
|
||||||
});
|
}),
|
||||||
console.timeEnd("[AMQ] query_employeePosMaster");
|
repoEmployeeTempPosmaster.find({
|
||||||
|
where: { orgRevisionId: orgRevisionPublish.id },
|
||||||
|
relations: ["positions"],
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
console.timeEnd("[AMQ] query_employee_org_structures");
|
||||||
console.log(`[AMQ] orgemployeePosMaster count: ${orgemployeePosMaster.length}`);
|
console.log(`[AMQ] orgemployeePosMaster count: ${orgemployeePosMaster.length}`);
|
||||||
|
console.log(`[AMQ] orgemployeeTempPosMaster count: ${orgemployeeTempPosMaster.length}`);
|
||||||
|
|
||||||
let _orgemployeePosMaster: EmployeePosMaster[];
|
const currentHolderIds = Array.from(
|
||||||
const validProfileIds = new Set(
|
new Set(
|
||||||
(await repoProfileEmployee.find({ select: ["id"] })).map((p) => p.id),
|
orgemployeePosMaster
|
||||||
|
.map((item) => item.current_holderId)
|
||||||
|
.filter((holderId): holderId is string => !!holderId),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
const validProfileIds = new Set<string>();
|
||||||
|
if (currentHolderIds.length > 0) {
|
||||||
|
const profiles = await repoProfileEmployee.find({
|
||||||
|
select: ["id"],
|
||||||
|
where: { id: In(currentHolderIds) },
|
||||||
|
});
|
||||||
|
profiles.forEach((profile) => validProfileIds.add(profile.id));
|
||||||
|
}
|
||||||
|
|
||||||
_orgemployeePosMaster = orgemployeePosMaster.map((x) => ({
|
const _orgemployeePosMaster: EmployeePosMaster[] = orgemployeePosMaster.map((x) => ({
|
||||||
...x,
|
...x,
|
||||||
current_holderId:
|
current_holderId:
|
||||||
x.current_holderId && validProfileIds.has(x.current_holderId) ? x.current_holderId : null,
|
x.current_holderId && validProfileIds.has(x.current_holderId) ? x.current_holderId : null,
|
||||||
|
|
@ -1184,6 +1201,13 @@ async function handler_org(msg: amqp.ConsumeMessage): Promise<boolean> {
|
||||||
? x.id
|
? x.id
|
||||||
: x.ancestorDNA,
|
: x.ancestorDNA,
|
||||||
}));
|
}));
|
||||||
|
const _orgemployeeTempPosMaster: EmployeeTempPosMaster[] = orgemployeeTempPosMaster.map((x) => ({
|
||||||
|
...x,
|
||||||
|
ancestorDNA:
|
||||||
|
x.ancestorDNA == null || x.ancestorDNA == "00000000-0000-0000-0000-000000000000"
|
||||||
|
? x.id
|
||||||
|
: x.ancestorDNA,
|
||||||
|
}));
|
||||||
|
|
||||||
console.time("[AMQ] insert_employeePosMaster");
|
console.time("[AMQ] insert_employeePosMaster");
|
||||||
await repoEmployeePosmaster
|
await repoEmployeePosmaster
|
||||||
|
|
@ -1198,24 +1222,6 @@ async function handler_org(msg: amqp.ConsumeMessage): Promise<boolean> {
|
||||||
.execute();
|
.execute();
|
||||||
console.timeEnd("[AMQ] insert_employeePosMaster");
|
console.timeEnd("[AMQ] insert_employeePosMaster");
|
||||||
|
|
||||||
//หา dna posmaster ถ้าไม่มีให้เอาตัวเองเป็น dna
|
|
||||||
console.time("[AMQ] query_employeeTempPosMaster");
|
|
||||||
const orgemployeeTempPosMaster = await repoEmployeeTempPosmaster.find({
|
|
||||||
where: { orgRevisionId: orgRevisionPublish.id },
|
|
||||||
relations: ["positions"],
|
|
||||||
});
|
|
||||||
console.timeEnd("[AMQ] query_employeeTempPosMaster");
|
|
||||||
console.log(`[AMQ] orgemployeeTempPosMaster count: ${orgemployeeTempPosMaster.length}`);
|
|
||||||
|
|
||||||
let _orgemployeeTempPosMaster: EmployeeTempPosMaster[];
|
|
||||||
_orgemployeeTempPosMaster = orgemployeeTempPosMaster.map((x) => ({
|
|
||||||
...x,
|
|
||||||
ancestorDNA:
|
|
||||||
x.ancestorDNA == null || x.ancestorDNA == "00000000-0000-0000-0000-000000000000"
|
|
||||||
? x.id
|
|
||||||
: x.ancestorDNA,
|
|
||||||
}));
|
|
||||||
|
|
||||||
const groupByParentId = <T extends { id: string }>(
|
const groupByParentId = <T extends { id: string }>(
|
||||||
items: T[],
|
items: T[],
|
||||||
getParentId: (item: T) => string | null | undefined,
|
getParentId: (item: T) => string | null | undefined,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue