forge-sql-orm 2.1.12 → 2.1.14
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/README.md +922 -549
- package/dist/core/ForgeSQLAnalyseOperations.d.ts.map +1 -1
- package/dist/core/ForgeSQLAnalyseOperations.js +257 -0
- package/dist/core/ForgeSQLAnalyseOperations.js.map +1 -0
- package/dist/core/ForgeSQLCacheOperations.js +172 -0
- package/dist/core/ForgeSQLCacheOperations.js.map +1 -0
- package/dist/core/ForgeSQLCrudOperations.js +349 -0
- package/dist/core/ForgeSQLCrudOperations.js.map +1 -0
- package/dist/core/ForgeSQLORM.d.ts +29 -1
- package/dist/core/ForgeSQLORM.d.ts.map +1 -1
- package/dist/core/ForgeSQLORM.js +1252 -0
- package/dist/core/ForgeSQLORM.js.map +1 -0
- package/dist/core/ForgeSQLQueryBuilder.d.ts +179 -1
- package/dist/core/ForgeSQLQueryBuilder.d.ts.map +1 -1
- package/dist/core/ForgeSQLQueryBuilder.js +77 -0
- package/dist/core/ForgeSQLQueryBuilder.js.map +1 -0
- package/dist/core/ForgeSQLSelectOperations.js +81 -0
- package/dist/core/ForgeSQLSelectOperations.js.map +1 -0
- package/dist/core/Rovo.d.ts +116 -0
- package/dist/core/Rovo.d.ts.map +1 -0
- package/dist/core/Rovo.js +647 -0
- package/dist/core/Rovo.js.map +1 -0
- package/dist/core/SystemTables.js +258 -0
- package/dist/core/SystemTables.js.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/drizzle/extensions/additionalActions.d.ts.map +1 -1
- package/dist/lib/drizzle/extensions/additionalActions.js +527 -0
- package/dist/lib/drizzle/extensions/additionalActions.js.map +1 -0
- package/dist/utils/cacheContextUtils.d.ts.map +1 -1
- package/dist/utils/cacheContextUtils.js +198 -0
- package/dist/utils/cacheContextUtils.js.map +1 -0
- package/dist/utils/cacheUtils.d.ts.map +1 -1
- package/dist/utils/cacheUtils.js +383 -0
- package/dist/utils/cacheUtils.js.map +1 -0
- package/dist/utils/forgeDriver.d.ts.map +1 -1
- package/dist/utils/forgeDriver.js +139 -0
- package/dist/utils/forgeDriver.js.map +1 -0
- package/dist/utils/forgeDriverProxy.js +68 -0
- package/dist/utils/forgeDriverProxy.js.map +1 -0
- package/dist/utils/metadataContextUtils.d.ts.map +1 -1
- package/dist/utils/metadataContextUtils.js +26 -0
- package/dist/utils/metadataContextUtils.js.map +1 -0
- package/dist/utils/requestTypeContextUtils.js +10 -0
- package/dist/utils/requestTypeContextUtils.js.map +1 -0
- package/dist/utils/sqlHints.js +52 -0
- package/dist/utils/sqlHints.js.map +1 -0
- package/dist/utils/sqlUtils.d.ts.map +1 -1
- package/dist/utils/sqlUtils.js +590 -0
- package/dist/utils/sqlUtils.js.map +1 -0
- package/dist/webtriggers/applyMigrationsWebTrigger.js +77 -0
- package/dist/webtriggers/applyMigrationsWebTrigger.js.map +1 -0
- package/dist/webtriggers/clearCacheSchedulerTrigger.js +83 -0
- package/dist/webtriggers/clearCacheSchedulerTrigger.js.map +1 -0
- package/dist/webtriggers/dropMigrationWebTrigger.js +54 -0
- package/dist/webtriggers/dropMigrationWebTrigger.js.map +1 -0
- package/dist/webtriggers/dropTablesMigrationWebTrigger.js +54 -0
- package/dist/webtriggers/dropTablesMigrationWebTrigger.js.map +1 -0
- package/dist/webtriggers/fetchSchemaWebTrigger.js +82 -0
- package/dist/webtriggers/fetchSchemaWebTrigger.js.map +1 -0
- package/dist/webtriggers/index.js +40 -0
- package/dist/webtriggers/index.js.map +1 -0
- package/dist/webtriggers/slowQuerySchedulerTrigger.js +80 -0
- package/dist/webtriggers/slowQuerySchedulerTrigger.js.map +1 -0
- package/package.json +31 -25
- package/src/core/ForgeSQLAnalyseOperations.ts +3 -2
- package/src/core/ForgeSQLORM.ts +64 -0
- package/src/core/ForgeSQLQueryBuilder.ts +200 -1
- package/src/core/Rovo.ts +765 -0
- package/src/lib/drizzle/extensions/additionalActions.ts +11 -0
- package/src/utils/cacheContextUtils.ts +9 -6
- package/src/utils/cacheUtils.ts +6 -4
- package/src/utils/forgeDriver.ts +3 -7
- package/src/utils/metadataContextUtils.ts +1 -3
- package/src/utils/sqlUtils.ts +33 -34
- package/dist/ForgeSQLORM.js +0 -3922
- package/dist/ForgeSQLORM.js.map +0 -1
- package/dist/ForgeSQLORM.mjs +0 -3905
- package/dist/ForgeSQLORM.mjs.map +0 -1
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseDateTime = void 0;
|
|
4
|
+
exports.formatDateTime = formatDateTime;
|
|
5
|
+
exports.getPrimaryKeys = getPrimaryKeys;
|
|
6
|
+
exports.getTableMetadata = getTableMetadata;
|
|
7
|
+
exports.generateDropTableStatements = generateDropTableStatements;
|
|
8
|
+
exports.mapSelectAllFieldsToAlias = mapSelectAllFieldsToAlias;
|
|
9
|
+
exports.mapSelectFieldsWithAlias = mapSelectFieldsWithAlias;
|
|
10
|
+
exports.applyFromDriverTransform = applyFromDriverTransform;
|
|
11
|
+
exports.formatLimitOffset = formatLimitOffset;
|
|
12
|
+
exports.nextVal = nextVal;
|
|
13
|
+
exports.printQueriesWithPlan = printQueriesWithPlan;
|
|
14
|
+
exports.slowQueryPerHours = slowQueryPerHours;
|
|
15
|
+
exports.withTimeout = withTimeout;
|
|
16
|
+
exports.withTidbHint = withTidbHint;
|
|
17
|
+
const drizzle_orm_1 = require("drizzle-orm");
|
|
18
|
+
const luxon_1 = require("luxon");
|
|
19
|
+
const sql_1 = require("drizzle-orm/sql/sql");
|
|
20
|
+
const SystemTables_1 = require("../core/SystemTables");
|
|
21
|
+
/**
|
|
22
|
+
* Parses a date string into a Date object using the specified format
|
|
23
|
+
* @param value - The date string to parse or Date
|
|
24
|
+
* @param format - The format to use for parsing
|
|
25
|
+
* @returns Date object
|
|
26
|
+
*/
|
|
27
|
+
const parseDateTime = (value, format) => {
|
|
28
|
+
let result;
|
|
29
|
+
if (value instanceof Date) {
|
|
30
|
+
result = value;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// 1. Try to parse using the provided format (strict mode)
|
|
34
|
+
const dt = luxon_1.DateTime.fromFormat(value, format);
|
|
35
|
+
if (dt.isValid) {
|
|
36
|
+
result = dt.toJSDate();
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// 2. Try to parse as SQL string
|
|
40
|
+
const sqlDt = luxon_1.DateTime.fromSQL(value);
|
|
41
|
+
if (sqlDt.isValid) {
|
|
42
|
+
result = sqlDt.toJSDate();
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// 3. Try to parse as RFC2822 string
|
|
46
|
+
const isoDt = luxon_1.DateTime.fromRFC2822(value);
|
|
47
|
+
if (isoDt.isValid) {
|
|
48
|
+
result = isoDt.toJSDate();
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// 4. Fallback: use native Date constructor
|
|
52
|
+
result = new Date(value);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// 4. Ensure the result is a valid Date object
|
|
58
|
+
if (Number.isNaN(result.getTime())) {
|
|
59
|
+
result = new Date(value);
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
};
|
|
63
|
+
exports.parseDateTime = parseDateTime;
|
|
64
|
+
/**
|
|
65
|
+
* Helper function to validate and format a date-like value using Luxon DateTime.
|
|
66
|
+
* @param value - Date object, ISO/RFC2822/SQL/HTTP string, or timestamp (number|string).
|
|
67
|
+
* @param format - DateTime format string (Luxon format tokens).
|
|
68
|
+
* @returns Formatted date string.
|
|
69
|
+
* @throws Error if value cannot be parsed as a valid date.
|
|
70
|
+
*/
|
|
71
|
+
function formatDateTime(value, format, isTimeStamp) {
|
|
72
|
+
let dt = null;
|
|
73
|
+
if (value instanceof Date) {
|
|
74
|
+
dt = luxon_1.DateTime.fromJSDate(value);
|
|
75
|
+
}
|
|
76
|
+
else if (typeof value === "string") {
|
|
77
|
+
for (const parser of [
|
|
78
|
+
luxon_1.DateTime.fromISO,
|
|
79
|
+
luxon_1.DateTime.fromRFC2822,
|
|
80
|
+
luxon_1.DateTime.fromSQL,
|
|
81
|
+
luxon_1.DateTime.fromHTTP,
|
|
82
|
+
]) {
|
|
83
|
+
dt = parser(value);
|
|
84
|
+
if (dt.isValid)
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
if (!dt?.isValid) {
|
|
88
|
+
const parsed = Number(value);
|
|
89
|
+
if (!Number.isNaN(parsed)) {
|
|
90
|
+
dt = luxon_1.DateTime.fromMillis(parsed);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else if (typeof value === "number") {
|
|
95
|
+
dt = luxon_1.DateTime.fromMillis(value);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
throw new Error("Unsupported type");
|
|
99
|
+
}
|
|
100
|
+
if (!dt?.isValid) {
|
|
101
|
+
throw new Error("Invalid Date");
|
|
102
|
+
}
|
|
103
|
+
const minDate = luxon_1.DateTime.fromSeconds(1);
|
|
104
|
+
const maxDate = luxon_1.DateTime.fromMillis(2147483647 * 1000); // 2038-01-19 03:14:07.999 UTC
|
|
105
|
+
if (isTimeStamp) {
|
|
106
|
+
if (dt < minDate) {
|
|
107
|
+
throw new Error("Atlassian Forge does not support zero or negative timestamps. Allowed range: from '1970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.999999'.");
|
|
108
|
+
}
|
|
109
|
+
if (dt > maxDate) {
|
|
110
|
+
throw new Error("Atlassian Forge does not support timestamps beyond 2038-01-19 03:14:07.999999. Please use a smaller date within the supported range.");
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return dt.toFormat(format);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Gets primary keys from the schema.
|
|
117
|
+
* @template T - The type of the table schema
|
|
118
|
+
* @param {T} table - The table schema
|
|
119
|
+
* @returns {[string, AnyColumn][]} Array of primary key name and column pairs
|
|
120
|
+
*/
|
|
121
|
+
function getPrimaryKeys(table) {
|
|
122
|
+
const { columns, primaryKeys } = getTableMetadata(table);
|
|
123
|
+
// First try to find primary keys in columns
|
|
124
|
+
const columnPrimaryKeys = Object.entries(columns).filter(([, column]) => column.primary);
|
|
125
|
+
if (columnPrimaryKeys.length > 0) {
|
|
126
|
+
return columnPrimaryKeys;
|
|
127
|
+
}
|
|
128
|
+
// If no primary keys found in columns, check primary key builders
|
|
129
|
+
if (Array.isArray(primaryKeys) && primaryKeys.length > 0) {
|
|
130
|
+
// Collect all primary key columns from all primary key builders
|
|
131
|
+
const primaryKeyColumns = new Set();
|
|
132
|
+
for (const primaryKeyBuilder of primaryKeys) {
|
|
133
|
+
// Get primary key columns from each builder
|
|
134
|
+
for (const [name, column1] of Object.entries(columns).filter(([, column]) => {
|
|
135
|
+
// @ts-ignore - PrimaryKeyBuilder has internal columns property
|
|
136
|
+
return primaryKeyBuilder.columns.includes(column);
|
|
137
|
+
})) {
|
|
138
|
+
primaryKeyColumns.add([name, column1]);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return Array.from(primaryKeyColumns);
|
|
142
|
+
}
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Processes foreign keys from both foreignKeysSymbol and extraSymbol
|
|
147
|
+
* @param table - The table schema
|
|
148
|
+
* @param foreignKeysSymbol - Symbol for foreign keys
|
|
149
|
+
* @param extraSymbol - Symbol for extra configuration
|
|
150
|
+
* @returns Array of foreign key builders
|
|
151
|
+
*/
|
|
152
|
+
function processForeignKeys(table, foreignKeysSymbol, extraSymbol) {
|
|
153
|
+
const foreignKeys = [];
|
|
154
|
+
// Process foreign keys from foreignKeysSymbol
|
|
155
|
+
if (foreignKeysSymbol) {
|
|
156
|
+
// @ts-ignore
|
|
157
|
+
const fkArray = table[foreignKeysSymbol];
|
|
158
|
+
if (fkArray) {
|
|
159
|
+
for (const fk of fkArray) {
|
|
160
|
+
if (fk.reference) {
|
|
161
|
+
const item = fk.reference(fk);
|
|
162
|
+
foreignKeys.push(item);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Process foreign keys from extraSymbol
|
|
168
|
+
if (extraSymbol) {
|
|
169
|
+
// @ts-ignore
|
|
170
|
+
const extraConfigBuilder = table[extraSymbol];
|
|
171
|
+
if (extraConfigBuilder && typeof extraConfigBuilder === "function") {
|
|
172
|
+
const configBuilderData = extraConfigBuilder(table);
|
|
173
|
+
if (configBuilderData) {
|
|
174
|
+
const configBuilders = Array.isArray(configBuilderData)
|
|
175
|
+
? configBuilderData
|
|
176
|
+
: Object.values(configBuilderData).map((item) => item.value ?? item);
|
|
177
|
+
for (const builder of configBuilders) {
|
|
178
|
+
if (!builder?.constructor)
|
|
179
|
+
continue;
|
|
180
|
+
const builderName = builder.constructor.name.toLowerCase();
|
|
181
|
+
if (builderName.includes("foreignkeybuilder")) {
|
|
182
|
+
foreignKeys.push(builder);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return foreignKeys;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Extracts table metadata from the schema.
|
|
192
|
+
* @param {AnyMySqlTable} table - The table schema
|
|
193
|
+
* @returns {MetadataInfo} Object containing table metadata
|
|
194
|
+
*/
|
|
195
|
+
function getTableMetadata(table) {
|
|
196
|
+
const symbols = Object.getOwnPropertySymbols(table);
|
|
197
|
+
const nameSymbol = symbols.find((s) => s.toString().includes("Name"));
|
|
198
|
+
const columnsSymbol = symbols.find((s) => s.toString().includes("Columns"));
|
|
199
|
+
const foreignKeysSymbol = symbols.find((s) => s.toString().includes("ForeignKeys)"));
|
|
200
|
+
const extraSymbol = symbols.find((s) => s.toString().includes("ExtraConfigBuilder"));
|
|
201
|
+
// Initialize builders arrays
|
|
202
|
+
const builders = {
|
|
203
|
+
indexes: [],
|
|
204
|
+
checks: [],
|
|
205
|
+
foreignKeys: [],
|
|
206
|
+
primaryKeys: [],
|
|
207
|
+
uniqueConstraints: [],
|
|
208
|
+
extras: [],
|
|
209
|
+
};
|
|
210
|
+
// Process foreign keys
|
|
211
|
+
builders.foreignKeys = processForeignKeys(table, foreignKeysSymbol, extraSymbol);
|
|
212
|
+
// Process extra configuration if available
|
|
213
|
+
if (extraSymbol) {
|
|
214
|
+
// @ts-ignore
|
|
215
|
+
const extraConfigBuilder = table[extraSymbol];
|
|
216
|
+
if (extraConfigBuilder && typeof extraConfigBuilder === "function") {
|
|
217
|
+
const configBuilderData = extraConfigBuilder(table);
|
|
218
|
+
if (configBuilderData) {
|
|
219
|
+
// Convert configBuilderData to array if it's an object
|
|
220
|
+
const configBuilders = Array.isArray(configBuilderData)
|
|
221
|
+
? configBuilderData
|
|
222
|
+
: Object.values(configBuilderData).map((item) => item.value ?? item);
|
|
223
|
+
// Process each builder
|
|
224
|
+
for (const builder of configBuilders) {
|
|
225
|
+
if (!builder?.constructor)
|
|
226
|
+
continue;
|
|
227
|
+
const builderName = builder.constructor.name.toLowerCase();
|
|
228
|
+
// Map builder types to their corresponding arrays
|
|
229
|
+
const builderMap = {
|
|
230
|
+
indexbuilder: builders.indexes,
|
|
231
|
+
checkbuilder: builders.checks,
|
|
232
|
+
primarykeybuilder: builders.primaryKeys,
|
|
233
|
+
uniqueconstraintbuilder: builders.uniqueConstraints,
|
|
234
|
+
};
|
|
235
|
+
// Add builder to appropriate array if it matches any type
|
|
236
|
+
for (const [type, array] of Object.entries(builderMap)) {
|
|
237
|
+
if (builderName.includes(type)) {
|
|
238
|
+
array.push(builder);
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// Always add to extras array
|
|
243
|
+
builders.extras.push(builder);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
tableName: nameSymbol ? table[nameSymbol] : "",
|
|
250
|
+
columns: columnsSymbol ? table[columnsSymbol] : {},
|
|
251
|
+
...builders,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Generates SQL statements for dropping tables and/or their sequences.
|
|
256
|
+
*
|
|
257
|
+
* @param tables - List of table names to generate DROP statements for.
|
|
258
|
+
* @param options - Configuration object:
|
|
259
|
+
* - sequence: whether to drop associated sequences (default: true)
|
|
260
|
+
* - table: whether to drop tables themselves (default: true)
|
|
261
|
+
* @returns Array of SQL statements for dropping the specified objects
|
|
262
|
+
*/
|
|
263
|
+
function generateDropTableStatements(tables, options) {
|
|
264
|
+
const dropStatements = [];
|
|
265
|
+
const validOptions = options ?? { sequence: true, table: true };
|
|
266
|
+
if (!validOptions.sequence && !validOptions.table) {
|
|
267
|
+
// eslint-disable-next-line no-console
|
|
268
|
+
console.warn('No drop operations requested: both "table" and "sequence" options are false');
|
|
269
|
+
return [];
|
|
270
|
+
}
|
|
271
|
+
for (const tableName of tables) {
|
|
272
|
+
if (validOptions.table) {
|
|
273
|
+
dropStatements.push(`DROP TABLE IF EXISTS \`${tableName}\`;`);
|
|
274
|
+
}
|
|
275
|
+
if (validOptions.sequence) {
|
|
276
|
+
dropStatements.push(`DROP SEQUENCE IF EXISTS \`${tableName}\`;`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return dropStatements;
|
|
280
|
+
}
|
|
281
|
+
function mapSelectTableToAlias(table, uniqPrefix, aliasMap) {
|
|
282
|
+
const { columns, tableName } = getTableMetadata(table);
|
|
283
|
+
const selectionsTableFields = {};
|
|
284
|
+
for (const name of Object.keys(columns)) {
|
|
285
|
+
const column = columns[name];
|
|
286
|
+
const uniqName = `a_${uniqPrefix}_${tableName}_${column.name}`.toLowerCase();
|
|
287
|
+
const fieldAlias = drizzle_orm_1.sql.raw(uniqName);
|
|
288
|
+
selectionsTableFields[name] = (0, drizzle_orm_1.sql) `${column} as \`${fieldAlias}\``;
|
|
289
|
+
aliasMap[uniqName] = column;
|
|
290
|
+
}
|
|
291
|
+
return selectionsTableFields;
|
|
292
|
+
}
|
|
293
|
+
function isDrizzleColumn(column) {
|
|
294
|
+
return column && typeof column === "object" && "table" in column;
|
|
295
|
+
}
|
|
296
|
+
function mapSelectAllFieldsToAlias(selections, name, uniqName, fields, aliasMap) {
|
|
297
|
+
if ((0, drizzle_orm_1.isTable)(fields)) {
|
|
298
|
+
selections[name] = mapSelectTableToAlias(fields, uniqName, aliasMap);
|
|
299
|
+
}
|
|
300
|
+
else if (isDrizzleColumn(fields)) {
|
|
301
|
+
const column = fields;
|
|
302
|
+
const uniqAliasName = `a_${uniqName}_${column.name}`.toLowerCase();
|
|
303
|
+
let aliasName = drizzle_orm_1.sql.raw(uniqAliasName);
|
|
304
|
+
selections[name] = (0, drizzle_orm_1.sql) `${column} as \`${aliasName}\``;
|
|
305
|
+
aliasMap[uniqAliasName] = column;
|
|
306
|
+
}
|
|
307
|
+
else if ((0, sql_1.isSQLWrapper)(fields)) {
|
|
308
|
+
selections[name] = fields;
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
const innerSelections = {};
|
|
312
|
+
for (const [iname, ifields] of Object.entries(fields)) {
|
|
313
|
+
mapSelectAllFieldsToAlias(innerSelections, iname, `${uniqName}_${iname}`, ifields, aliasMap);
|
|
314
|
+
}
|
|
315
|
+
selections[name] = innerSelections;
|
|
316
|
+
}
|
|
317
|
+
return selections;
|
|
318
|
+
}
|
|
319
|
+
function mapSelectFieldsWithAlias(fields) {
|
|
320
|
+
if (!fields) {
|
|
321
|
+
throw new Error("fields is empty");
|
|
322
|
+
}
|
|
323
|
+
const aliasMap = {};
|
|
324
|
+
const selections = {};
|
|
325
|
+
for (let i = 0; i < Object.entries(fields).length; i++) {
|
|
326
|
+
const [name, fields1] = Object.entries(fields)[i];
|
|
327
|
+
mapSelectAllFieldsToAlias(selections, name, name, fields1, aliasMap);
|
|
328
|
+
}
|
|
329
|
+
return { selections, aliasMap };
|
|
330
|
+
}
|
|
331
|
+
function getAliasFromDrizzleAlias(value) {
|
|
332
|
+
const isSQL = value !== null && typeof value === "object" && (0, sql_1.isSQLWrapper)(value) && "queryChunks" in value;
|
|
333
|
+
if (isSQL) {
|
|
334
|
+
const sql = value;
|
|
335
|
+
const queryChunks = sql.queryChunks;
|
|
336
|
+
if (queryChunks.length > 3) {
|
|
337
|
+
const aliasNameChunk = queryChunks[queryChunks.length - 2];
|
|
338
|
+
if ((0, sql_1.isSQLWrapper)(aliasNameChunk) && "queryChunks" in aliasNameChunk) {
|
|
339
|
+
const aliasNameChunkSql = aliasNameChunk;
|
|
340
|
+
if (aliasNameChunkSql.queryChunks?.length === 1 && aliasNameChunkSql.queryChunks[0]) {
|
|
341
|
+
const queryChunksStringChunc = aliasNameChunkSql.queryChunks[0];
|
|
342
|
+
if ("value" in queryChunksStringChunc) {
|
|
343
|
+
const values = queryChunksStringChunc.value;
|
|
344
|
+
if (values && values.length === 1) {
|
|
345
|
+
return values[0];
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return undefined;
|
|
353
|
+
}
|
|
354
|
+
function transformValue(value, alias, aliasMap) {
|
|
355
|
+
const column = aliasMap[alias];
|
|
356
|
+
if (!column)
|
|
357
|
+
return value;
|
|
358
|
+
let customColumn = column;
|
|
359
|
+
// @ts-ignore
|
|
360
|
+
const fromDriver = customColumn?.mapFrom;
|
|
361
|
+
if (fromDriver && value !== null && value !== undefined) {
|
|
362
|
+
return fromDriver(value);
|
|
363
|
+
}
|
|
364
|
+
return value;
|
|
365
|
+
}
|
|
366
|
+
function transformObject(obj, selections, aliasMap) {
|
|
367
|
+
const result = {};
|
|
368
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
369
|
+
const selection = selections[key];
|
|
370
|
+
const alias = getAliasFromDrizzleAlias(selection);
|
|
371
|
+
if (alias && aliasMap[alias]) {
|
|
372
|
+
result[key] = transformValue(value, alias, aliasMap);
|
|
373
|
+
}
|
|
374
|
+
else if (selection && typeof selection === "object" && !(0, sql_1.isSQLWrapper)(selection)) {
|
|
375
|
+
result[key] = transformObject(value, selection, aliasMap);
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
result[key] = value;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return result;
|
|
382
|
+
}
|
|
383
|
+
function applyFromDriverTransform(rows, selections, aliasMap) {
|
|
384
|
+
return rows.map((row) => {
|
|
385
|
+
const transformed = transformObject(row, selections, aliasMap);
|
|
386
|
+
return processNullBranches(transformed);
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
function processNullBranches(obj) {
|
|
390
|
+
if (obj === null || typeof obj !== "object") {
|
|
391
|
+
return obj;
|
|
392
|
+
}
|
|
393
|
+
// Skip built-in objects like Date, Array, etc.
|
|
394
|
+
if (obj.constructor && obj.constructor.name !== "Object") {
|
|
395
|
+
return obj;
|
|
396
|
+
}
|
|
397
|
+
const result = {};
|
|
398
|
+
let allNull = true;
|
|
399
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
400
|
+
if (value === null || value === undefined) {
|
|
401
|
+
result[key] = null;
|
|
402
|
+
continue;
|
|
403
|
+
}
|
|
404
|
+
if (typeof value === "object") {
|
|
405
|
+
const processed = processNullBranches(value);
|
|
406
|
+
result[key] = processed;
|
|
407
|
+
if (processed !== null) {
|
|
408
|
+
allNull = false;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
result[key] = value;
|
|
413
|
+
allNull = false;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return allNull ? null : result;
|
|
417
|
+
}
|
|
418
|
+
function formatLimitOffset(limitOrOffset) {
|
|
419
|
+
if (typeof limitOrOffset !== "number" || Number.isNaN(limitOrOffset)) {
|
|
420
|
+
throw new Error("limitOrOffset must be a valid number");
|
|
421
|
+
}
|
|
422
|
+
return drizzle_orm_1.sql.raw(`${limitOrOffset}`);
|
|
423
|
+
}
|
|
424
|
+
function nextVal(sequenceName) {
|
|
425
|
+
return drizzle_orm_1.sql.raw(`NEXTVAL(${sequenceName})`);
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Analyzes and prints query performance data from CLUSTER_STATEMENTS_SUMMARY table.
|
|
429
|
+
*
|
|
430
|
+
* This function queries the CLUSTER_STATEMENTS_SUMMARY table to find queries that were executed
|
|
431
|
+
* within the specified time window and prints detailed performance information including:
|
|
432
|
+
* - SQL query text
|
|
433
|
+
* - Memory usage (average and max in MB)
|
|
434
|
+
* - Execution time (average in ms)
|
|
435
|
+
* - Number of executions
|
|
436
|
+
* - Execution plan
|
|
437
|
+
*
|
|
438
|
+
* @param forgeSQLORM - The ForgeSQL operation instance for database access
|
|
439
|
+
* @param timeDiffMs - Time window in milliseconds to look back for queries (e.g., 1500 for last 1.5 seconds)
|
|
440
|
+
* @param timeout - Optional timeout in milliseconds for the query execution (defaults to 1500ms)
|
|
441
|
+
*
|
|
442
|
+
* @example
|
|
443
|
+
* ```typescript
|
|
444
|
+
* // Analyze queries from the last 2 seconds
|
|
445
|
+
* await printQueriesWithPlan(forgeSQLORM, 2000);
|
|
446
|
+
*
|
|
447
|
+
* // Analyze queries with custom timeout
|
|
448
|
+
* await printQueriesWithPlan(forgeSQLORM, 1000, 3000);
|
|
449
|
+
* ```
|
|
450
|
+
*
|
|
451
|
+
* @throws Does not throw - errors are logged to console.debug instead
|
|
452
|
+
*/
|
|
453
|
+
async function printQueriesWithPlan(forgeSQLORM, timeDiffMs, timeout) {
|
|
454
|
+
try {
|
|
455
|
+
const statementsTable = SystemTables_1.clusterStatementsSummary;
|
|
456
|
+
const timeoutMs = timeout ?? 3000;
|
|
457
|
+
const results = await withTimeout(forgeSQLORM
|
|
458
|
+
.getDrizzleQueryBuilder()
|
|
459
|
+
.select({
|
|
460
|
+
digestText: withTidbHint(statementsTable.digestText),
|
|
461
|
+
avgLatency: statementsTable.avgLatency,
|
|
462
|
+
avgMem: statementsTable.avgMem,
|
|
463
|
+
execCount: statementsTable.execCount,
|
|
464
|
+
plan: statementsTable.plan,
|
|
465
|
+
stmtType: statementsTable.stmtType,
|
|
466
|
+
})
|
|
467
|
+
.from(statementsTable)
|
|
468
|
+
.where((0, drizzle_orm_1.and)((0, drizzle_orm_1.isNotNull)(statementsTable.digest), (0, drizzle_orm_1.not)((0, drizzle_orm_1.ilike)(statementsTable.digestText, "%information_schema%")), (0, drizzle_orm_1.notInArray)(statementsTable.stmtType, [
|
|
469
|
+
"Use",
|
|
470
|
+
"Set",
|
|
471
|
+
"Show",
|
|
472
|
+
"Commit",
|
|
473
|
+
"Rollback",
|
|
474
|
+
"Begin",
|
|
475
|
+
]), (0, drizzle_orm_1.gte)(statementsTable.lastSeen, (0, drizzle_orm_1.sql) `DATE_SUB
|
|
476
|
+
(NOW(), INTERVAL
|
|
477
|
+
${timeDiffMs * 1000}
|
|
478
|
+
MICROSECOND
|
|
479
|
+
)`))), `Timeout ${timeoutMs}ms in printQueriesWithPlan - transient timeouts are usually fine; repeated timeouts mean this diagnostic query is consistently slow and should be investigated`, timeoutMs + 200);
|
|
480
|
+
for (const result of results) {
|
|
481
|
+
// Average execution time (convert from nanoseconds to milliseconds)
|
|
482
|
+
const avgTimeMs = Number(result.avgLatency) / 1_000_000;
|
|
483
|
+
const avgMemMB = Number(result.avgMem) / 1_000_000;
|
|
484
|
+
// 1. Query info: SQL, memory, time, executions
|
|
485
|
+
// eslint-disable-next-line no-console
|
|
486
|
+
console.warn(`SQL: ${result.digestText} | Memory: ${avgMemMB.toFixed(2)} MB | Time: ${avgTimeMs.toFixed(2)} ms | stmtType: ${result.stmtType} | Executions: ${result.execCount}\n Plan:${result.plan}`);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
catch (error) {
|
|
490
|
+
// eslint-disable-next-line no-console
|
|
491
|
+
console.debug(`Error occurred while retrieving query execution plan: ${error instanceof Error ? error.message : "Unknown error"}. Try again after some time`, error);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
const SESSION_ALIAS_NAME_ORM = "orm";
|
|
495
|
+
/**
|
|
496
|
+
* Analyzes and logs slow queries from the last specified number of hours.
|
|
497
|
+
*
|
|
498
|
+
* This function queries the slow query system table to find queries that were executed
|
|
499
|
+
* within the specified time window and logs detailed performance information including:
|
|
500
|
+
* - SQL query text
|
|
501
|
+
* - Maximum memory usage (in MB)
|
|
502
|
+
* - Query execution time (in ms)
|
|
503
|
+
* - Execution count
|
|
504
|
+
* - Execution plan
|
|
505
|
+
*
|
|
506
|
+
* @param forgeSQLORM - The ForgeSQL operation instance for database access
|
|
507
|
+
* @param hours - Number of hours to look back for slow queries (e.g., 1 for last hour, 24 for last day)
|
|
508
|
+
* @param timeout - Optional timeout in milliseconds for the query execution (defaults to 1500ms)
|
|
509
|
+
*
|
|
510
|
+
* @example
|
|
511
|
+
* ```typescript
|
|
512
|
+
* // Analyze slow queries from the last hour
|
|
513
|
+
* await slowQueryPerHours(forgeSQLORM, 1);
|
|
514
|
+
*
|
|
515
|
+
* // Analyze slow queries from the last 24 hours with custom timeout
|
|
516
|
+
* await slowQueryPerHours(forgeSQLORM, 24, 3000);
|
|
517
|
+
*
|
|
518
|
+
* // Analyze slow queries from the last 6 hours
|
|
519
|
+
* await slowQueryPerHours(forgeSQLORM, 6);
|
|
520
|
+
* ```
|
|
521
|
+
*
|
|
522
|
+
* @throws Does not throw - errors are logged to console.debug instead
|
|
523
|
+
*/
|
|
524
|
+
async function slowQueryPerHours(forgeSQLORM, hours, timeout) {
|
|
525
|
+
try {
|
|
526
|
+
const timeoutMs = timeout ?? 1500;
|
|
527
|
+
const results = await withTimeout(forgeSQLORM
|
|
528
|
+
.getDrizzleQueryBuilder()
|
|
529
|
+
.select({
|
|
530
|
+
query: withTidbHint(SystemTables_1.slowQuery.query),
|
|
531
|
+
queryTime: SystemTables_1.slowQuery.queryTime,
|
|
532
|
+
memMax: SystemTables_1.slowQuery.memMax,
|
|
533
|
+
plan: SystemTables_1.slowQuery.plan,
|
|
534
|
+
})
|
|
535
|
+
.from(SystemTables_1.slowQuery)
|
|
536
|
+
.where((0, drizzle_orm_1.and)((0, drizzle_orm_1.isNotNull)(SystemTables_1.slowQuery.digest), (0, drizzle_orm_1.ne)(SystemTables_1.slowQuery.sessionAlias, SESSION_ALIAS_NAME_ORM), (0, drizzle_orm_1.gte)(SystemTables_1.slowQuery.time, (0, drizzle_orm_1.sql) `DATE_SUB
|
|
537
|
+
(NOW(), INTERVAL
|
|
538
|
+
${hours}
|
|
539
|
+
HOUR
|
|
540
|
+
)`))), `Timeout ${timeoutMs}ms in slowQueryPerHours - transient timeouts are usually fine; repeated timeouts mean this diagnostic query is consistently slow and should be investigated`, timeoutMs);
|
|
541
|
+
const response = [];
|
|
542
|
+
for (const result of results) {
|
|
543
|
+
// Convert memory from bytes to MB and handle null values
|
|
544
|
+
const memMaxMB = result.memMax ? Number(result.memMax) / 1_000_000 : 0;
|
|
545
|
+
const message = `Found SlowQuery SQL: ${result.query} | Memory: ${memMaxMB.toFixed(2)} MB | Time: ${result.queryTime} ms\n Plan:${result.plan}`;
|
|
546
|
+
response.push(message);
|
|
547
|
+
// 1. Query info: SQL, memory, time, executions
|
|
548
|
+
// eslint-disable-next-line no-console
|
|
549
|
+
console.warn(message);
|
|
550
|
+
}
|
|
551
|
+
return response;
|
|
552
|
+
}
|
|
553
|
+
catch (error) {
|
|
554
|
+
// eslint-disable-next-line no-console
|
|
555
|
+
console.debug(`Error occurred while retrieving query execution plan: ${error instanceof Error ? error.message : "Unknown error"}. Try again after some time`, error);
|
|
556
|
+
return [
|
|
557
|
+
`Error occurred while retrieving query execution plan: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
558
|
+
];
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Executes a promise with a timeout.
|
|
563
|
+
*
|
|
564
|
+
* @param promise - The promise to execute
|
|
565
|
+
* @param timeoutMs - Timeout in milliseconds
|
|
566
|
+
* @returns Promise that resolves with the result or rejects on timeout
|
|
567
|
+
* @throws {Error} When the operation times out
|
|
568
|
+
*/
|
|
569
|
+
async function withTimeout(promise, message, timeoutMs) {
|
|
570
|
+
let timeoutId;
|
|
571
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
572
|
+
timeoutId = setTimeout(() => {
|
|
573
|
+
reject(new Error(message));
|
|
574
|
+
}, timeoutMs);
|
|
575
|
+
});
|
|
576
|
+
try {
|
|
577
|
+
return await Promise.race([promise, timeoutPromise]);
|
|
578
|
+
}
|
|
579
|
+
finally {
|
|
580
|
+
if (timeoutId) {
|
|
581
|
+
clearTimeout(timeoutId);
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
function withTidbHint(column) {
|
|
586
|
+
// We lie a bit to TypeScript here: at runtime this is a new SQL fragment,
|
|
587
|
+
// but returning TExpr keeps the column type info in downstream inference.
|
|
588
|
+
return (0, drizzle_orm_1.sql) `/*+ SET_VAR(tidb_session_alias=${drizzle_orm_1.sql.raw(`${SESSION_ALIAS_NAME_ORM}`)}) */ ${column}`;
|
|
589
|
+
}
|
|
590
|
+
//# sourceMappingURL=sqlUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlUtils.js","sourceRoot":"","sources":["../../src/utils/sqlUtils.ts"],"names":[],"mappings":"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"}
|