@mkven/samples-generation 0.1.0
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/LICENSE +21 -0
- package/README.md +484 -0
- package/dist/generator/base-generator.d.ts +39 -0
- package/dist/generator/base-generator.d.ts.map +1 -0
- package/dist/generator/base-generator.js +72 -0
- package/dist/generator/base-generator.js.map +1 -0
- package/dist/generator/clickhouse-generator.d.ts +44 -0
- package/dist/generator/clickhouse-generator.d.ts.map +1 -0
- package/dist/generator/clickhouse-generator.js +452 -0
- package/dist/generator/clickhouse-generator.js.map +1 -0
- package/dist/generator/escape.d.ts +18 -0
- package/dist/generator/escape.d.ts.map +1 -0
- package/dist/generator/escape.js +25 -0
- package/dist/generator/escape.js.map +1 -0
- package/dist/generator/index.d.ts +9 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +8 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/postgres-generator.d.ts +33 -0
- package/dist/generator/postgres-generator.d.ts.map +1 -0
- package/dist/generator/postgres-generator.js +317 -0
- package/dist/generator/postgres-generator.js.map +1 -0
- package/dist/generator/sqlite-generator.d.ts +30 -0
- package/dist/generator/sqlite-generator.d.ts.map +1 -0
- package/dist/generator/sqlite-generator.js +334 -0
- package/dist/generator/sqlite-generator.js.map +1 -0
- package/dist/generator/trino-generator.d.ts +38 -0
- package/dist/generator/trino-generator.d.ts.map +1 -0
- package/dist/generator/trino-generator.js +408 -0
- package/dist/generator/trino-generator.js.map +1 -0
- package/dist/generator/types.d.ts +230 -0
- package/dist/generator/types.d.ts.map +1 -0
- package/dist/generator/types.js +2 -0
- package/dist/generator/types.js.map +1 -0
- package/dist/generator/utils.d.ts +14 -0
- package/dist/generator/utils.d.ts.map +1 -0
- package/dist/generator/utils.js +48 -0
- package/dist/generator/utils.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
import { createClient } from "@clickhouse/client";
|
|
2
|
+
import { BaseDataGenerator } from "./base-generator.js";
|
|
3
|
+
import { escapeClickHouseIdentifier } from "./escape.js";
|
|
4
|
+
import { getLookupTableName } from "./utils.js";
|
|
5
|
+
function columnTypeToClickHouse(column) {
|
|
6
|
+
const baseType = (() => {
|
|
7
|
+
switch (column.type) {
|
|
8
|
+
case "integer":
|
|
9
|
+
return "Int32";
|
|
10
|
+
case "bigint":
|
|
11
|
+
return "Int64";
|
|
12
|
+
case "float":
|
|
13
|
+
return "Float64";
|
|
14
|
+
case "string":
|
|
15
|
+
return "String";
|
|
16
|
+
case "boolean":
|
|
17
|
+
return "Bool";
|
|
18
|
+
case "datetime":
|
|
19
|
+
return "DateTime";
|
|
20
|
+
case "date":
|
|
21
|
+
return "Date";
|
|
22
|
+
}
|
|
23
|
+
})();
|
|
24
|
+
return column.nullable ? `Nullable(${baseType})` : baseType;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Wrap an expression to return NULL with given probability (ClickHouse)
|
|
28
|
+
*/
|
|
29
|
+
function wrapWithNullCheck(expr, nullProbability) {
|
|
30
|
+
if (nullProbability <= 0)
|
|
31
|
+
return expr;
|
|
32
|
+
if (nullProbability >= 1)
|
|
33
|
+
return "NULL";
|
|
34
|
+
// rand() returns UInt32 (0 to 4294967295), divide to get 0-1 range
|
|
35
|
+
return `if(rand() / 4294967295.0 < ${String(nullProbability)}, NULL, ${expr})`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Convert a generator config to a ClickHouse SQL expression
|
|
39
|
+
*/
|
|
40
|
+
export function generatorToClickHouseExpr(gen, seqExpr) {
|
|
41
|
+
switch (gen.kind) {
|
|
42
|
+
case "sequence": {
|
|
43
|
+
const start = gen.start ?? 1;
|
|
44
|
+
const step = gen.step ?? 1;
|
|
45
|
+
return `(${String(start)} - 1 + ${seqExpr} * ${String(step)})`;
|
|
46
|
+
}
|
|
47
|
+
case "randomInt":
|
|
48
|
+
return `toInt32(randUniform(${String(gen.min)}, ${String(gen.max + 1)}))`;
|
|
49
|
+
case "randomFloat": {
|
|
50
|
+
const precision = gen.precision ?? 2;
|
|
51
|
+
return `round(randUniform(${String(gen.min)}, ${String(gen.max)}), ${String(precision)})`;
|
|
52
|
+
}
|
|
53
|
+
case "randomString": {
|
|
54
|
+
const len = gen.length;
|
|
55
|
+
return `randomPrintableASCII(${String(len)})`;
|
|
56
|
+
}
|
|
57
|
+
case "choice": {
|
|
58
|
+
const values = gen.values;
|
|
59
|
+
const arr = values.map((v) => typeof v === "string" ? `'${v}'` : String(v));
|
|
60
|
+
return `[${arr.join(", ")}][toUInt32(rand() % ${String(arr.length)}) + 1]`;
|
|
61
|
+
}
|
|
62
|
+
case "choiceByLookup": {
|
|
63
|
+
// For ClickHouse, we'll use a subquery that loads the array once
|
|
64
|
+
// The CTE approach doesn't work well, so we use arrayElement
|
|
65
|
+
const cteName = getLookupTableName(gen.values);
|
|
66
|
+
return `${cteName}_arr[toUInt32(rand() % length(${cteName}_arr)) + 1]`;
|
|
67
|
+
}
|
|
68
|
+
case "constant": {
|
|
69
|
+
const val = gen.value;
|
|
70
|
+
return typeof val === "string" ? `'${val}'` : String(val);
|
|
71
|
+
}
|
|
72
|
+
case "datetime": {
|
|
73
|
+
const from = gen.from ?? new Date("2020-01-01");
|
|
74
|
+
const to = gen.to ?? new Date();
|
|
75
|
+
const fromTs = Math.floor(from.getTime() / 1000);
|
|
76
|
+
const toTs = Math.floor(to.getTime() / 1000);
|
|
77
|
+
return `toDateTime(${String(fromTs)} + rand() % ${String(toTs - fromTs)})`;
|
|
78
|
+
}
|
|
79
|
+
case "uuid":
|
|
80
|
+
return "generateUUIDv4()";
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export class ClickHouseDataGenerator extends BaseDataGenerator {
|
|
84
|
+
config;
|
|
85
|
+
name = "clickhouse";
|
|
86
|
+
client = null;
|
|
87
|
+
constructor(config) {
|
|
88
|
+
super();
|
|
89
|
+
this.config = config;
|
|
90
|
+
}
|
|
91
|
+
connect() {
|
|
92
|
+
this.client = createClient({
|
|
93
|
+
url: `http://${this.config.host}:${String(this.config.port)}`,
|
|
94
|
+
username: this.config.username,
|
|
95
|
+
password: this.config.password,
|
|
96
|
+
database: this.config.database,
|
|
97
|
+
// Increase timeout for large data generation (6 hours for 10B+ rows)
|
|
98
|
+
request_timeout: 21_600_000,
|
|
99
|
+
});
|
|
100
|
+
return Promise.resolve();
|
|
101
|
+
}
|
|
102
|
+
async disconnect() {
|
|
103
|
+
if (this.client) {
|
|
104
|
+
await this.client.close();
|
|
105
|
+
this.client = null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
getClient() {
|
|
109
|
+
if (!this.client) {
|
|
110
|
+
throw new Error("Not connected to ClickHouse");
|
|
111
|
+
}
|
|
112
|
+
return this.client;
|
|
113
|
+
}
|
|
114
|
+
async createTable(table) {
|
|
115
|
+
const client = this.getClient();
|
|
116
|
+
const columns = table.columns
|
|
117
|
+
.map((col) => `${escapeClickHouseIdentifier(col.name)} ${columnTypeToClickHouse(col)}`)
|
|
118
|
+
.join(", ");
|
|
119
|
+
// Find the first column for ORDER BY (ClickHouse requires it for MergeTree)
|
|
120
|
+
const firstColumn = table.columns[0];
|
|
121
|
+
if (!firstColumn) {
|
|
122
|
+
throw new Error("Table must have at least one column");
|
|
123
|
+
}
|
|
124
|
+
const orderByColumn = escapeClickHouseIdentifier(firstColumn.name);
|
|
125
|
+
const escapedTableName = escapeClickHouseIdentifier(table.name);
|
|
126
|
+
await client.command({
|
|
127
|
+
query: `CREATE TABLE IF NOT EXISTS ${escapedTableName} (${columns}) ENGINE = MergeTree() ORDER BY ${orderByColumn}`,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
async truncateTable(tableName) {
|
|
131
|
+
const client = this.getClient();
|
|
132
|
+
await client.command({
|
|
133
|
+
query: `TRUNCATE TABLE ${escapeClickHouseIdentifier(tableName)}`,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
async dropTable(tableName) {
|
|
137
|
+
const client = this.getClient();
|
|
138
|
+
await client.command({
|
|
139
|
+
query: `DROP TABLE IF EXISTS ${escapeClickHouseIdentifier(tableName)}`,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
async generateNative(table, rowCount, startSequence) {
|
|
143
|
+
const client = this.getClient();
|
|
144
|
+
const escapedTableName = escapeClickHouseIdentifier(table.name);
|
|
145
|
+
// Collect choiceByLookup arrays for WITH clause
|
|
146
|
+
// ClickHouse syntax: WITH [values] AS name
|
|
147
|
+
const arrayDefs = [];
|
|
148
|
+
for (const col of table.columns) {
|
|
149
|
+
if (col.generator.kind === "choiceByLookup") {
|
|
150
|
+
const gen = col.generator;
|
|
151
|
+
const arrName = `${getLookupTableName(gen.values)}_arr`;
|
|
152
|
+
const valuesLiteral = gen.values
|
|
153
|
+
.map((v) => `'${v.replace(/'/g, "\\'")}'`)
|
|
154
|
+
.join(", ");
|
|
155
|
+
arrayDefs.push(`[${valuesLiteral}] AS ${arrName}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Build column list and expressions
|
|
159
|
+
const columns = table.columns.map((c) => escapeClickHouseIdentifier(c.name));
|
|
160
|
+
const seqExpr = `(number + ${String(startSequence)})`;
|
|
161
|
+
const expressions = table.columns.map((col) => {
|
|
162
|
+
let expr = generatorToClickHouseExpr(col.generator, seqExpr);
|
|
163
|
+
// Apply null probability if specified
|
|
164
|
+
if (col.nullable && col.nullProbability && col.nullProbability > 0) {
|
|
165
|
+
expr = wrapWithNullCheck(expr, col.nullProbability);
|
|
166
|
+
}
|
|
167
|
+
return expr;
|
|
168
|
+
});
|
|
169
|
+
// Build WITH clause if we have lookup arrays
|
|
170
|
+
const withClause = arrayDefs.length > 0 ? `${arrayDefs.join(", ")} ` : "";
|
|
171
|
+
const insertSql = `
|
|
172
|
+
INSERT INTO ${escapedTableName} (${columns.join(", ")})
|
|
173
|
+
${withClause.length > 0 ? `WITH ${withClause}` : ""}SELECT ${expressions.join(", ")}
|
|
174
|
+
FROM numbers(${String(rowCount)})
|
|
175
|
+
`;
|
|
176
|
+
await client.command({ query: insertSql });
|
|
177
|
+
}
|
|
178
|
+
async queryRows(tableName, limit = 100) {
|
|
179
|
+
const client = this.getClient();
|
|
180
|
+
const result = await client.query({
|
|
181
|
+
query: `SELECT * FROM ${escapeClickHouseIdentifier(tableName)} LIMIT {limit:UInt32}`,
|
|
182
|
+
query_params: { limit },
|
|
183
|
+
format: "JSONEachRow",
|
|
184
|
+
});
|
|
185
|
+
return result.json();
|
|
186
|
+
}
|
|
187
|
+
async countRows(tableName) {
|
|
188
|
+
const client = this.getClient();
|
|
189
|
+
const result = await client.query({
|
|
190
|
+
query: `SELECT COUNT(*) as count FROM ${escapeClickHouseIdentifier(tableName)}`,
|
|
191
|
+
format: "JSONEachRow",
|
|
192
|
+
});
|
|
193
|
+
const rows = await result.json();
|
|
194
|
+
const firstRow = rows[0];
|
|
195
|
+
if (!firstRow) {
|
|
196
|
+
return 0;
|
|
197
|
+
}
|
|
198
|
+
return Number(firstRow.count);
|
|
199
|
+
}
|
|
200
|
+
async getMaxValue(tableName, columnName) {
|
|
201
|
+
const client = this.getClient();
|
|
202
|
+
const result = await client.query({
|
|
203
|
+
query: `SELECT MAX(${escapeClickHouseIdentifier(columnName)}) as max_val FROM ${escapeClickHouseIdentifier(tableName)}`,
|
|
204
|
+
format: "JSONEachRow",
|
|
205
|
+
});
|
|
206
|
+
const rows = await result.json();
|
|
207
|
+
const firstRow = rows[0];
|
|
208
|
+
if (!firstRow?.max_val) {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
return Number(firstRow.max_val);
|
|
212
|
+
}
|
|
213
|
+
async getTableSize(tableName) {
|
|
214
|
+
const client = this.getClient();
|
|
215
|
+
const result = await client.query({
|
|
216
|
+
query: `SELECT total_bytes FROM system.tables WHERE database = {database:String} AND name = {table:String}`,
|
|
217
|
+
query_params: { database: this.config.database, table: tableName },
|
|
218
|
+
format: "JSONEachRow",
|
|
219
|
+
});
|
|
220
|
+
const rows = await result.json();
|
|
221
|
+
const firstRow = rows[0];
|
|
222
|
+
if (!firstRow) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
return Number(firstRow.total_bytes);
|
|
226
|
+
}
|
|
227
|
+
async optimize(tableName) {
|
|
228
|
+
const client = this.getClient();
|
|
229
|
+
// OPTIMIZE TABLE FINAL merges all parts into one for MergeTree engines
|
|
230
|
+
await client.command({
|
|
231
|
+
query: `OPTIMIZE TABLE ${escapeClickHouseIdentifier(tableName)} FINAL`,
|
|
232
|
+
clickhouse_settings: {
|
|
233
|
+
wait_end_of_query: 1,
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
async applyTransformations(tableName, transformations) {
|
|
238
|
+
if (transformations.length === 0)
|
|
239
|
+
return;
|
|
240
|
+
const client = this.getClient();
|
|
241
|
+
const escapedTable = escapeClickHouseIdentifier(tableName);
|
|
242
|
+
const setClauses = [];
|
|
243
|
+
for (const t of transformations) {
|
|
244
|
+
switch (t.kind) {
|
|
245
|
+
case "template": {
|
|
246
|
+
const escapedCol = escapeClickHouseIdentifier(t.column);
|
|
247
|
+
// Replace {column_name} with column references
|
|
248
|
+
let expr = `'${t.template.replace(/'/g, "\\'")}'`;
|
|
249
|
+
const refs = t.template.match(/\{([^}]+)\}/g) ?? [];
|
|
250
|
+
for (const ref of refs) {
|
|
251
|
+
const colName = ref.slice(1, -1);
|
|
252
|
+
const colRef = escapeClickHouseIdentifier(colName);
|
|
253
|
+
// Replace {col} with concatenation
|
|
254
|
+
expr = expr.replace(`'{${colName}}'`, `' || toString(${colRef}) || '`);
|
|
255
|
+
expr = expr.replace(`{${colName}}`, `' || toString(${colRef}) || '`);
|
|
256
|
+
}
|
|
257
|
+
// Clean up empty string concatenations
|
|
258
|
+
expr = expr.replace(/^'' \|\| /, "").replace(/ \|\| ''$/, "");
|
|
259
|
+
expr = expr.replace(/' \|\| '' \|\| '/g, "' || '");
|
|
260
|
+
if (t.lowercase) {
|
|
261
|
+
expr = `lower(${expr})`;
|
|
262
|
+
}
|
|
263
|
+
setClauses.push(`${escapedCol} = ${expr}`);
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
case "mutate": {
|
|
267
|
+
const escapedCol = escapeClickHouseIdentifier(t.column);
|
|
268
|
+
// Random string mutation using ClickHouse functions
|
|
269
|
+
const { probability, operations } = t;
|
|
270
|
+
// rand() returns UInt32, divide to get 0-1
|
|
271
|
+
const randomPos = `toUInt32(floor(rand() / 4294967295.0 * length(${escapedCol}))) + 1`;
|
|
272
|
+
// Build mutation expressions for each operation
|
|
273
|
+
const mutationExprs = {
|
|
274
|
+
replace: `concat(substring(${escapedCol}, 1, ${randomPos} - 1), 'X', substring(${escapedCol}, ${randomPos} + 1))`,
|
|
275
|
+
delete: `concat(substring(${escapedCol}, 1, ${randomPos} - 1), substring(${escapedCol}, ${randomPos} + 1))`,
|
|
276
|
+
insert: `concat(substring(${escapedCol}, 1, ${randomPos}), 'X', substring(${escapedCol}, ${randomPos} + 1))`,
|
|
277
|
+
};
|
|
278
|
+
// Build expression that randomly picks from available operations
|
|
279
|
+
let mutateExpr;
|
|
280
|
+
if (operations.length === 1) {
|
|
281
|
+
// We know operations[0] exists since length === 1
|
|
282
|
+
mutateExpr = mutationExprs[operations[0]]; // eslint-disable-line @typescript-eslint/no-non-null-assertion
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
// Use multiIf with rand() to pick operation
|
|
286
|
+
const conditions = [];
|
|
287
|
+
for (let i = 0; i < operations.length - 1; i++) {
|
|
288
|
+
const threshold = (i + 1) / operations.length;
|
|
289
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
290
|
+
const op = operations[i];
|
|
291
|
+
conditions.push(`rand() / 4294967295.0 < ${String(threshold)}, ${mutationExprs[op]}`);
|
|
292
|
+
}
|
|
293
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
294
|
+
const lastOp = operations[operations.length - 1];
|
|
295
|
+
conditions.push(mutationExprs[lastOp]);
|
|
296
|
+
mutateExpr = `multiIf(${conditions.join(", ")})`;
|
|
297
|
+
}
|
|
298
|
+
setClauses.push(`${escapedCol} = if(rand() / 4294967295.0 < ${String(probability)}, ${mutateExpr}, ${escapedCol})`);
|
|
299
|
+
break;
|
|
300
|
+
}
|
|
301
|
+
case "lookup": {
|
|
302
|
+
// ClickHouse ALTER TABLE UPDATE does not support correlated subqueries
|
|
303
|
+
// We need to use the table swap approach: CREATE AS + INSERT SELECT + RENAME
|
|
304
|
+
// Handle lookup transformations separately
|
|
305
|
+
await this.applyLookupTransformation(tableName, t);
|
|
306
|
+
// Don't add to setClauses - already handled
|
|
307
|
+
break;
|
|
308
|
+
}
|
|
309
|
+
case "swap": {
|
|
310
|
+
// Swap handled separately via applySwapTransformation
|
|
311
|
+
// ClickHouse evaluates each rand() separately, so we need table swap approach
|
|
312
|
+
// to ensure same random value is used for both columns
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
// Handle swap transformations separately for ClickHouse (need same random for both columns)
|
|
318
|
+
const swapTransformations = transformations.filter((t) => t.kind === "swap");
|
|
319
|
+
if (swapTransformations.length > 0) {
|
|
320
|
+
// Batch all swaps into a single table swap operation
|
|
321
|
+
await this.applySwapTransformations(tableName, swapTransformations);
|
|
322
|
+
}
|
|
323
|
+
// Only run ALTER TABLE UPDATE if there are SET clauses
|
|
324
|
+
if (setClauses.length === 0)
|
|
325
|
+
return;
|
|
326
|
+
// ClickHouse uses ALTER TABLE UPDATE syntax
|
|
327
|
+
const updateSql = `ALTER TABLE ${escapedTable} UPDATE ${setClauses.join(", ")} WHERE 1`;
|
|
328
|
+
await client.command({
|
|
329
|
+
query: updateSql,
|
|
330
|
+
clickhouse_settings: {
|
|
331
|
+
wait_end_of_query: 1,
|
|
332
|
+
mutations_sync: "2", // Wait for all replicas
|
|
333
|
+
},
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Apply multiple swap transformations in a single table swap operation.
|
|
338
|
+
* Each swap gets its own random value to ensure independent swap decisions.
|
|
339
|
+
*/
|
|
340
|
+
async applySwapTransformations(tableName, swaps) {
|
|
341
|
+
const client = this.getClient();
|
|
342
|
+
const escapedTable = escapeClickHouseIdentifier(tableName);
|
|
343
|
+
// Create unique suffix for temp tables
|
|
344
|
+
const uniqueSuffix = `${String(Date.now())}_${Math.random().toString(36).slice(2, 8)}`;
|
|
345
|
+
const tempTable = escapeClickHouseIdentifier(`${tableName}_swap_temp_${uniqueSuffix}`);
|
|
346
|
+
const oldTable = escapeClickHouseIdentifier(`${tableName}_swap_old_${uniqueSuffix}`);
|
|
347
|
+
// Get table structure
|
|
348
|
+
const structResult = await client.query({
|
|
349
|
+
query: `SHOW CREATE TABLE ${escapedTable}`,
|
|
350
|
+
format: "TabSeparated",
|
|
351
|
+
});
|
|
352
|
+
const createStatement = await structResult.text();
|
|
353
|
+
// Create temp table with same structure
|
|
354
|
+
const tempCreateSql = createStatement.replace(new RegExp(`CREATE TABLE [^\\s]*(${tableName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")})[^\\s]*`), `CREATE TABLE ${tempTable}`);
|
|
355
|
+
await client.command({ query: tempCreateSql });
|
|
356
|
+
// Get all columns
|
|
357
|
+
const colsResult = await client.query({
|
|
358
|
+
query: `SELECT name FROM system.columns WHERE database = currentDatabase() AND table = '${tableName}'`,
|
|
359
|
+
format: "JSONEachRow",
|
|
360
|
+
});
|
|
361
|
+
const colsData = await colsResult.json();
|
|
362
|
+
const allColumns = colsData.map((c) => escapeClickHouseIdentifier(c.name));
|
|
363
|
+
// Build swap info map: column -> { otherColumn, probability, randVar }
|
|
364
|
+
const swapInfo = new Map();
|
|
365
|
+
swaps.forEach((swap, i) => {
|
|
366
|
+
const col1 = escapeClickHouseIdentifier(swap.column1);
|
|
367
|
+
const col2 = escapeClickHouseIdentifier(swap.column2);
|
|
368
|
+
const prob = String(swap.probability);
|
|
369
|
+
const randVar = `_swap_rand_${String(i)}`;
|
|
370
|
+
swapInfo.set(col1, { otherCol: col2, prob, randVar });
|
|
371
|
+
swapInfo.set(col2, { otherCol: col1, prob, randVar });
|
|
372
|
+
});
|
|
373
|
+
// Build SELECT with swap logic
|
|
374
|
+
const selectColumns = allColumns.map((col) => {
|
|
375
|
+
const info = swapInfo.get(col);
|
|
376
|
+
if (info) {
|
|
377
|
+
return `if(${info.randVar} < ${info.prob}, ${info.otherCol}, ${col}) as ${col}`;
|
|
378
|
+
}
|
|
379
|
+
return col;
|
|
380
|
+
});
|
|
381
|
+
// Build random variable definitions for subquery
|
|
382
|
+
const randVars = swaps
|
|
383
|
+
.map((_, i) => `rand() / 4294967295.0 as _swap_rand_${String(i)}`)
|
|
384
|
+
.join(", ");
|
|
385
|
+
// Use subquery to compute random values once per row
|
|
386
|
+
const insertSql = `
|
|
387
|
+
INSERT INTO ${tempTable}
|
|
388
|
+
SELECT ${selectColumns.join(", ")}
|
|
389
|
+
FROM (
|
|
390
|
+
SELECT *, ${randVars}
|
|
391
|
+
FROM ${escapedTable}
|
|
392
|
+
)
|
|
393
|
+
`;
|
|
394
|
+
await client.command({ query: insertSql });
|
|
395
|
+
// Swap tables
|
|
396
|
+
await client.command({
|
|
397
|
+
query: `RENAME TABLE ${escapedTable} TO ${oldTable}, ${tempTable} TO ${escapedTable}`,
|
|
398
|
+
});
|
|
399
|
+
// Drop old table
|
|
400
|
+
await client.command({ query: `DROP TABLE ${oldTable}` });
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Apply a lookup transformation using ClickHouse's table swap approach.
|
|
404
|
+
* Since ClickHouse doesn't support correlated subqueries in ALTER TABLE UPDATE,
|
|
405
|
+
* we use: CREATE TABLE new -> INSERT SELECT with JOIN -> RENAME swap
|
|
406
|
+
*/
|
|
407
|
+
async applyLookupTransformation(tableName, t) {
|
|
408
|
+
const client = this.getClient();
|
|
409
|
+
const escapedTable = escapeClickHouseIdentifier(tableName);
|
|
410
|
+
const escapedCol = escapeClickHouseIdentifier(t.column);
|
|
411
|
+
const fromTable = escapeClickHouseIdentifier(t.fromTable);
|
|
412
|
+
const fromCol = escapeClickHouseIdentifier(t.fromColumn);
|
|
413
|
+
const targetJoinCol = escapeClickHouseIdentifier(t.joinOn.targetColumn);
|
|
414
|
+
const lookupJoinCol = escapeClickHouseIdentifier(t.joinOn.lookupColumn);
|
|
415
|
+
// Use unique suffix to avoid conflicts with concurrent runs
|
|
416
|
+
const uniqueSuffix = `${String(Date.now())}_${Math.random().toString(36).slice(2, 8)}`;
|
|
417
|
+
const tempTableName = `${tableName}_lookup_temp_${uniqueSuffix}`;
|
|
418
|
+
const oldTableName = `${tableName}_lookup_old_${uniqueSuffix}`;
|
|
419
|
+
const escapedTempTable = escapeClickHouseIdentifier(tempTableName);
|
|
420
|
+
const escapedOldTable = escapeClickHouseIdentifier(oldTableName);
|
|
421
|
+
// 1. Create new table with same structure
|
|
422
|
+
await client.command({
|
|
423
|
+
query: `CREATE TABLE ${escapedTempTable} AS ${escapedTable}`,
|
|
424
|
+
clickhouse_settings: { wait_end_of_query: 1 },
|
|
425
|
+
});
|
|
426
|
+
// 2. INSERT SELECT with LEFT JOIN, using REPLACE to update the lookup column
|
|
427
|
+
// The REPLACE syntax replaces the column value in the SELECT *
|
|
428
|
+
const insertSql = `
|
|
429
|
+
INSERT INTO ${escapedTempTable}
|
|
430
|
+
SELECT
|
|
431
|
+
t.* REPLACE (coalesce(s.${fromCol}, t.${escapedCol}) AS ${escapedCol})
|
|
432
|
+
FROM ${escapedTable} t
|
|
433
|
+
LEFT JOIN ${fromTable} s ON t.${targetJoinCol} = s.${lookupJoinCol}
|
|
434
|
+
`;
|
|
435
|
+
await client.command({
|
|
436
|
+
query: insertSql,
|
|
437
|
+
clickhouse_settings: { wait_end_of_query: 1 },
|
|
438
|
+
});
|
|
439
|
+
// 3. RENAME tables to swap (atomic operation)
|
|
440
|
+
// target -> target_old, target_new -> target
|
|
441
|
+
await client.command({
|
|
442
|
+
query: `RENAME TABLE ${escapedTable} TO ${escapedOldTable}, ${escapedTempTable} TO ${escapedTable}`,
|
|
443
|
+
clickhouse_settings: { wait_end_of_query: 1 },
|
|
444
|
+
});
|
|
445
|
+
// 4. Drop the old table
|
|
446
|
+
await client.command({
|
|
447
|
+
query: `DROP TABLE IF EXISTS ${escapedOldTable}`,
|
|
448
|
+
clickhouse_settings: { wait_end_of_query: 1 },
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
//# sourceMappingURL=clickhouse-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickhouse-generator.js","sourceRoot":"","sources":["../../src/generator/clickhouse-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Escape identifier for PostgreSQL using double quotes.
|
|
3
|
+
* Uses pg-format library for battle-tested escaping.
|
|
4
|
+
*/
|
|
5
|
+
export declare function escapePostgresIdentifier(name: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Escape identifier for ClickHouse using backticks.
|
|
8
|
+
* Doubles any existing backticks in the name.
|
|
9
|
+
*/
|
|
10
|
+
export declare function escapeClickHouseIdentifier(name: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Escape identifier for Trino using double quotes.
|
|
13
|
+
* Always quotes the identifier (unlike Postgres, Trino's $ suffix for
|
|
14
|
+
* metadata tables requires quoting).
|
|
15
|
+
* Doubles any existing double quotes in the name.
|
|
16
|
+
*/
|
|
17
|
+
export declare function escapeTrinoIdentifier(name: string): string;
|
|
18
|
+
//# sourceMappingURL=escape.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/generator/escape.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import format from "pg-format";
|
|
2
|
+
/**
|
|
3
|
+
* Escape identifier for PostgreSQL using double quotes.
|
|
4
|
+
* Uses pg-format library for battle-tested escaping.
|
|
5
|
+
*/
|
|
6
|
+
export function escapePostgresIdentifier(name) {
|
|
7
|
+
return format.ident(name);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Escape identifier for ClickHouse using backticks.
|
|
11
|
+
* Doubles any existing backticks in the name.
|
|
12
|
+
*/
|
|
13
|
+
export function escapeClickHouseIdentifier(name) {
|
|
14
|
+
return `\`${name.replace(/`/g, "``")}\``;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Escape identifier for Trino using double quotes.
|
|
18
|
+
* Always quotes the identifier (unlike Postgres, Trino's $ suffix for
|
|
19
|
+
* metadata tables requires quoting).
|
|
20
|
+
* Doubles any existing double quotes in the name.
|
|
21
|
+
*/
|
|
22
|
+
export function escapeTrinoIdentifier(name) {
|
|
23
|
+
return `"${name.replace(/"/g, '""')}"`;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=escape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/generator/escape.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,WAAW,CAAC;AAE/B;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type { DataGenerator, TableConfig, ColumnConfig, GenerateOptions, GenerateResult, GeneratedRow, ColumnType, GeneratorConfig, SequenceGenerator, RandomIntGenerator, RandomFloatGenerator, RandomStringGenerator, ChoiceGenerator, ConstantGenerator, DatetimeGenerator, UuidGenerator, ChoiceByLookupGenerator, Transformation, TemplateTransformation, MutateTransformation, LookupTransformation, TransformationBatch, TransformResult, } from "./types.js";
|
|
2
|
+
export { formatBytes, formatDuration, getLookupTableName } from "./utils.js";
|
|
3
|
+
export { BaseDataGenerator } from "./base-generator.js";
|
|
4
|
+
export { escapePostgresIdentifier, escapeClickHouseIdentifier, escapeTrinoIdentifier, } from "./escape.js";
|
|
5
|
+
export { PostgresDataGenerator, type PostgresConfig, } from "./postgres-generator.js";
|
|
6
|
+
export { ClickHouseDataGenerator, type ClickHouseConfig, } from "./clickhouse-generator.js";
|
|
7
|
+
export { SQLiteDataGenerator, type SQLiteConfig } from "./sqlite-generator.js";
|
|
8
|
+
export { TrinoDataGenerator, type TrinoConfig } from "./trino-generator.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,WAAW,EACX,YAAY,EACZ,eAAe,EACf,cAAc,EACd,YAAY,EACZ,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,qBAAqB,EACrB,KAAK,cAAc,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uBAAuB,EACvB,KAAK,gBAAgB,GACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { formatBytes, formatDuration, getLookupTableName } from "./utils.js";
|
|
2
|
+
export { BaseDataGenerator } from "./base-generator.js";
|
|
3
|
+
export { escapePostgresIdentifier, escapeClickHouseIdentifier, escapeTrinoIdentifier, } from "./escape.js";
|
|
4
|
+
export { PostgresDataGenerator, } from "./postgres-generator.js";
|
|
5
|
+
export { ClickHouseDataGenerator, } from "./clickhouse-generator.js";
|
|
6
|
+
export { SQLiteDataGenerator } from "./sqlite-generator.js";
|
|
7
|
+
export { TrinoDataGenerator } from "./trino-generator.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,qBAAqB,GAEtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uBAAuB,GAExB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,mBAAmB,EAAqB,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAoB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { TableConfig, GeneratedRow, GeneratorConfig, Transformation } from "./types.js";
|
|
2
|
+
import { BaseDataGenerator } from "./base-generator.js";
|
|
3
|
+
export interface PostgresConfig {
|
|
4
|
+
host: string;
|
|
5
|
+
port: number;
|
|
6
|
+
database: string;
|
|
7
|
+
username: string;
|
|
8
|
+
password: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Convert a generator config to a Postgres SQL expression
|
|
12
|
+
*/
|
|
13
|
+
export declare function generatorToPostgresExpr(gen: GeneratorConfig, seqExpr: string): string;
|
|
14
|
+
export declare class PostgresDataGenerator extends BaseDataGenerator {
|
|
15
|
+
private config;
|
|
16
|
+
readonly name = "postgres";
|
|
17
|
+
private sql;
|
|
18
|
+
constructor(config: PostgresConfig);
|
|
19
|
+
connect(): Promise<void>;
|
|
20
|
+
disconnect(): Promise<void>;
|
|
21
|
+
private getSql;
|
|
22
|
+
createTable(table: TableConfig): Promise<void>;
|
|
23
|
+
truncateTable(tableName: string): Promise<void>;
|
|
24
|
+
dropTable(tableName: string): Promise<void>;
|
|
25
|
+
protected generateNative(table: TableConfig, rowCount: number, startSequence: number): Promise<void>;
|
|
26
|
+
queryRows(tableName: string, limit?: number): Promise<GeneratedRow[]>;
|
|
27
|
+
countRows(tableName: string): Promise<number>;
|
|
28
|
+
getMaxValue(tableName: string, columnName: string): Promise<number | null>;
|
|
29
|
+
getTableSize(tableName: string): Promise<number | null>;
|
|
30
|
+
optimize(tableName: string): Promise<void>;
|
|
31
|
+
protected applyTransformations(tableName: string, transformations: Transformation[]): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=postgres-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-generator.d.ts","sourceRoot":"","sources":["../../src/generator/postgres-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EAEZ,eAAe,EAEf,cAAc,EAGf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAIxD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA8BD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,MAAM,GACd,MAAM,CA4CR;AAED,qBAAa,qBAAsB,SAAQ,iBAAiB;IAI9C,OAAO,CAAC,MAAM;IAH1B,QAAQ,CAAC,IAAI,cAAc;IAC3B,OAAO,CAAC,GAAG,CAAoB;gBAEX,MAAM,EAAE,cAAc;IAI1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAWlB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC,OAAO,CAAC,MAAM;IAOR,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAe9C,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAKjC,cAAc,CAC5B,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IAgEV,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAMlE,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAU7C,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWnB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWvD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAMhC,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,cAAc,EAAE,GAChC,OAAO,CAAC,IAAI,CAAC;CAkHjB"}
|