sonamu 0.2.31 → 0.2.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/cli.js +1 -1
- package/dist/database/_batch_update.d.ts +15 -0
- package/dist/database/_batch_update.d.ts.map +1 -0
- package/dist/database/_batch_update.js +89 -0
- package/dist/database/_batch_update.js.map +1 -0
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +11 -54
- package/dist/database/upsert-builder.js.map +1 -1
- package/package.json +1 -1
- package/src/bin/cli.ts +1 -1
- package/src/database/_batch_update.ts +106 -0
- package/src/database/upsert-builder.ts +16 -12
package/dist/bin/cli.js
CHANGED
|
@@ -324,7 +324,7 @@ function ui() {
|
|
|
324
324
|
return __awaiter(this, void 0, void 0, function* () {
|
|
325
325
|
try {
|
|
326
326
|
const sonamuUI = yield Promise.resolve(`${"@sonamu-kit/ui"}`).then(s => __importStar(require(s)));
|
|
327
|
-
sonamuUI.startServers(api_1.Sonamu.
|
|
327
|
+
sonamuUI.startServers(api_1.Sonamu.apiRootPath);
|
|
328
328
|
}
|
|
329
329
|
catch (e) {
|
|
330
330
|
if (e instanceof Error && e.message.includes("isn't declared")) {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Knex } from "knex";
|
|
2
|
+
export type RowWithId<Id extends string> = {
|
|
3
|
+
[key in Id]: any;
|
|
4
|
+
} & Record<string, any>;
|
|
5
|
+
/**
|
|
6
|
+
* Batch update rows in a table. Technically its a patch since it only updates the specified columns. Any omitted columns will not be affected
|
|
7
|
+
* @param knex
|
|
8
|
+
* @param tableName
|
|
9
|
+
* @param id
|
|
10
|
+
* @param rows
|
|
11
|
+
* @param chunkSize
|
|
12
|
+
* @param trx
|
|
13
|
+
*/
|
|
14
|
+
export declare function batchUpdate<Id extends string>(knex: Knex, tableName: string, id: Id, rows: RowWithId<Id>[], chunkSize?: number, trx?: Knex.Transaction | null): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=_batch_update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_batch_update.d.ts","sourceRoot":"","sources":["../../src/database/_batch_update.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,MAAM,SAAS,CAAC,EAAE,SAAS,MAAM,IAAI;KACxC,GAAG,IAAI,EAAE,GAAG,GAAG;CACjB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAExB;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,EAAE,SAAS,MAAM,EACjD,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,EACrB,SAAS,SAAK,EACd,GAAG,GAAE,IAAI,CAAC,WAAW,GAAG,IAAW,iBA0BpC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
아래의 링크에서 참고해서 가져온 소스코드
|
|
4
|
+
https://github.com/knex/knex/issues/5716
|
|
5
|
+
*/
|
|
6
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
7
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
8
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
9
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
10
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
11
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
12
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.batchUpdate = void 0;
|
|
17
|
+
/**
|
|
18
|
+
* Batch update rows in a table. Technically its a patch since it only updates the specified columns. Any omitted columns will not be affected
|
|
19
|
+
* @param knex
|
|
20
|
+
* @param tableName
|
|
21
|
+
* @param id
|
|
22
|
+
* @param rows
|
|
23
|
+
* @param chunkSize
|
|
24
|
+
* @param trx
|
|
25
|
+
*/
|
|
26
|
+
function batchUpdate(knex, tableName, id, rows, chunkSize = 50, trx = null) {
|
|
27
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
const chunks = [];
|
|
29
|
+
for (let i = 0; i < rows.length; i += chunkSize) {
|
|
30
|
+
chunks.push(rows.slice(i, i + chunkSize));
|
|
31
|
+
}
|
|
32
|
+
const executeUpdate = (chunk, transaction) => __awaiter(this, void 0, void 0, function* () {
|
|
33
|
+
const sql = generateBatchUpdateSQL(knex, tableName, chunk, id);
|
|
34
|
+
return knex.raw(sql).transacting(transaction);
|
|
35
|
+
});
|
|
36
|
+
if (trx) {
|
|
37
|
+
for (const chunk of chunks) {
|
|
38
|
+
yield executeUpdate(chunk, trx);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
yield knex.transaction((newTrx) => __awaiter(this, void 0, void 0, function* () {
|
|
43
|
+
for (const chunk of chunks) {
|
|
44
|
+
yield executeUpdate(chunk, newTrx);
|
|
45
|
+
}
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
exports.batchUpdate = batchUpdate;
|
|
51
|
+
/**
|
|
52
|
+
* Generate a set of unique keys in a data array
|
|
53
|
+
*
|
|
54
|
+
* Example:
|
|
55
|
+
* [ { a: 1, b: 2 }, { a: 3, c: 4 } ] => Set([ "a", "b", "c" ])
|
|
56
|
+
* @param data
|
|
57
|
+
*/
|
|
58
|
+
function generateKeySetFromData(data) {
|
|
59
|
+
const keySet = new Set();
|
|
60
|
+
for (const row of data) {
|
|
61
|
+
for (const key of Object.keys(row)) {
|
|
62
|
+
keySet.add(key);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return keySet;
|
|
66
|
+
}
|
|
67
|
+
function generateBatchUpdateSQL(knex, tableName, data, identifier) {
|
|
68
|
+
const keySet = generateKeySetFromData(data);
|
|
69
|
+
const bindings = [];
|
|
70
|
+
const cases = [];
|
|
71
|
+
for (const key of keySet) {
|
|
72
|
+
if (key === identifier)
|
|
73
|
+
continue;
|
|
74
|
+
const rows = [];
|
|
75
|
+
for (const row of data) {
|
|
76
|
+
if (Object.hasOwnProperty.call(row, key)) {
|
|
77
|
+
rows.push(`WHEN \`${identifier}\` = ? THEN ?`);
|
|
78
|
+
bindings.push(row[identifier], row[key]);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const whenThen = rows.join(" ");
|
|
82
|
+
cases.push(`\`${key}\` = CASE ${whenThen} ELSE \`${key}\` END`);
|
|
83
|
+
}
|
|
84
|
+
const whereInIds = data.map((row) => row[identifier]);
|
|
85
|
+
const whereInPlaceholders = whereInIds.map(() => "?").join(", ");
|
|
86
|
+
const sql = knex.raw(`UPDATE \`${tableName}\` SET ${cases.join(", ")} WHERE ${identifier} IN (${whereInPlaceholders})`, [...bindings, ...whereInIds]);
|
|
87
|
+
return sql.toString();
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=_batch_update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_batch_update.js","sourceRoot":"","sources":["../../src/database/_batch_update.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upsert-builder.d.ts","sourceRoot":"","sources":["../../src/database/upsert-builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"upsert-builder.d.ts","sourceRoot":"","sources":["../../src/database/upsert-builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,KAAK,SAAS,GAAG;IACf,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,aAAa,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IACtD,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AACF,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AACF,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,KAAK,CAOrD;AAED,qBAAa,aAAa;IACxB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;;IAK/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;IAsBtC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpC,QAAQ,CAAC,CAAC,SAAS,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE;SACF,GAAG,IAAI,CAAC,CAAC,CAAC,EACP,KAAK,GACL,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,IAAI,GACJ,MAAM,GACN,OAAO;KACZ,GACA,KAAK;IA4EF,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAGvD,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAI3D,cAAc,CAClB,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC;IAoGd,WAAW,CACf,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GACA,OAAO,CAAC,IAAI,CAAC;CA0BjB"}
|
|
@@ -1,27 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -31,13 +8,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
31
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
9
|
});
|
|
33
10
|
};
|
|
34
|
-
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
35
|
-
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
36
|
-
var m = o[Symbol.asyncIterator], i;
|
|
37
|
-
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
38
|
-
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
39
|
-
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
40
|
-
};
|
|
41
11
|
var __rest = (this && this.__rest) || function (s, e) {
|
|
42
12
|
var t = {};
|
|
43
13
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
@@ -52,9 +22,10 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
52
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
23
|
exports.UpsertBuilder = exports.isRefField = void 0;
|
|
54
24
|
const uuid_1 = require("uuid");
|
|
55
|
-
const lodash_1 =
|
|
25
|
+
const lodash_1 = require("lodash");
|
|
56
26
|
const entity_manager_1 = require("../entity/entity-manager");
|
|
57
27
|
const utils_1 = require("../utils/utils");
|
|
28
|
+
const _batch_update_1 = require("./_batch_update");
|
|
58
29
|
function isRefField(field) {
|
|
59
30
|
return (field !== undefined &&
|
|
60
31
|
field !== null &&
|
|
@@ -208,11 +179,11 @@ class UpsertBuilder {
|
|
|
208
179
|
references: [],
|
|
209
180
|
refTables: [],
|
|
210
181
|
});
|
|
211
|
-
const extractFields = lodash_1.
|
|
182
|
+
const extractFields = (0, lodash_1.uniq)(references).map((reference) => reference.split(".")[1]);
|
|
212
183
|
// UUID 기준으로 id 추출
|
|
213
184
|
const uuids = table.rows.map((row) => row.uuid);
|
|
214
185
|
const upsertedRows = yield wdb(tableName)
|
|
215
|
-
.select(lodash_1.
|
|
186
|
+
.select((0, lodash_1.uniq)(["uuid", "id", ...extractFields]))
|
|
216
187
|
.whereIn("uuid", uuids);
|
|
217
188
|
const uuidMap = new Map(upsertedRows.map((row) => [row.uuid, row]));
|
|
218
189
|
// 해당 테이블 참조를 실제 밸류로 변경
|
|
@@ -242,10 +213,11 @@ class UpsertBuilder {
|
|
|
242
213
|
});
|
|
243
214
|
}
|
|
244
215
|
updateBatch(wdb, tableName, options) {
|
|
245
|
-
var _a
|
|
216
|
+
var _a;
|
|
246
217
|
return __awaiter(this, void 0, void 0, function* () {
|
|
247
218
|
options = (0, lodash_1.defaults)(options, {
|
|
248
219
|
chunkSize: 500,
|
|
220
|
+
where: "id",
|
|
249
221
|
});
|
|
250
222
|
if (this.hasTable(tableName) === false) {
|
|
251
223
|
return;
|
|
@@ -254,26 +226,11 @@ class UpsertBuilder {
|
|
|
254
226
|
if (table.rows.length === 0) {
|
|
255
227
|
return;
|
|
256
228
|
}
|
|
257
|
-
const
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
const chunk = _c;
|
|
263
|
-
yield Promise.all(chunk.map((_e) => __awaiter(this, void 0, void 0, function* () {
|
|
264
|
-
var { id } = _e, row = __rest(_e, ["id"]);
|
|
265
|
-
const { uuid } = row, update = __rest(row, ["uuid"]);
|
|
266
|
-
return yield wdb(tableName).where("id", id).update(update);
|
|
267
|
-
})));
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
271
|
-
finally {
|
|
272
|
-
try {
|
|
273
|
-
if (!_d && !_a && (_b = chunks_1.return)) yield _b.call(chunks_1);
|
|
274
|
-
}
|
|
275
|
-
finally { if (e_1) throw e_1.error; }
|
|
276
|
-
}
|
|
229
|
+
const rows = table.rows.map((_row) => {
|
|
230
|
+
const { uuid } = _row, row = __rest(_row, ["uuid"]);
|
|
231
|
+
return row;
|
|
232
|
+
});
|
|
233
|
+
yield (0, _batch_update_1.batchUpdate)(wdb, tableName, (_a = options.where) !== null && _a !== void 0 ? _a : "id", rows, options.chunkSize);
|
|
277
234
|
});
|
|
278
235
|
}
|
|
279
236
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upsert-builder.js","sourceRoot":"","sources":["../../src/database/upsert-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"upsert-builder.js","sourceRoot":"","sources":["../../src/database/upsert-builder.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/bin/cli.ts
CHANGED
|
@@ -310,7 +310,7 @@ async function ui() {
|
|
|
310
310
|
const sonamuUI: {
|
|
311
311
|
startServers: (appRootPath: string) => void;
|
|
312
312
|
} = await import("@sonamu-kit/ui" as string);
|
|
313
|
-
sonamuUI.startServers(Sonamu.
|
|
313
|
+
sonamuUI.startServers(Sonamu.apiRootPath);
|
|
314
314
|
} catch (e: unknown) {
|
|
315
315
|
if (e instanceof Error && e.message.includes("isn't declared")) {
|
|
316
316
|
console.log(`You need to install ${chalk.blue(`@sonamu-kit/ui`)} first.`);
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/*
|
|
2
|
+
아래의 링크에서 참고해서 가져온 소스코드
|
|
3
|
+
https://github.com/knex/knex/issues/5716
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { Knex } from "knex";
|
|
7
|
+
|
|
8
|
+
export type RowWithId<Id extends string> = {
|
|
9
|
+
[key in Id]: any;
|
|
10
|
+
} & Record<string, any>;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Batch update rows in a table. Technically its a patch since it only updates the specified columns. Any omitted columns will not be affected
|
|
14
|
+
* @param knex
|
|
15
|
+
* @param tableName
|
|
16
|
+
* @param id
|
|
17
|
+
* @param rows
|
|
18
|
+
* @param chunkSize
|
|
19
|
+
* @param trx
|
|
20
|
+
*/
|
|
21
|
+
export async function batchUpdate<Id extends string>(
|
|
22
|
+
knex: Knex,
|
|
23
|
+
tableName: string,
|
|
24
|
+
id: Id,
|
|
25
|
+
rows: RowWithId<Id>[],
|
|
26
|
+
chunkSize = 50,
|
|
27
|
+
trx: Knex.Transaction | null = null
|
|
28
|
+
) {
|
|
29
|
+
const chunks: RowWithId<Id>[][] = [];
|
|
30
|
+
for (let i = 0; i < rows.length; i += chunkSize) {
|
|
31
|
+
chunks.push(rows.slice(i, i + chunkSize));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const executeUpdate = async (
|
|
35
|
+
chunk: RowWithId<Id>[],
|
|
36
|
+
transaction: Knex.Transaction
|
|
37
|
+
) => {
|
|
38
|
+
const sql = generateBatchUpdateSQL(knex, tableName, chunk, id);
|
|
39
|
+
return knex.raw(sql).transacting(transaction);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
if (trx) {
|
|
43
|
+
for (const chunk of chunks) {
|
|
44
|
+
await executeUpdate(chunk, trx);
|
|
45
|
+
}
|
|
46
|
+
} else {
|
|
47
|
+
await knex.transaction(async (newTrx) => {
|
|
48
|
+
for (const chunk of chunks) {
|
|
49
|
+
await executeUpdate(chunk, newTrx);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Generate a set of unique keys in a data array
|
|
57
|
+
*
|
|
58
|
+
* Example:
|
|
59
|
+
* [ { a: 1, b: 2 }, { a: 3, c: 4 } ] => Set([ "a", "b", "c" ])
|
|
60
|
+
* @param data
|
|
61
|
+
*/
|
|
62
|
+
function generateKeySetFromData(data: Record<string, any>[]) {
|
|
63
|
+
const keySet: Set<string> = new Set();
|
|
64
|
+
for (const row of data) {
|
|
65
|
+
for (const key of Object.keys(row)) {
|
|
66
|
+
keySet.add(key);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return keySet;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function generateBatchUpdateSQL<Id extends string>(
|
|
73
|
+
knex: Knex,
|
|
74
|
+
tableName: string,
|
|
75
|
+
data: Record<string, any>[],
|
|
76
|
+
identifier: Id
|
|
77
|
+
) {
|
|
78
|
+
const keySet = generateKeySetFromData(data);
|
|
79
|
+
const bindings = [];
|
|
80
|
+
|
|
81
|
+
const cases = [];
|
|
82
|
+
for (const key of keySet) {
|
|
83
|
+
if (key === identifier) continue;
|
|
84
|
+
|
|
85
|
+
const rows = [];
|
|
86
|
+
for (const row of data) {
|
|
87
|
+
if (Object.hasOwnProperty.call(row, key)) {
|
|
88
|
+
rows.push(`WHEN \`${identifier}\` = ? THEN ?`);
|
|
89
|
+
bindings.push(row[identifier], row[key]);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const whenThen = rows.join(" ");
|
|
94
|
+
cases.push(`\`${key}\` = CASE ${whenThen} ELSE \`${key}\` END`);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const whereInIds = data.map((row) => row[identifier]);
|
|
98
|
+
const whereInPlaceholders = whereInIds.map(() => "?").join(", ");
|
|
99
|
+
const sql = knex.raw(
|
|
100
|
+
`UPDATE \`${tableName}\` SET ${cases.join(
|
|
101
|
+
", "
|
|
102
|
+
)} WHERE ${identifier} IN (${whereInPlaceholders})`,
|
|
103
|
+
[...bindings, ...whereInIds]
|
|
104
|
+
);
|
|
105
|
+
return sql.toString();
|
|
106
|
+
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { v4 as uuidv4 } from "uuid";
|
|
2
|
-
import
|
|
2
|
+
import { defaults, groupBy, uniq } from "lodash";
|
|
3
3
|
import { Knex } from "knex";
|
|
4
4
|
import { EntityManager } from "../entity/entity-manager";
|
|
5
5
|
import { nonNullable } from "../utils/utils";
|
|
6
|
+
import { RowWithId, batchUpdate } from "./_batch_update";
|
|
6
7
|
|
|
7
8
|
type TableData = {
|
|
8
9
|
references: Set<string>;
|
|
@@ -213,14 +214,14 @@ export class UpsertBuilder {
|
|
|
213
214
|
}
|
|
214
215
|
);
|
|
215
216
|
|
|
216
|
-
const extractFields =
|
|
217
|
+
const extractFields = uniq(references).map(
|
|
217
218
|
(reference) => reference.split(".")[1]
|
|
218
219
|
);
|
|
219
220
|
|
|
220
221
|
// UUID 기준으로 id 추출
|
|
221
222
|
const uuids = table.rows.map((row) => row.uuid);
|
|
222
223
|
const upsertedRows = await wdb(tableName)
|
|
223
|
-
.select(
|
|
224
|
+
.select(uniq(["uuid", "id", ...extractFields]))
|
|
224
225
|
.whereIn("uuid", uuids);
|
|
225
226
|
const uuidMap = new Map<string, any>(
|
|
226
227
|
upsertedRows.map((row: any) => [row.uuid, row])
|
|
@@ -266,6 +267,7 @@ export class UpsertBuilder {
|
|
|
266
267
|
): Promise<void> {
|
|
267
268
|
options = defaults(options, {
|
|
268
269
|
chunkSize: 500,
|
|
270
|
+
where: "id",
|
|
269
271
|
});
|
|
270
272
|
|
|
271
273
|
if (this.hasTable(tableName) === false) {
|
|
@@ -276,14 +278,16 @@ export class UpsertBuilder {
|
|
|
276
278
|
return;
|
|
277
279
|
}
|
|
278
280
|
|
|
279
|
-
const
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
281
|
+
const rows = table.rows.map((_row) => {
|
|
282
|
+
const { uuid, ...row } = _row;
|
|
283
|
+
return row as RowWithId<string>;
|
|
284
|
+
});
|
|
285
|
+
await batchUpdate(
|
|
286
|
+
wdb,
|
|
287
|
+
tableName,
|
|
288
|
+
options.where ?? "id",
|
|
289
|
+
rows,
|
|
290
|
+
options.chunkSize
|
|
291
|
+
);
|
|
288
292
|
}
|
|
289
293
|
}
|