@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,408 @@
1
+ import { BasicAuth, Trino } from "trino-client";
2
+ import { BaseDataGenerator } from "./base-generator.js";
3
+ import { escapeTrinoIdentifier } from "./escape.js";
4
+ import { getLookupTableName } from "./utils.js";
5
+ function columnTypeToTrino(column) {
6
+ switch (column.type) {
7
+ case "integer":
8
+ return "INTEGER";
9
+ case "bigint":
10
+ return "BIGINT";
11
+ case "float":
12
+ return "DOUBLE";
13
+ case "string":
14
+ return "VARCHAR";
15
+ case "boolean":
16
+ return "BOOLEAN";
17
+ case "datetime":
18
+ return "TIMESTAMP";
19
+ case "date":
20
+ return "DATE";
21
+ }
22
+ }
23
+ /**
24
+ * Wrap an expression to return NULL with given probability (Trino)
25
+ */
26
+ function wrapWithNullCheck(expr, nullProbability) {
27
+ if (nullProbability <= 0)
28
+ return expr;
29
+ if (nullProbability >= 1)
30
+ return "NULL";
31
+ return `CASE WHEN random() < ${String(nullProbability)} THEN NULL ELSE ${expr} END`;
32
+ }
33
+ /**
34
+ * Convert a generator config to a Trino SQL expression
35
+ * Trino uses 'n' as the row number from UNNEST(sequence(...))
36
+ */
37
+ export function generatorToTrinoExpr(gen, seqExpr) {
38
+ switch (gen.kind) {
39
+ case "sequence": {
40
+ const start = gen.start ?? 1;
41
+ const step = gen.step ?? 1;
42
+ return `(${String(start)} - 1 + ${seqExpr} * ${String(step)})`;
43
+ }
44
+ case "randomInt":
45
+ // Trino random() returns 0.0 to 1.0
46
+ return `CAST(floor(random() * ${String(gen.max - gen.min + 1)} + ${String(gen.min)}) AS INTEGER)`;
47
+ case "randomFloat": {
48
+ const precision = gen.precision ?? 2;
49
+ return `round(random() * ${String(gen.max - gen.min)} + ${String(gen.min)}, ${String(precision)})`;
50
+ }
51
+ case "randomString": {
52
+ const len = gen.length;
53
+ // Trino doesn't have md5 on random, use substr of uuid
54
+ return `substr(replace(cast(uuid() as varchar), '-', ''), 1, ${String(len)})`;
55
+ }
56
+ case "choice": {
57
+ const values = gen.values;
58
+ const arr = values.map((v) => typeof v === "string" ? `'${v}'` : String(v));
59
+ // Use element_at with 1-based index
60
+ return `element_at(ARRAY[${arr.join(", ")}], CAST(floor(random() * ${String(arr.length)}) + 1 AS INTEGER))`;
61
+ }
62
+ case "choiceByLookup": {
63
+ // Reference the CTE that will be added by generateNative
64
+ const cteName = getLookupTableName(gen.values);
65
+ return `element_at(${cteName}.arr, CAST(floor(random() * cardinality(${cteName}.arr)) + 1 AS INTEGER))`;
66
+ }
67
+ case "constant": {
68
+ const val = gen.value;
69
+ return typeof val === "string" ? `'${val}'` : String(val);
70
+ }
71
+ case "datetime": {
72
+ const from = gen.from ?? new Date("2020-01-01");
73
+ const to = gen.to ?? new Date();
74
+ const fromTs = Math.floor(from.getTime() / 1000);
75
+ const toTs = Math.floor(to.getTime() / 1000);
76
+ // from_unixtime returns timestamp
77
+ return `from_unixtime(${String(fromTs)} + CAST(floor(random() * ${String(toTs - fromTs)}) AS BIGINT))`;
78
+ }
79
+ case "uuid":
80
+ return "uuid()";
81
+ }
82
+ }
83
+ export class TrinoDataGenerator extends BaseDataGenerator {
84
+ config;
85
+ name = "trino";
86
+ trino = null;
87
+ escapedCatalog;
88
+ escapedSchema;
89
+ constructor(config) {
90
+ super();
91
+ this.config = config;
92
+ this.escapedCatalog = escapeTrinoIdentifier(config.catalog);
93
+ this.escapedSchema = escapeTrinoIdentifier(config.schema);
94
+ }
95
+ get fullSchemaPath() {
96
+ return `${this.escapedCatalog}.${this.escapedSchema}`;
97
+ }
98
+ async connect() {
99
+ this.trino = Trino.create({
100
+ server: `http://${this.config.host}:${String(this.config.port)}`,
101
+ catalog: this.config.catalog,
102
+ schema: this.config.schema,
103
+ auth: new BasicAuth(this.config.user),
104
+ });
105
+ // Ensure schema exists
106
+ const createSchema = await this.trino.query(`CREATE SCHEMA IF NOT EXISTS ${this.fullSchemaPath}`);
107
+ for await (const _ of createSchema) {
108
+ // consume iterator
109
+ }
110
+ }
111
+ disconnect() {
112
+ this.trino = null;
113
+ return Promise.resolve();
114
+ }
115
+ getTrino() {
116
+ if (!this.trino) {
117
+ throw new Error("Not connected to Trino");
118
+ }
119
+ return this.trino;
120
+ }
121
+ fullTableName(tableName) {
122
+ return `${this.fullSchemaPath}.${escapeTrinoIdentifier(tableName)}`;
123
+ }
124
+ async createTable(table) {
125
+ const trino = this.getTrino();
126
+ const columns = table.columns
127
+ .map((col) => {
128
+ const nullable = col.nullable ? "" : " NOT NULL";
129
+ return `${escapeTrinoIdentifier(col.name)} ${columnTypeToTrino(col)}${nullable}`;
130
+ })
131
+ .join(", ");
132
+ const query = await trino.query(`CREATE TABLE IF NOT EXISTS ${this.fullTableName(table.name)} (${columns}) WITH (format = 'PARQUET')`);
133
+ for await (const result of query) {
134
+ const trinoResult = result;
135
+ if (trinoResult.error) {
136
+ throw new Error(`Trino createTable failed: ${trinoResult.error.message}`);
137
+ }
138
+ }
139
+ }
140
+ async truncateTable(tableName) {
141
+ const trino = this.getTrino();
142
+ const query = await trino.query(`DELETE FROM ${this.fullTableName(tableName)}`);
143
+ for await (const result of query) {
144
+ const trinoResult = result;
145
+ if (trinoResult.error) {
146
+ throw new Error(`Trino truncateTable failed: ${trinoResult.error.message}`);
147
+ }
148
+ }
149
+ }
150
+ async dropTable(tableName) {
151
+ const trino = this.getTrino();
152
+ const query = await trino.query(`DROP TABLE IF EXISTS ${this.fullTableName(tableName)}`);
153
+ for await (const result of query) {
154
+ // Check for errors in Trino response
155
+ const trinoResult = result;
156
+ if (trinoResult.error) {
157
+ throw new Error(`Trino query failed: ${trinoResult.error.message}`);
158
+ }
159
+ }
160
+ }
161
+ async generateNative(table, rowCount, startSequence) {
162
+ const trino = this.getTrino();
163
+ // Collect choiceByLookup generators to create CTEs
164
+ const lookupCtes = [];
165
+ for (const col of table.columns) {
166
+ if (col.generator.kind === "choiceByLookup") {
167
+ const gen = col.generator;
168
+ const cteName = getLookupTableName(gen.values);
169
+ const valuesLiteral = gen.values
170
+ .map((v) => `'${v.replace(/'/g, "''")}'`)
171
+ .join(", ");
172
+ lookupCtes.push(`${cteName} AS (SELECT ARRAY[${valuesLiteral}] AS arr)`);
173
+ }
174
+ }
175
+ // Build column list and expressions
176
+ const columns = table.columns.map((c) => escapeTrinoIdentifier(c.name));
177
+ // Trino sequence() has a 10,000 entry limit
178
+ // Use 3-level CROSS JOIN to support up to 1 trillion rows:
179
+ // - level1: 0 to numChunks - 1 (each chunk = 100M rows)
180
+ // - level2: 0 to 9999 (10k values)
181
+ // - level3: 1 to 10000 (10k values)
182
+ // Row number = level1 * 100M + level2 * 10k + level3
183
+ const SEQUENCE_LIMIT = 10_000; // Trino's hard limit per sequence
184
+ const ROWS_PER_CHUNK = SEQUENCE_LIMIT * SEQUENCE_LIMIT; // 100M
185
+ const numChunks = Math.ceil(rowCount / ROWS_PER_CHUNK);
186
+ // The row number expression combines all three levels
187
+ const seqExpr = `(${String(startSequence - 1)} + level1 * ${String(ROWS_PER_CHUNK)} + level2 * ${String(SEQUENCE_LIMIT)} + level3)`;
188
+ const expressions = table.columns.map((col) => {
189
+ let expr = generatorToTrinoExpr(col.generator, seqExpr);
190
+ // Apply null probability if specified
191
+ if (col.nullable && col.nullProbability && col.nullProbability > 0) {
192
+ expr = wrapWithNullCheck(expr, col.nullProbability);
193
+ }
194
+ return expr;
195
+ });
196
+ // Build WITH clause and cross joins for lookup CTEs
197
+ const ctePrefix = lookupCtes.length > 0 ? `WITH ${lookupCtes.join(", ")} ` : "";
198
+ const lookupJoins = lookupCtes.length > 0
199
+ ? " CROSS JOIN " +
200
+ [
201
+ ...new Set(table.columns
202
+ .filter((c) => c.generator.kind === "choiceByLookup")
203
+ .map((c) => getLookupTableName(c.generator.values))),
204
+ ].join(" CROSS JOIN ")
205
+ : "";
206
+ const insertSql = `
207
+ INSERT INTO ${this.fullTableName(table.name)} (${columns.join(", ")})
208
+ ${ctePrefix}SELECT ${expressions.join(", ")}
209
+ FROM UNNEST(sequence(0, ${String(numChunks - 1)})) AS t1(level1)
210
+ CROSS JOIN UNNEST(sequence(0, ${String(SEQUENCE_LIMIT - 1)})) AS t2(level2)
211
+ CROSS JOIN UNNEST(sequence(1, ${String(SEQUENCE_LIMIT)})) AS t3(level3)${lookupJoins}
212
+ WHERE (level1 * ${String(ROWS_PER_CHUNK)} + level2 * ${String(SEQUENCE_LIMIT)} + level3) <= ${String(rowCount)}
213
+ `;
214
+ const query = await trino.query(insertSql);
215
+ for await (const result of query) {
216
+ const trinoResult = result;
217
+ if (trinoResult.error) {
218
+ throw new Error(`Trino insert failed: ${trinoResult.error.message}`);
219
+ }
220
+ }
221
+ }
222
+ async queryRows(tableName, limit = 100) {
223
+ const trino = this.getTrino();
224
+ const query = await trino.query(`SELECT * FROM ${this.fullTableName(tableName)} LIMIT ${String(limit)}`);
225
+ const results = [];
226
+ for await (const result of query) {
227
+ const trinoResult = result;
228
+ if (trinoResult.data && trinoResult.columns) {
229
+ for (const row of trinoResult.data) {
230
+ const obj = {};
231
+ trinoResult.columns.forEach((col, i) => {
232
+ obj[col.name] = row[i];
233
+ });
234
+ results.push(obj);
235
+ }
236
+ }
237
+ }
238
+ return results;
239
+ }
240
+ async countRows(tableName) {
241
+ const trino = this.getTrino();
242
+ const query = await trino.query(`SELECT COUNT(*) as count FROM ${this.fullTableName(tableName)}`);
243
+ for await (const result of query) {
244
+ const trinoResult = result;
245
+ const firstRow = trinoResult.data?.[0];
246
+ if (firstRow && firstRow.length > 0) {
247
+ return Number(firstRow[0]);
248
+ }
249
+ }
250
+ return 0;
251
+ }
252
+ async getMaxValue(tableName, columnName) {
253
+ const trino = this.getTrino();
254
+ const query = await trino.query(`SELECT MAX(${escapeTrinoIdentifier(columnName)}) as max_val FROM ${this.fullTableName(tableName)}`);
255
+ for await (const result of query) {
256
+ const trinoResult = result;
257
+ const firstRow = trinoResult.data?.[0];
258
+ if (firstRow && firstRow.length > 0 && firstRow[0] !== null) {
259
+ return Number(firstRow[0]);
260
+ }
261
+ }
262
+ return null;
263
+ }
264
+ async getTableSize(tableName) {
265
+ const trino = this.getTrino();
266
+ // Query the $files metadata table to get total file sizes
267
+ // The $files suffix must be part of the quoted table name
268
+ const filesTableName = escapeTrinoIdentifier(`${tableName}$files`);
269
+ const query = await trino.query(`SELECT COALESCE(SUM(file_size_in_bytes), 0) as size FROM ${this.fullSchemaPath}.${filesTableName}`);
270
+ for await (const result of query) {
271
+ const trinoResult = result;
272
+ const firstRow = trinoResult.data?.[0];
273
+ if (firstRow && firstRow.length > 0) {
274
+ return Number(firstRow[0]);
275
+ }
276
+ }
277
+ return null;
278
+ }
279
+ async optimize(tableName) {
280
+ const trino = this.getTrino();
281
+ const fullTableName = `${this.fullSchemaPath}.${escapeTrinoIdentifier(tableName)}`;
282
+ // Compact small files into larger ones for better read performance
283
+ const rewriteQuery = await trino.query(`ALTER TABLE ${fullTableName} EXECUTE rewrite_data_files(min_file_size_bytes => 10485760)`);
284
+ // Consume the iterator to complete the query
285
+ for await (const _ of rewriteQuery) {
286
+ // no-op
287
+ }
288
+ // Remove old snapshots older than 1 day to reclaim storage
289
+ const expireQuery = await trino.query(`ALTER TABLE ${fullTableName} EXECUTE expire_snapshots(retention_threshold => '1d')`);
290
+ for await (const _ of expireQuery) {
291
+ // no-op
292
+ }
293
+ // Remove orphan files not referenced by any snapshot
294
+ const orphanQuery = await trino.query(`ALTER TABLE ${fullTableName} EXECUTE remove_orphan_files(retention_threshold => '1d')`);
295
+ for await (const _ of orphanQuery) {
296
+ // no-op
297
+ }
298
+ }
299
+ async applyTransformations(tableName, transformations) {
300
+ if (transformations.length === 0)
301
+ return;
302
+ const trino = this.getTrino();
303
+ const fullTableName = `${this.fullSchemaPath}.${escapeTrinoIdentifier(tableName)}`;
304
+ const setClauses = [];
305
+ for (const t of transformations) {
306
+ switch (t.kind) {
307
+ case "template": {
308
+ const escapedCol = escapeTrinoIdentifier(t.column);
309
+ // Replace {column_name} with column references
310
+ let expr = `'${t.template.replace(/'/g, "''")}'`;
311
+ const refs = t.template.match(/\{([^}]+)\}/g) ?? [];
312
+ for (const ref of refs) {
313
+ const colName = ref.slice(1, -1);
314
+ const colRef = escapeTrinoIdentifier(colName);
315
+ // Replace {col} with concat function
316
+ expr = expr.replace(`'{${colName}}'`, `', cast(${colRef} as varchar), '`);
317
+ expr = expr.replace(`{${colName}}`, `', cast(${colRef} as varchar), '`);
318
+ }
319
+ // Wrap in concat and clean up
320
+ expr = `concat(${expr})`;
321
+ expr = expr.replace(/concat\('',\s*/g, "concat(");
322
+ expr = expr.replace(/,\s*''\)/g, ")");
323
+ expr = expr.replace(/concat\('([^']+)'\)/g, "'$1'"); // Single literal doesn't need concat
324
+ if (t.lowercase) {
325
+ expr = `lower(${expr})`;
326
+ }
327
+ setClauses.push(`${escapedCol} = ${expr}`);
328
+ break;
329
+ }
330
+ case "mutate": {
331
+ const escapedCol = escapeTrinoIdentifier(t.column);
332
+ // Random string mutation using Trino functions
333
+ const { probability, operations } = t;
334
+ // Trino random() returns double 0-1
335
+ const randomPos = `cast(floor(random() * length(${escapedCol})) + 1 as integer)`;
336
+ // Build mutation expressions for each operation
337
+ const mutationExprs = {
338
+ replace: `concat(substr(${escapedCol}, 1, ${randomPos} - 1), 'X', substr(${escapedCol}, ${randomPos} + 1))`,
339
+ delete: `concat(substr(${escapedCol}, 1, ${randomPos} - 1), substr(${escapedCol}, ${randomPos} + 1))`,
340
+ insert: `concat(substr(${escapedCol}, 1, ${randomPos}), 'X', substr(${escapedCol}, ${randomPos} + 1))`,
341
+ };
342
+ // Build expression that randomly picks from available operations
343
+ let mutateExpr;
344
+ if (operations.length === 1) {
345
+ // We know operations[0] exists since length === 1
346
+ mutateExpr = mutationExprs[operations[0]]; // eslint-disable-line @typescript-eslint/no-non-null-assertion
347
+ }
348
+ else {
349
+ // Use CASE with random() to pick operation
350
+ const cases = operations.map((op, i) => {
351
+ const threshold = (i + 1) / operations.length;
352
+ if (i === operations.length - 1) {
353
+ return `ELSE ${mutationExprs[op]}`;
354
+ }
355
+ return `WHEN random() < ${String(threshold)} THEN ${mutationExprs[op]}`;
356
+ });
357
+ mutateExpr = `(CASE ${cases.join(" ")} END)`;
358
+ }
359
+ setClauses.push(`${escapedCol} = CASE WHEN random() < ${String(probability)} THEN ${mutateExpr} ELSE ${escapedCol} END`);
360
+ break;
361
+ }
362
+ case "lookup": {
363
+ const escapedCol = escapeTrinoIdentifier(t.column);
364
+ // Lookup value from another table via join
365
+ // Trino uses correlated subquery
366
+ const lookupSchema = escapeTrinoIdentifier(this.config.schema);
367
+ const fromTable = escapeTrinoIdentifier(t.fromTable);
368
+ const fromCol = escapeTrinoIdentifier(t.fromColumn);
369
+ const targetJoinCol = escapeTrinoIdentifier(t.joinOn.targetColumn);
370
+ const lookupJoinCol = escapeTrinoIdentifier(t.joinOn.lookupColumn);
371
+ const fullLookupTable = `${this.escapedCatalog}.${lookupSchema}.${fromTable}`;
372
+ setClauses.push(`${escapedCol} = (SELECT ${fromCol} FROM ${fullLookupTable} WHERE ${lookupJoinCol} = ${fullTableName}.${targetJoinCol})`);
373
+ break;
374
+ }
375
+ case "swap": {
376
+ // Swap handled separately - needs both columns in one UPDATE with same random
377
+ break;
378
+ }
379
+ }
380
+ }
381
+ // Handle swap transformations separately (need atomic swap with same random)
382
+ const swapTransformations = transformations.filter((t) => t.kind === "swap");
383
+ for (const swap of swapTransformations) {
384
+ const col1 = escapeTrinoIdentifier(swap.column1);
385
+ const col2 = escapeTrinoIdentifier(swap.column2);
386
+ const prob = String(swap.probability);
387
+ // Trino: SET a = b, b = a works atomically (uses old values on right side)
388
+ const swapSql = `
389
+ UPDATE ${fullTableName} SET
390
+ ${col1} = ${col2},
391
+ ${col2} = ${col1}
392
+ WHERE random() < ${prob}
393
+ `;
394
+ const swapResult = await trino.query(swapSql);
395
+ for await (const _ of swapResult) {
396
+ // consume result
397
+ }
398
+ }
399
+ if (setClauses.length === 0)
400
+ return;
401
+ const updateSql = `UPDATE ${fullTableName} SET ${setClauses.join(", ")}`;
402
+ const result = await trino.query(updateSql);
403
+ for await (const _ of result) {
404
+ // consume result
405
+ }
406
+ }
407
+ }
408
+ //# sourceMappingURL=trino-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trino-generator.js","sourceRoot":"","sources":["../../src/generator/trino-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,230 @@
1
+ export type ColumnType = "integer" | "bigint" | "float" | "string" | "boolean" | "datetime" | "date";
2
+ export interface SequenceGenerator {
3
+ kind: "sequence";
4
+ start?: number;
5
+ step?: number;
6
+ }
7
+ export interface RandomIntGenerator {
8
+ kind: "randomInt";
9
+ min: number;
10
+ max: number;
11
+ }
12
+ export interface RandomFloatGenerator {
13
+ kind: "randomFloat";
14
+ min: number;
15
+ max: number;
16
+ precision?: number;
17
+ }
18
+ export interface RandomStringGenerator {
19
+ kind: "randomString";
20
+ length: number;
21
+ }
22
+ export interface ChoiceGenerator<T = unknown> {
23
+ kind: "choice";
24
+ values: T[];
25
+ }
26
+ export interface ConstantGenerator<T = unknown> {
27
+ kind: "constant";
28
+ value: T;
29
+ }
30
+ export interface DatetimeGenerator {
31
+ kind: "datetime";
32
+ from?: Date;
33
+ to?: Date;
34
+ }
35
+ export interface UuidGenerator {
36
+ kind: "uuid";
37
+ }
38
+ export interface ChoiceByLookupGenerator {
39
+ kind: "choiceByLookup";
40
+ /** Array of values to choose from (will be stored in a lookup table) */
41
+ values: string[];
42
+ }
43
+ export type GeneratorConfig = SequenceGenerator | RandomIntGenerator | RandomFloatGenerator | RandomStringGenerator | ChoiceGenerator | ConstantGenerator | DatetimeGenerator | UuidGenerator | ChoiceByLookupGenerator;
44
+ /**
45
+ * Template transformation - construct a string from other columns
46
+ * Use {column_name} to reference other columns
47
+ */
48
+ export interface TemplateTransformation {
49
+ kind: "template";
50
+ /** Column to update */
51
+ column: string;
52
+ /** Template string, e.g., "{first_name}.{last_name}@example.com" */
53
+ template: string;
54
+ /** If true, convert to lowercase (default: false) */
55
+ lowercase?: boolean;
56
+ }
57
+ /**
58
+ * Mutation operation types
59
+ */
60
+ export type MutationOperation = "replace" | "delete" | "insert";
61
+ /**
62
+ * Mutate transformation - randomly modify characters in a string
63
+ */
64
+ export interface MutateTransformation {
65
+ kind: "mutate";
66
+ /** Column to mutate */
67
+ column: string;
68
+ /** Probability of mutation (0-1) */
69
+ probability: number;
70
+ /** Operations to apply randomly */
71
+ operations: MutationOperation[];
72
+ }
73
+ /**
74
+ * Lookup transformation - set column value from another table via join.
75
+ *
76
+ * **Execution order note (ClickHouse)**: Due to ClickHouse limitations with
77
+ * correlated subqueries in ALTER TABLE UPDATE, lookup transformations are
78
+ * applied using a table swap approach and execute **before** template/mutate
79
+ * transformations in the same batch. If transformation order matters, place
80
+ * lookups in a separate postTransformations batch.
81
+ */
82
+ export interface LookupTransformation {
83
+ kind: "lookup";
84
+ /** Column to update */
85
+ column: string;
86
+ /** Lookup table name */
87
+ fromTable: string;
88
+ /** Column in lookup table to get value from */
89
+ fromColumn: string;
90
+ /** Join condition */
91
+ joinOn: {
92
+ /** Column in target table to match */
93
+ targetColumn: string;
94
+ /** Column in lookup table to match */
95
+ lookupColumn: string;
96
+ };
97
+ }
98
+ /**
99
+ * Swap transformation - swap values of two columns with probability.
100
+ * Useful for simulating data entry errors where values are entered in wrong fields.
101
+ */
102
+ export interface SwapTransformation {
103
+ kind: "swap";
104
+ /** First column to swap */
105
+ column1: string;
106
+ /** Second column to swap */
107
+ column2: string;
108
+ /** Probability of swap (0-1) */
109
+ probability: number;
110
+ }
111
+ export type Transformation = TemplateTransformation | MutateTransformation | LookupTransformation | SwapTransformation;
112
+ /**
113
+ * A batch of transformations with optional description.
114
+ */
115
+ export interface TransformationBatch {
116
+ /** Optional description for logging and debugging */
117
+ description?: string;
118
+ /** Transformations to apply in this batch */
119
+ transformations: Transformation[];
120
+ }
121
+ export interface ColumnConfig {
122
+ name: string;
123
+ type: ColumnType;
124
+ generator: GeneratorConfig;
125
+ nullable?: boolean;
126
+ /**
127
+ * Probability of NULL values for this column (0-1).
128
+ * Requires nullable: true to take effect.
129
+ */
130
+ nullProbability?: number;
131
+ }
132
+ export interface TableConfig {
133
+ name: string;
134
+ /** Optional description for logging */
135
+ description?: string;
136
+ columns: ColumnConfig[];
137
+ }
138
+ export interface GenerateOptions {
139
+ table: TableConfig;
140
+ rowCount: number;
141
+ createTable?: boolean;
142
+ truncateFirst?: boolean;
143
+ dropFirst?: boolean;
144
+ /**
145
+ * If true, queries the table for max values of sequence columns
146
+ * and continues from there. Default: true.
147
+ */
148
+ resumeSequences?: boolean;
149
+ /**
150
+ * If true, runs database-specific optimization after insert
151
+ * (VACUUM, OPTIMIZE TABLE, etc.). Default: true.
152
+ */
153
+ optimize?: boolean;
154
+ }
155
+ export type GeneratedRow = Record<string, unknown>;
156
+ export interface GenerateResult {
157
+ rowsInserted: number;
158
+ /** Total duration including optimization */
159
+ durationMs: number;
160
+ /** Duration of data generation only */
161
+ generateMs: number;
162
+ /** Duration of optimization (0 if skipped) */
163
+ optimizeMs: number;
164
+ }
165
+ export interface TransformResult {
166
+ /** Total duration of transformations */
167
+ durationMs: number;
168
+ /** Number of batches applied */
169
+ batchesApplied: number;
170
+ }
171
+ export interface DataGenerator {
172
+ readonly name: string;
173
+ /**
174
+ * Connect to the database
175
+ */
176
+ connect(): Promise<void>;
177
+ /**
178
+ * Disconnect from the database
179
+ */
180
+ disconnect(): Promise<void>;
181
+ /**
182
+ * Create a table based on the configuration
183
+ */
184
+ createTable(table: TableConfig): Promise<void>;
185
+ /**
186
+ * Truncate/clear a table
187
+ */
188
+ truncateTable(tableName: string): Promise<void>;
189
+ /**
190
+ * Drop a table if it exists
191
+ */
192
+ dropTable(tableName: string): Promise<void>;
193
+ /**
194
+ * Generate and insert rows into the database
195
+ */
196
+ generate(options: GenerateOptions): Promise<GenerateResult>;
197
+ /**
198
+ * Apply transformations to an existing table
199
+ */
200
+ transform(tableName: string, batches: TransformationBatch[]): Promise<TransformResult>;
201
+ /**
202
+ * Query rows from a table (for verification)
203
+ */
204
+ queryRows(tableName: string, limit?: number): Promise<GeneratedRow[]>;
205
+ /**
206
+ * Count rows in a table
207
+ */
208
+ countRows(tableName: string): Promise<number>;
209
+ /**
210
+ * Get the maximum value of a column (for resuming sequences)
211
+ */
212
+ getMaxValue(tableName: string, columnName: string): Promise<number | null>;
213
+ /**
214
+ * Get the total size of a table in bytes (including indexes if applicable)
215
+ */
216
+ getTableSize(tableName: string): Promise<number | null>;
217
+ /**
218
+ * Get the total size of a table as a human-readable string
219
+ */
220
+ getTableSizeForHuman(tableName: string): Promise<string | null>;
221
+ /**
222
+ * Run database-specific optimization after large inserts.
223
+ * - PostgreSQL: VACUUM ANALYZE
224
+ * - ClickHouse: OPTIMIZE TABLE FINAL
225
+ * - SQLite: VACUUM + ANALYZE
226
+ * - Trino/Iceberg: rewrite_data_files, expire_snapshots
227
+ */
228
+ optimize(tableName: string): Promise<void>;
229
+ }
230
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/generator/types.ts"],"names":[],"mappings":"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"}