@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,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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"}
|