This commit is contained in:
Rizky 2024-08-20 11:29:11 +07:00
parent cfa5cbf677
commit 1cca29d504
1 changed files with 92 additions and 96 deletions

View File

@ -97,73 +97,71 @@ export const execQuery = async (args: DBArg, prisma: any) => {
} }
>; >;
if (mode !== "raw") { for (const row of data) {
for (const row of data) { for (const [k, v] of Object.entries(row) as any) {
for (const [k, v] of Object.entries(row) as any) { const rel = rels[k];
const rel = rels[k]; if (rel) {
if (rel) { if (rel.type === "has-one") {
if (rel.type === "has-one") { const to = rel.to.fields[0];
const to = rel.to.fields[0]; if (!v.connect && v[to]) {
if (!v.connect && v[to]) { let newv = { connect: { [to]: v[to] } };
let newv = { connect: { [to]: v[to] } }; row[k] = newv;
row[k] = newv; }
} } else if (rel.type === "has-many") {
} else if (rel.type === "has-many") { if (!rel_many[k]) {
if (!rel_many[k]) { const schema_table = schema.findByType("model", {
const schema_table = schema.findByType("model", { name: rel.to.table,
name: rel.to.table, });
});
let pks: Property[] = []; let pks: Property[] = [];
if (schema_table) { if (schema_table) {
for (const col of schema_table.properties) { for (const col of schema_table.properties) {
if (col.type === "field" && !col.array) { if (col.type === "field" && !col.array) {
if ( if (
col.attributes && col.attributes &&
col.attributes?.length > 0 col.attributes?.length > 0
) { ) {
const is_pk = col.attributes.find( const is_pk = col.attributes.find(
(e) => e.name === "id" (e) => e.name === "id"
); );
if (is_pk) { if (is_pk) {
pks.push(col); pks.push(col);
break; break;
}
} }
} }
} }
} }
rel_many[k] = {
to: rel.to.table,
select: new Set(),
from: rel.from.table,
pk: pks.map((e) => e.name),
ops: new Map(),
};
} }
const tobe = createRelMany({ rel_many[k] = {
row, to: rel.to.table,
k, select: new Set(),
schema, from: rel.from.table,
rel, pk: pks.map((e) => e.name),
}); ops: new Map(),
};
}
if (tobe) { const tobe = createRelMany({
for (const row of tobe) { row,
for (const key of Object.keys(row)) { k,
rel_many[k].select.add(key); schema,
} rel,
});
if (tobe) {
for (const row of tobe) {
for (const key of Object.keys(row)) {
rel_many[k].select.add(key);
} }
} }
rel_many[k].ops.set(row, {
delete: new Set(),
insert: new Set(),
tobe: tobe || [],
});
} }
rel_many[k].ops.set(row, {
delete: new Set(),
insert: new Set(),
tobe: tobe || [],
});
} }
} }
} }
@ -204,52 +202,50 @@ export const execQuery = async (args: DBArg, prisma: any) => {
return true; return true;
}); });
if (mode !== "raw") { for (const [k, v] of Object.entries(row) as any) {
for (const [k, v] of Object.entries(row) as any) { const rel = rels[k];
const rel = rels[k]; if (rel) {
if (rel) { if (rel.type === "has-many" && rel_many[k]) {
if (rel.type === "has-many" && rel_many[k]) { delete row[k];
delete row[k]; const current = rel_many[k].ops.get(row);
const current = rel_many[k].ops.get(row); if (current && found && found[k] && current.tobe) {
if (current && found && found[k] && current.tobe) { let cur_matches = new Set<any>();
let cur_matches = new Set<any>(); for (const tobe of current.tobe) {
for (const tobe of current.tobe) { let tobe_found = false;
let tobe_found = false; for (const cur of found[k]) {
for (const cur of found[k]) { let matched_all = true;
let matched_all = true; for (const [k, v] of Object.entries(tobe)) {
for (const [k, v] of Object.entries(tobe)) { if (cur[k] !== v) {
if (cur[k] !== v) { matched_all = false;
matched_all = false;
break;
}
}
if (matched_all) {
cur_matches.add(cur);
tobe_found = true;
break; break;
} }
} }
if (!tobe_found) { if (matched_all) {
current.insert.add(tobe); cur_matches.add(cur);
tobe_found = true;
break;
} }
} }
if (!tobe_found) {
for (const cur of found[k]) { current.insert.add(tobe);
if (!cur_matches.has(cur)) {
current.delete.add(cur);
}
} }
}
row[k] = { for (const cur of found[k]) {
createMany: { data: [...current.insert] }, if (!cur_matches.has(cur)) {
}; current.delete.add(cur);
}
}
if (current.delete.size > 0) { row[k] = {
for (const d of current.delete) { createMany: { data: [...current.insert] },
transactions.push( };
prisma[rel_many[k].to].delete({ where: d })
); if (current.delete.size > 0) {
} for (const d of current.delete) {
transactions.push(
prisma[rel_many[k].to].delete({ where: d })
);
} }
} }
} }