@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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +484 -0
  3. package/dist/generator/base-generator.d.ts +39 -0
  4. package/dist/generator/base-generator.d.ts.map +1 -0
  5. package/dist/generator/base-generator.js +72 -0
  6. package/dist/generator/base-generator.js.map +1 -0
  7. package/dist/generator/clickhouse-generator.d.ts +44 -0
  8. package/dist/generator/clickhouse-generator.d.ts.map +1 -0
  9. package/dist/generator/clickhouse-generator.js +452 -0
  10. package/dist/generator/clickhouse-generator.js.map +1 -0
  11. package/dist/generator/escape.d.ts +18 -0
  12. package/dist/generator/escape.d.ts.map +1 -0
  13. package/dist/generator/escape.js +25 -0
  14. package/dist/generator/escape.js.map +1 -0
  15. package/dist/generator/index.d.ts +9 -0
  16. package/dist/generator/index.d.ts.map +1 -0
  17. package/dist/generator/index.js +8 -0
  18. package/dist/generator/index.js.map +1 -0
  19. package/dist/generator/postgres-generator.d.ts +33 -0
  20. package/dist/generator/postgres-generator.d.ts.map +1 -0
  21. package/dist/generator/postgres-generator.js +317 -0
  22. package/dist/generator/postgres-generator.js.map +1 -0
  23. package/dist/generator/sqlite-generator.d.ts +30 -0
  24. package/dist/generator/sqlite-generator.d.ts.map +1 -0
  25. package/dist/generator/sqlite-generator.js +334 -0
  26. package/dist/generator/sqlite-generator.js.map +1 -0
  27. package/dist/generator/trino-generator.d.ts +38 -0
  28. package/dist/generator/trino-generator.d.ts.map +1 -0
  29. package/dist/generator/trino-generator.js +408 -0
  30. package/dist/generator/trino-generator.js.map +1 -0
  31. package/dist/generator/types.d.ts +230 -0
  32. package/dist/generator/types.d.ts.map +1 -0
  33. package/dist/generator/types.js +2 -0
  34. package/dist/generator/types.js.map +1 -0
  35. package/dist/generator/utils.d.ts +14 -0
  36. package/dist/generator/utils.d.ts.map +1 -0
  37. package/dist/generator/utils.js +48 -0
  38. package/dist/generator/utils.js.map +1 -0
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +2 -0
  42. package/dist/index.js.map +1 -0
  43. 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"}