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");
|
||||
|
||||
//หา dna posmaster ถ้าไม่มีให้เอาตัวเองเป็น dna
|
||||
console.time("[AMQ] query_employeePosMaster");
|
||||
const orgemployeePosMaster = await repoEmployeePosmaster.find({
|
||||
where: { orgRevisionId: orgRevisionPublish.id },
|
||||
relations: ["positions"],
|
||||
});
|
||||
console.timeEnd("[AMQ] query_employeePosMaster");
|
||||
console.time("[AMQ] query_employee_org_structures");
|
||||
const [orgemployeePosMaster, orgemployeeTempPosMaster] = await Promise.all([
|
||||
repoEmployeePosmaster.find({
|
||||
where: { orgRevisionId: orgRevisionPublish.id },
|
||||
relations: ["positions"],
|
||||
}),
|
||||
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] orgemployeeTempPosMaster count: ${orgemployeeTempPosMaster.length}`);
|
||||
|
||||
let _orgemployeePosMaster: EmployeePosMaster[];
|
||||
const validProfileIds = new Set(
|
||||
(await repoProfileEmployee.find({ select: ["id"] })).map((p) => p.id),
|
||||
const currentHolderIds = Array.from(
|
||||
new Set(
|
||||
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,
|
||||
current_holderId:
|
||||
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.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");
|
||||
await repoEmployeePosmaster
|
||||
|
|
@ -1198,24 +1222,6 @@ async function handler_org(msg: amqp.ConsumeMessage): Promise<boolean> {
|
|||
.execute();
|
||||
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 }>(
|
||||
items: T[],
|
||||
getParentId: (item: T) => string | null | undefined,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue