@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,334 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import { BaseDataGenerator } from "./base-generator.js";
|
|
3
|
+
import { getLookupTableName } from "./utils.js";
|
|
4
|
+
function columnTypeToSqlite(column) {
|
|
5
|
+
switch (column.type) {
|
|
6
|
+
case "integer":
|
|
7
|
+
case "bigint":
|
|
8
|
+
return "INTEGER";
|
|
9
|
+
case "float":
|
|
10
|
+
return "REAL";
|
|
11
|
+
case "string":
|
|
12
|
+
return "TEXT";
|
|
13
|
+
case "boolean":
|
|
14
|
+
return "INTEGER";
|
|
15
|
+
case "datetime":
|
|
16
|
+
case "date":
|
|
17
|
+
return "TEXT";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Wrap an expression to return NULL with given probability (SQLite)
|
|
22
|
+
*/
|
|
23
|
+
function wrapWithNullCheck(expr, nullProbability) {
|
|
24
|
+
if (nullProbability <= 0)
|
|
25
|
+
return expr;
|
|
26
|
+
if (nullProbability >= 1)
|
|
27
|
+
return "NULL";
|
|
28
|
+
// abs(random()) / 9223372036854775807.0 gives 0 to 1
|
|
29
|
+
return `CASE WHEN abs(random()) / 9223372036854775807.0 < ${String(nullProbability)} THEN NULL ELSE ${expr} END`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Convert a generator config to a SQLite SQL expression
|
|
33
|
+
* SQLite uses 'n' as the row number from the recursive CTE (1-based)
|
|
34
|
+
*/
|
|
35
|
+
export function generatorToSqliteExpr(gen, seqExpr) {
|
|
36
|
+
switch (gen.kind) {
|
|
37
|
+
case "sequence": {
|
|
38
|
+
const start = gen.start ?? 1;
|
|
39
|
+
const step = gen.step ?? 1;
|
|
40
|
+
return `(${String(start)} - 1 + ${seqExpr} * ${String(step)})`;
|
|
41
|
+
}
|
|
42
|
+
case "randomInt":
|
|
43
|
+
// abs(random()) gives 0 to 2^63-1, % range gives 0 to range-1
|
|
44
|
+
return `(${String(gen.min)} + abs(random()) % (${String(gen.max - gen.min + 1)}))`;
|
|
45
|
+
case "randomFloat": {
|
|
46
|
+
const precision = gen.precision ?? 2;
|
|
47
|
+
// random() / 9223372036854775807.0 gives -1 to 1, use abs and scale
|
|
48
|
+
return `round(${String(gen.min)} + (abs(random()) / 9223372036854775807.0) * ${String(gen.max - gen.min)}, ${String(precision)})`;
|
|
49
|
+
}
|
|
50
|
+
case "randomString": {
|
|
51
|
+
const len = gen.length;
|
|
52
|
+
// SQLite doesn't have md5, use hex(randomblob) and substr
|
|
53
|
+
return `substr(hex(randomblob(${String(Math.ceil(len / 2))})), 1, ${String(len)})`;
|
|
54
|
+
}
|
|
55
|
+
case "choice": {
|
|
56
|
+
const values = gen.values;
|
|
57
|
+
// Build a CASE expression based on random index
|
|
58
|
+
const count = values.length;
|
|
59
|
+
const cases = values
|
|
60
|
+
.map((v, i) => {
|
|
61
|
+
const val = typeof v === "string" ? `'${v}'` : String(v);
|
|
62
|
+
return `WHEN ${String(i)} THEN ${val}`;
|
|
63
|
+
})
|
|
64
|
+
.join(" ");
|
|
65
|
+
return `CASE (abs(random()) % ${String(count)}) ${cases} END`;
|
|
66
|
+
}
|
|
67
|
+
case "choiceByLookup": {
|
|
68
|
+
// SQLite: use json_extract from the CTE json array
|
|
69
|
+
const cteName = getLookupTableName(gen.values);
|
|
70
|
+
const count = gen.values.length;
|
|
71
|
+
return `json_extract(${cteName}.arr, '$[' || (abs(random()) % ${String(count)}) || ']')`;
|
|
72
|
+
}
|
|
73
|
+
case "constant": {
|
|
74
|
+
const val = gen.value;
|
|
75
|
+
return typeof val === "string" ? `'${val}'` : String(val);
|
|
76
|
+
}
|
|
77
|
+
case "datetime": {
|
|
78
|
+
const from = gen.from ?? new Date("2020-01-01");
|
|
79
|
+
const to = gen.to ?? new Date();
|
|
80
|
+
const fromTs = Math.floor(from.getTime() / 1000);
|
|
81
|
+
const toTs = Math.floor(to.getTime() / 1000);
|
|
82
|
+
// SQLite stores datetime as ISO string
|
|
83
|
+
return `datetime(${String(fromTs)} + abs(random()) % ${String(toTs - fromTs)}, 'unixepoch')`;
|
|
84
|
+
}
|
|
85
|
+
case "uuid":
|
|
86
|
+
// SQLite doesn't have native UUID, generate a pseudo-UUID from random bytes
|
|
87
|
+
return `lower(hex(randomblob(4)) || '-' || hex(randomblob(2)) || '-4' || substr(hex(randomblob(2)),2) || '-' || substr('89ab', abs(random()) % 4 + 1, 1) || substr(hex(randomblob(2)),2) || '-' || hex(randomblob(6)))`;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export class SQLiteDataGenerator extends BaseDataGenerator {
|
|
91
|
+
config;
|
|
92
|
+
name = "sqlite";
|
|
93
|
+
db = null;
|
|
94
|
+
constructor(config) {
|
|
95
|
+
super();
|
|
96
|
+
this.config = config;
|
|
97
|
+
}
|
|
98
|
+
connect() {
|
|
99
|
+
this.db = new Database(this.config.path);
|
|
100
|
+
return Promise.resolve();
|
|
101
|
+
}
|
|
102
|
+
disconnect() {
|
|
103
|
+
if (this.db) {
|
|
104
|
+
this.db.close();
|
|
105
|
+
this.db = null;
|
|
106
|
+
}
|
|
107
|
+
return Promise.resolve();
|
|
108
|
+
}
|
|
109
|
+
getDb() {
|
|
110
|
+
if (!this.db) {
|
|
111
|
+
throw new Error("Not connected to SQLite");
|
|
112
|
+
}
|
|
113
|
+
return this.db;
|
|
114
|
+
}
|
|
115
|
+
createTable(table) {
|
|
116
|
+
const db = this.getDb();
|
|
117
|
+
const columns = table.columns
|
|
118
|
+
.map((col) => `${col.name} ${columnTypeToSqlite(col)}${col.nullable ? "" : " NOT NULL"}`)
|
|
119
|
+
.join(", ");
|
|
120
|
+
db.exec(`CREATE TABLE IF NOT EXISTS ${table.name} (${columns})`);
|
|
121
|
+
return Promise.resolve();
|
|
122
|
+
}
|
|
123
|
+
truncateTable(tableName) {
|
|
124
|
+
const db = this.getDb();
|
|
125
|
+
db.exec(`DELETE FROM ${tableName}`);
|
|
126
|
+
return Promise.resolve();
|
|
127
|
+
}
|
|
128
|
+
dropTable(tableName) {
|
|
129
|
+
const db = this.getDb();
|
|
130
|
+
db.exec(`DROP TABLE IF EXISTS ${tableName}`);
|
|
131
|
+
return Promise.resolve();
|
|
132
|
+
}
|
|
133
|
+
generateNative(table, rowCount, startSequence) {
|
|
134
|
+
const db = this.getDb();
|
|
135
|
+
// Collect choiceByLookup generators for additional CTEs
|
|
136
|
+
const lookupCtes = [];
|
|
137
|
+
for (const col of table.columns) {
|
|
138
|
+
if (col.generator.kind === "choiceByLookup") {
|
|
139
|
+
const gen = col.generator;
|
|
140
|
+
const cteName = getLookupTableName(gen.values);
|
|
141
|
+
// Store as JSON array
|
|
142
|
+
const jsonArray = JSON.stringify(gen.values);
|
|
143
|
+
lookupCtes.push(`${cteName}(arr) AS (SELECT '${jsonArray.replace(/'/g, "''")}')`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Build column list and expressions
|
|
147
|
+
const columns = table.columns.map((c) => c.name);
|
|
148
|
+
const seqExpr = "n";
|
|
149
|
+
const expressions = table.columns.map((col) => {
|
|
150
|
+
let expr = generatorToSqliteExpr(col.generator, seqExpr);
|
|
151
|
+
// Apply null probability if specified
|
|
152
|
+
if (col.nullable && col.nullProbability && col.nullProbability > 0) {
|
|
153
|
+
expr = wrapWithNullCheck(expr, col.nullProbability);
|
|
154
|
+
}
|
|
155
|
+
return expr;
|
|
156
|
+
});
|
|
157
|
+
// Cross join with lookup CTEs
|
|
158
|
+
const lookupJoins = lookupCtes.length > 0
|
|
159
|
+
? ", " +
|
|
160
|
+
[
|
|
161
|
+
...new Set(table.columns
|
|
162
|
+
.filter((c) => c.generator.kind === "choiceByLookup")
|
|
163
|
+
.map((c) => getLookupTableName(c.generator.values))),
|
|
164
|
+
].join(", ")
|
|
165
|
+
: "";
|
|
166
|
+
// Combine all CTEs
|
|
167
|
+
const allCtes = [
|
|
168
|
+
`seq(n) AS (
|
|
169
|
+
SELECT ${String(startSequence)}
|
|
170
|
+
UNION ALL
|
|
171
|
+
SELECT n + 1 FROM seq WHERE n < ${String(startSequence + rowCount - 1)}
|
|
172
|
+
)`,
|
|
173
|
+
...lookupCtes,
|
|
174
|
+
];
|
|
175
|
+
// Use recursive CTE to generate sequence
|
|
176
|
+
const insertSql = `
|
|
177
|
+
WITH RECURSIVE ${allCtes.join(", ")}
|
|
178
|
+
INSERT INTO ${table.name} (${columns.join(", ")})
|
|
179
|
+
SELECT ${expressions.join(", ")}
|
|
180
|
+
FROM seq${lookupJoins}
|
|
181
|
+
`;
|
|
182
|
+
db.exec(insertSql);
|
|
183
|
+
return Promise.resolve();
|
|
184
|
+
}
|
|
185
|
+
queryRows(tableName, limit = 100) {
|
|
186
|
+
const db = this.getDb();
|
|
187
|
+
const result = db
|
|
188
|
+
.prepare(`SELECT * FROM ${tableName} LIMIT ?`)
|
|
189
|
+
.all(limit);
|
|
190
|
+
return Promise.resolve(result);
|
|
191
|
+
}
|
|
192
|
+
countRows(tableName) {
|
|
193
|
+
const db = this.getDb();
|
|
194
|
+
const result = db
|
|
195
|
+
.prepare(`SELECT COUNT(*) as count FROM ${tableName}`)
|
|
196
|
+
.get();
|
|
197
|
+
return Promise.resolve(result.count);
|
|
198
|
+
}
|
|
199
|
+
getMaxValue(tableName, columnName) {
|
|
200
|
+
const db = this.getDb();
|
|
201
|
+
const result = db
|
|
202
|
+
.prepare(`SELECT MAX(${columnName}) as max_val FROM ${tableName}`)
|
|
203
|
+
.get();
|
|
204
|
+
return Promise.resolve(result.max_val);
|
|
205
|
+
}
|
|
206
|
+
getTableSize(tableName) {
|
|
207
|
+
const db = this.getDb();
|
|
208
|
+
// Use dbstat virtual table to get table + index size
|
|
209
|
+
try {
|
|
210
|
+
const result = db
|
|
211
|
+
.prepare(`SELECT SUM(pgsize) as size FROM dbstat WHERE name = ? OR name IN (SELECT name FROM sqlite_master WHERE type = 'index' AND tbl_name = ?)`)
|
|
212
|
+
.get(tableName, tableName);
|
|
213
|
+
return Promise.resolve(result.size);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// dbstat may not be available, fall back to page-based estimate
|
|
217
|
+
const pageCount = db.prepare(`PRAGMA page_count`).get();
|
|
218
|
+
const pageSize = db.prepare(`PRAGMA page_size`).get();
|
|
219
|
+
return Promise.resolve(pageCount.page_count * pageSize.page_size);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
optimize(_tableName) {
|
|
223
|
+
const db = this.getDb();
|
|
224
|
+
// VACUUM rebuilds the database file to reclaim space
|
|
225
|
+
db.exec(`VACUUM`);
|
|
226
|
+
// ANALYZE gathers statistics for the query planner
|
|
227
|
+
db.exec(`ANALYZE`);
|
|
228
|
+
return Promise.resolve();
|
|
229
|
+
}
|
|
230
|
+
applyTransformations(tableName, transformations) {
|
|
231
|
+
if (transformations.length === 0)
|
|
232
|
+
return Promise.resolve();
|
|
233
|
+
const db = this.getDb();
|
|
234
|
+
// SQLite identifier escaping with double quotes
|
|
235
|
+
const escapeId = (name) => `"${name.replace(/"/g, '""')}"`;
|
|
236
|
+
const escapedTable = escapeId(tableName);
|
|
237
|
+
const setClauses = [];
|
|
238
|
+
for (const t of transformations) {
|
|
239
|
+
switch (t.kind) {
|
|
240
|
+
case "template": {
|
|
241
|
+
const escapedCol = escapeId(t.column);
|
|
242
|
+
// Replace {column_name} with column references
|
|
243
|
+
let expr = `'${t.template.replace(/'/g, "''")}'`;
|
|
244
|
+
const refs = t.template.match(/\{([^}]+)\}/g) ?? [];
|
|
245
|
+
for (const ref of refs) {
|
|
246
|
+
const colName = ref.slice(1, -1);
|
|
247
|
+
const colRef = escapeId(colName);
|
|
248
|
+
// Replace {col} with concatenation
|
|
249
|
+
expr = expr.replace(`'{${colName}}'`, `' || ${colRef} || '`);
|
|
250
|
+
expr = expr.replace(`{${colName}}`, `' || ${colRef} || '`);
|
|
251
|
+
}
|
|
252
|
+
// Clean up empty string concatenations
|
|
253
|
+
expr = expr.replace(/^'' \|\| /, "").replace(/ \|\| ''$/, "");
|
|
254
|
+
expr = expr.replace(/' \|\| '' \|\| '/g, "' || '");
|
|
255
|
+
if (t.lowercase) {
|
|
256
|
+
expr = `lower(${expr})`;
|
|
257
|
+
}
|
|
258
|
+
setClauses.push(`${escapedCol} = ${expr}`);
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
case "mutate": {
|
|
262
|
+
const escapedCol = escapeId(t.column);
|
|
263
|
+
// Random string mutation using SQLite functions
|
|
264
|
+
const { probability, operations } = t;
|
|
265
|
+
// SQLite random() returns int64, abs+modulo to get position
|
|
266
|
+
const randomPos = `(abs(random()) % max(length(${escapedCol}), 1)) + 1`;
|
|
267
|
+
// Build mutation expressions for each operation
|
|
268
|
+
const mutationExprs = {
|
|
269
|
+
replace: `substr(${escapedCol}, 1, ${randomPos} - 1) || 'X' || substr(${escapedCol}, ${randomPos} + 1)`,
|
|
270
|
+
delete: `substr(${escapedCol}, 1, ${randomPos} - 1) || substr(${escapedCol}, ${randomPos} + 1)`,
|
|
271
|
+
insert: `substr(${escapedCol}, 1, ${randomPos}) || 'X' || substr(${escapedCol}, ${randomPos} + 1)`,
|
|
272
|
+
};
|
|
273
|
+
// Build expression that randomly picks from available operations
|
|
274
|
+
let mutateExpr;
|
|
275
|
+
if (operations.length === 1) {
|
|
276
|
+
// We know operations[0] exists since length === 1
|
|
277
|
+
mutateExpr = mutationExprs[operations[0]]; // eslint-disable-line @typescript-eslint/no-non-null-assertion
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
// Use modulo to pick operation index, then CASE to select expression
|
|
281
|
+
const opIndex = `(abs(random()) % ${String(operations.length)})`;
|
|
282
|
+
const cases = operations.map((op, i) => {
|
|
283
|
+
if (i === operations.length - 1) {
|
|
284
|
+
return `ELSE ${mutationExprs[op]}`;
|
|
285
|
+
}
|
|
286
|
+
return `WHEN ${opIndex} = ${String(i)} THEN ${mutationExprs[op]}`;
|
|
287
|
+
});
|
|
288
|
+
mutateExpr = `(CASE ${cases.join(" ")} END)`;
|
|
289
|
+
}
|
|
290
|
+
// Use <= for probability to handle edge case where probability = 1.0
|
|
291
|
+
setClauses.push(`${escapedCol} = CASE WHEN abs(random()) / 9223372036854775807.0 <= ${String(probability)} THEN ${mutateExpr} ELSE ${escapedCol} END`);
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
case "lookup": {
|
|
295
|
+
const escapedCol = escapeId(t.column);
|
|
296
|
+
// Lookup value from another table via join
|
|
297
|
+
// SQLite uses correlated subquery
|
|
298
|
+
const fromTable = escapeId(t.fromTable);
|
|
299
|
+
const fromCol = escapeId(t.fromColumn);
|
|
300
|
+
const targetJoinCol = escapeId(t.joinOn.targetColumn);
|
|
301
|
+
const lookupJoinCol = escapeId(t.joinOn.lookupColumn);
|
|
302
|
+
setClauses.push(`${escapedCol} = (SELECT ${fromCol} FROM ${fromTable} WHERE ${lookupJoinCol} = ${escapedTable}.${targetJoinCol})`);
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
case "swap": {
|
|
306
|
+
// Swap handled separately - needs both columns in one UPDATE
|
|
307
|
+
break;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// Handle swap transformations separately (need atomic swap with same random)
|
|
312
|
+
const swapTransformations = transformations.filter((t) => t.kind === "swap");
|
|
313
|
+
for (const swap of swapTransformations) {
|
|
314
|
+
const col1 = escapeId(swap.column1);
|
|
315
|
+
const col2 = escapeId(swap.column2);
|
|
316
|
+
const prob = String(swap.probability);
|
|
317
|
+
// SQLite: random() returns int64, divide by max int64 for 0-1 range
|
|
318
|
+
// SET a = b, b = a works atomically in SQLite (uses old values on right side)
|
|
319
|
+
const swapSql = `
|
|
320
|
+
UPDATE ${escapedTable} SET
|
|
321
|
+
${col1} = ${col2},
|
|
322
|
+
${col2} = ${col1}
|
|
323
|
+
WHERE abs(random()) / 9223372036854775807.0 < ${prob}
|
|
324
|
+
`;
|
|
325
|
+
db.exec(swapSql);
|
|
326
|
+
}
|
|
327
|
+
if (setClauses.length === 0)
|
|
328
|
+
return Promise.resolve();
|
|
329
|
+
const updateSql = `UPDATE ${escapedTable} SET ${setClauses.join(", ")}`;
|
|
330
|
+
db.exec(updateSql);
|
|
331
|
+
return Promise.resolve();
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=sqlite-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-generator.js","sourceRoot":"","sources":["../../src/generator/sqlite-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { TableConfig, GeneratedRow, GeneratorConfig, Transformation } from "./types.js";
|
|
2
|
+
import { BaseDataGenerator } from "./base-generator.js";
|
|
3
|
+
export interface TrinoConfig {
|
|
4
|
+
host: string;
|
|
5
|
+
port: number;
|
|
6
|
+
catalog: string;
|
|
7
|
+
schema: string;
|
|
8
|
+
user: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Convert a generator config to a Trino SQL expression
|
|
12
|
+
* Trino uses 'n' as the row number from UNNEST(sequence(...))
|
|
13
|
+
*/
|
|
14
|
+
export declare function generatorToTrinoExpr(gen: GeneratorConfig, seqExpr: string): string;
|
|
15
|
+
export declare class TrinoDataGenerator extends BaseDataGenerator {
|
|
16
|
+
private config;
|
|
17
|
+
readonly name = "trino";
|
|
18
|
+
private trino;
|
|
19
|
+
private escapedCatalog;
|
|
20
|
+
private escapedSchema;
|
|
21
|
+
constructor(config: TrinoConfig);
|
|
22
|
+
private get fullSchemaPath();
|
|
23
|
+
connect(): Promise<void>;
|
|
24
|
+
disconnect(): Promise<void>;
|
|
25
|
+
private getTrino;
|
|
26
|
+
private fullTableName;
|
|
27
|
+
createTable(table: TableConfig): Promise<void>;
|
|
28
|
+
truncateTable(tableName: string): Promise<void>;
|
|
29
|
+
dropTable(tableName: string): Promise<void>;
|
|
30
|
+
protected generateNative(table: TableConfig, rowCount: number, startSequence: number): Promise<void>;
|
|
31
|
+
queryRows(tableName: string, limit?: number): Promise<GeneratedRow[]>;
|
|
32
|
+
countRows(tableName: string): Promise<number>;
|
|
33
|
+
getMaxValue(tableName: string, columnName: string): Promise<number | null>;
|
|
34
|
+
getTableSize(tableName: string): Promise<number | null>;
|
|
35
|
+
optimize(tableName: string): Promise<void>;
|
|
36
|
+
protected applyTransformations(tableName: string, transformations: Transformation[]): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=trino-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trino-generator.d.ts","sourceRoot":"","sources":["../../src/generator/trino-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,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AA8BD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,MAAM,GACd,MAAM,CA+CR;AAED,qBAAa,kBAAmB,SAAQ,iBAAiB;IAM3C,OAAO,CAAC,MAAM;IAL1B,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAS;gBAEV,MAAM,EAAE,WAAW;IAMvC,OAAO,KAAK,cAAc,GAEzB;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB9B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,aAAa;IAIf,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB9C,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe/C,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAcjC,cAAc,CAC5B,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IA8EV,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyBlE,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB7C,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBnB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmBvD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cA8BhC,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,cAAc,EAAE,GAChC,OAAO,CAAC,IAAI,CAAC;CAgIjB"}
|