forge-sql-orm 2.1.12 → 2.1.13

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 (66) hide show
  1. package/README.md +662 -548
  2. package/dist/core/ForgeSQLAnalyseOperations.d.ts.map +1 -1
  3. package/dist/core/ForgeSQLAnalyseOperations.js +257 -0
  4. package/dist/core/ForgeSQLAnalyseOperations.js.map +1 -0
  5. package/dist/core/ForgeSQLCacheOperations.js +172 -0
  6. package/dist/core/ForgeSQLCacheOperations.js.map +1 -0
  7. package/dist/core/ForgeSQLCrudOperations.js +349 -0
  8. package/dist/core/ForgeSQLCrudOperations.js.map +1 -0
  9. package/dist/core/ForgeSQLORM.js +1191 -0
  10. package/dist/core/ForgeSQLORM.js.map +1 -0
  11. package/dist/core/ForgeSQLQueryBuilder.js +77 -0
  12. package/dist/core/ForgeSQLQueryBuilder.js.map +1 -0
  13. package/dist/core/ForgeSQLSelectOperations.js +81 -0
  14. package/dist/core/ForgeSQLSelectOperations.js.map +1 -0
  15. package/dist/core/SystemTables.js +258 -0
  16. package/dist/core/SystemTables.js.map +1 -0
  17. package/dist/index.js +30 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/lib/drizzle/extensions/additionalActions.d.ts.map +1 -1
  20. package/dist/lib/drizzle/extensions/additionalActions.js +527 -0
  21. package/dist/lib/drizzle/extensions/additionalActions.js.map +1 -0
  22. package/dist/utils/cacheContextUtils.d.ts.map +1 -1
  23. package/dist/utils/cacheContextUtils.js +198 -0
  24. package/dist/utils/cacheContextUtils.js.map +1 -0
  25. package/dist/utils/cacheUtils.d.ts.map +1 -1
  26. package/dist/utils/cacheUtils.js +383 -0
  27. package/dist/utils/cacheUtils.js.map +1 -0
  28. package/dist/utils/forgeDriver.d.ts.map +1 -1
  29. package/dist/utils/forgeDriver.js +139 -0
  30. package/dist/utils/forgeDriver.js.map +1 -0
  31. package/dist/utils/forgeDriverProxy.js +68 -0
  32. package/dist/utils/forgeDriverProxy.js.map +1 -0
  33. package/dist/utils/metadataContextUtils.js +28 -0
  34. package/dist/utils/metadataContextUtils.js.map +1 -0
  35. package/dist/utils/requestTypeContextUtils.js +10 -0
  36. package/dist/utils/requestTypeContextUtils.js.map +1 -0
  37. package/dist/utils/sqlHints.js +52 -0
  38. package/dist/utils/sqlHints.js.map +1 -0
  39. package/dist/utils/sqlUtils.d.ts.map +1 -1
  40. package/dist/utils/sqlUtils.js +590 -0
  41. package/dist/utils/sqlUtils.js.map +1 -0
  42. package/dist/webtriggers/applyMigrationsWebTrigger.js +77 -0
  43. package/dist/webtriggers/applyMigrationsWebTrigger.js.map +1 -0
  44. package/dist/webtriggers/clearCacheSchedulerTrigger.js +83 -0
  45. package/dist/webtriggers/clearCacheSchedulerTrigger.js.map +1 -0
  46. package/dist/webtriggers/dropMigrationWebTrigger.js +54 -0
  47. package/dist/webtriggers/dropMigrationWebTrigger.js.map +1 -0
  48. package/dist/webtriggers/dropTablesMigrationWebTrigger.js +54 -0
  49. package/dist/webtriggers/dropTablesMigrationWebTrigger.js.map +1 -0
  50. package/dist/webtriggers/fetchSchemaWebTrigger.js +82 -0
  51. package/dist/webtriggers/fetchSchemaWebTrigger.js.map +1 -0
  52. package/dist/webtriggers/index.js +40 -0
  53. package/dist/webtriggers/index.js.map +1 -0
  54. package/dist/webtriggers/slowQuerySchedulerTrigger.js +80 -0
  55. package/dist/webtriggers/slowQuerySchedulerTrigger.js.map +1 -0
  56. package/package.json +28 -23
  57. package/src/core/ForgeSQLAnalyseOperations.ts +3 -2
  58. package/src/lib/drizzle/extensions/additionalActions.ts +11 -0
  59. package/src/utils/cacheContextUtils.ts +9 -6
  60. package/src/utils/cacheUtils.ts +6 -4
  61. package/src/utils/forgeDriver.ts +3 -7
  62. package/src/utils/sqlUtils.ts +33 -34
  63. package/dist/ForgeSQLORM.js +0 -3922
  64. package/dist/ForgeSQLORM.js.map +0 -1
  65. package/dist/ForgeSQLORM.mjs +0 -3905
  66. package/dist/ForgeSQLORM.mjs.map +0 -1
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.forgeDriver = void 0;
4
+ exports.isUpdateQueryResponse = isUpdateQueryResponse;
5
+ const sql_1 = require("@forge/sql");
6
+ const metadataContextUtils_1 = require("./metadataContextUtils");
7
+ const requestTypeContextUtils_1 = require("./requestTypeContextUtils");
8
+ const sqlUtils_1 = require("./sqlUtils");
9
+ const timeoutMs = 10000;
10
+ const timeoutMessage = `Atlassian @forge/sql did not return a response within ${timeoutMs}ms (${timeoutMs / 1000} seconds), so the request is blocked. Possible causes: slow query, network issues, or exceeding Forge SQL limits.`;
11
+ /**
12
+ * Type guard to check if an object is an UpdateQueryResponse.
13
+ *
14
+ * @param obj - The object to check
15
+ * @returns True if the object is an UpdateQueryResponse
16
+ */
17
+ function isUpdateQueryResponse(obj) {
18
+ return (obj !== null &&
19
+ typeof obj === "object" &&
20
+ typeof obj.affectedRows === "number" &&
21
+ typeof obj.insertId === "number");
22
+ }
23
+ function inlineParams(sql, params) {
24
+ let i = 0;
25
+ return sql.replace(/\?/g, () => {
26
+ const val = params[i++];
27
+ if (val === null)
28
+ return "NULL";
29
+ if (typeof val === "number")
30
+ return val.toString();
31
+ return `'${String(val).replace(/'/g, "''")}'`;
32
+ });
33
+ }
34
+ /**
35
+ * Processes DDL query results and saves metadata.
36
+ *
37
+ * @param result - The DDL query result
38
+ * @returns Processed result for Drizzle ORM
39
+ */
40
+ async function processDDLResult(method, result) {
41
+ if (result.metadata) {
42
+ await (0, metadataContextUtils_1.saveMetaDataToContext)(result.metadata);
43
+ }
44
+ if (!result?.rows) {
45
+ return { rows: [] };
46
+ }
47
+ if (isUpdateQueryResponse(result.rows)) {
48
+ const oneRow = result.rows;
49
+ return { ...oneRow, rows: [oneRow] };
50
+ }
51
+ if (Array.isArray(result.rows)) {
52
+ if (method === "execute") {
53
+ return { rows: [result.rows] };
54
+ }
55
+ else {
56
+ const rows = result.rows.map((r) => Object.values(r));
57
+ return { rows };
58
+ }
59
+ }
60
+ return { rows: [] };
61
+ }
62
+ /**
63
+ * Processes execute method results (UPDATE, INSERT, DELETE).
64
+ *
65
+ * @param query - The SQL query
66
+ * @param params - Query parameters
67
+ * @returns Processed result for Drizzle ORM
68
+ */
69
+ async function processExecuteMethod(query, params) {
70
+ const sqlStatement = sql_1.sql.prepare(query);
71
+ if (params) {
72
+ sqlStatement.bindParams(...params);
73
+ }
74
+ const result = await (0, sqlUtils_1.withTimeout)(sqlStatement.execute(), timeoutMessage, timeoutMs);
75
+ await (0, metadataContextUtils_1.saveMetaDataToContext)(result.metadata);
76
+ if (!result.rows) {
77
+ return { rows: [[]] };
78
+ }
79
+ return { rows: [result.rows] };
80
+ }
81
+ /**
82
+ * Processes all method results (SELECT queries).
83
+ *
84
+ * @param query - The SQL query
85
+ * @param params - Query parameters
86
+ * @returns Processed result for Drizzle ORM
87
+ */
88
+ async function processAllMethod(query, params) {
89
+ const sqlStatement = await sql_1.sql.prepare(query);
90
+ if (params) {
91
+ await sqlStatement.bindParams(...params);
92
+ }
93
+ const result = await (0, sqlUtils_1.withTimeout)(sqlStatement.execute(), timeoutMessage, timeoutMs);
94
+ await (0, metadataContextUtils_1.saveMetaDataToContext)(result.metadata);
95
+ if (!result.rows) {
96
+ return { rows: [] };
97
+ }
98
+ const rows = result.rows.map((r) => Object.values(r));
99
+ return { rows };
100
+ }
101
+ /**
102
+ * Main Forge SQL driver function for Drizzle ORM integration.
103
+ * Handles DDL operations, execute operations (UPDATE/INSERT/DELETE), and select operations.
104
+ *
105
+ * @param query - The SQL query to execute
106
+ * @param params - Query parameters
107
+ * @param method - Execution method ("all" for SELECT, "execute" for UPDATE/INSERT/DELETE)
108
+ * @returns Promise with query results compatible with Drizzle ORM
109
+ *
110
+ * @throws {Error} When DDL operations are called with parameters
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * // DDL operation
115
+ * await forgeDriver("CREATE TABLE users (id INT)", [], "all");
116
+ *
117
+ * // SELECT operation
118
+ * await forgeDriver("SELECT * FROM users WHERE id = ?", [1], "all");
119
+ *
120
+ * // UPDATE operation
121
+ * await forgeDriver("UPDATE users SET name = ? WHERE id = ?", ["John", 1], "execute");
122
+ * ```
123
+ */
124
+ const forgeDriver = async (query, params, method) => {
125
+ const operationType = await (0, requestTypeContextUtils_1.getOperationType)();
126
+ // Handle DDL operations
127
+ if (operationType === "DDL") {
128
+ const result = await (0, sqlUtils_1.withTimeout)(sql_1.sql.executeDDL(inlineParams(query, params)), timeoutMessage, timeoutMs);
129
+ return await processDDLResult(method, result);
130
+ }
131
+ // Handle execute method (UPDATE, INSERT, DELETE)
132
+ if (method === "execute") {
133
+ return await processExecuteMethod(query, params ?? []);
134
+ }
135
+ // Handle all method (SELECT)
136
+ return await processAllMethod(query, params ?? []);
137
+ };
138
+ exports.forgeDriver = forgeDriver;
139
+ //# sourceMappingURL=forgeDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forgeDriver.js","sourceRoot":"","sources":["../../src/utils/forgeDriver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createForgeDriverProxy = createForgeDriverProxy;
4
+ const forgeDriver_1 = require("./forgeDriver");
5
+ const sqlHints_1 = require("./sqlHints");
6
+ const sqlUtils_1 = require("./sqlUtils");
7
+ /**
8
+ * Error codes and constants for query analysis
9
+ */
10
+ const QUERY_ERROR_CODES = {
11
+ TIMEOUT: "SQL_QUERY_TIMEOUT",
12
+ OUT_OF_MEMORY_ERRNO: 8175,
13
+ };
14
+ /**
15
+ * Delay to wait for CLUSTER_STATEMENTS_SUMMARY to be populated
16
+ */
17
+ const STATEMENTS_SUMMARY_DELAY_MS = 200;
18
+ /**
19
+ * Creates a proxy for the forgeDriver that injects SQL hints and handles query analysis
20
+ * @param forgeSqlOperation - The ForgeSQL operation instance
21
+ * @param options - SQL hints to inject
22
+ * @param logRawSqlQuery - Whether to log raw SQL queries
23
+ * @returns A proxied version of the forgeDriver
24
+ */
25
+ function createForgeDriverProxy(forgeSqlOperation, options, logRawSqlQuery) {
26
+ return async (query, params, method) => {
27
+ // Inject SQL hints into the query
28
+ const modifiedQuery = (0, sqlHints_1.injectSqlHints)(query, options);
29
+ if (options && logRawSqlQuery && modifiedQuery !== query) {
30
+ // eslint-disable-next-line no-console
31
+ console.debug(`SQL Hints injected: ${modifiedQuery}`);
32
+ }
33
+ const queryStartTime = Date.now();
34
+ try {
35
+ // Execute the query with injected hints
36
+ return await (0, forgeDriver_1.forgeDriver)(modifiedQuery, params, method);
37
+ }
38
+ catch (error) {
39
+ // Check if this is a timeout or out-of-memory error that we want to analyze
40
+ const isTimeoutError = error.code === QUERY_ERROR_CODES.TIMEOUT;
41
+ const isOutOfMemoryError = error?.context?.debug?.errno === QUERY_ERROR_CODES.OUT_OF_MEMORY_ERRNO;
42
+ if (isTimeoutError || isOutOfMemoryError) {
43
+ if (isTimeoutError) {
44
+ // eslint-disable-next-line no-console
45
+ console.error(` TIMEOUT detected - Query exceeded time limit`);
46
+ }
47
+ else {
48
+ // eslint-disable-next-line no-console
49
+ console.error(`OUT OF MEMORY detected - Query exceeded memory limit`);
50
+ }
51
+ // Wait for CLUSTER_STATEMENTS_SUMMARY to be populated with our failed query data
52
+ await new Promise((resolve) => setTimeout(resolve, STATEMENTS_SUMMARY_DELAY_MS));
53
+ const queryEndTime = Date.now();
54
+ const queryDuration = queryEndTime - queryStartTime;
55
+ // Analyze the failed query using CLUSTER_STATEMENTS_SUMMARY
56
+ await (0, sqlUtils_1.printQueriesWithPlan)(forgeSqlOperation, queryDuration);
57
+ }
58
+ // Log SQL error details if requested
59
+ if (logRawSqlQuery) {
60
+ // eslint-disable-next-line no-console
61
+ console.debug(`SQL Error Details:`, JSON.stringify(error, null, 2));
62
+ }
63
+ // Re-throw the original error
64
+ throw error;
65
+ }
66
+ };
67
+ }
68
+ //# sourceMappingURL=forgeDriverProxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forgeDriverProxy.js","sourceRoot":"","sources":["../../src/utils/forgeDriverProxy.ts"],"names":[],"mappings":";;AAyBA,wDA8DC;AAvFD,+CAA4C;AAC5C,yCAAsD;AAEtD,yCAAkD;AAElD;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,OAAO,EAAE,mBAAmB;IAC5B,mBAAmB,EAAE,IAAI;CACjB,CAAC;AAEX;;GAEG;AACH,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAExC;;;;;;GAMG;AACH,SAAgB,sBAAsB,CACpC,iBAAoC,EACpC,OAAkB,EAClB,cAAwB;IAExB,OAAO,KAAK,EACV,KAAa,EACb,MAAa,EACb,MAAyB,EAKxB,EAAE;QACH,kCAAkC;QAClC,MAAM,aAAa,GAAG,IAAA,yBAAc,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAErD,IAAI,OAAO,IAAI,cAAc,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;YACzD,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,uBAAuB,aAAa,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAElC,IAAI,CAAC;YACH,wCAAwC;YACxC,OAAO,MAAM,IAAA,yBAAW,EAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,4EAA4E;YAC5E,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,KAAK,iBAAiB,CAAC,OAAO,CAAC;YAChE,MAAM,kBAAkB,GACtB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK,iBAAiB,CAAC,mBAAmB,CAAC;YAEzE,IAAI,cAAc,IAAI,kBAAkB,EAAE,CAAC;gBACzC,IAAI,cAAc,EAAE,CAAC;oBACnB,sCAAsC;oBACtC,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;gBACjE,CAAC;qBAAM,CAAC;oBACN,sCAAsC;oBACtC,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;gBACxE,CAAC;gBAED,iFAAiF;gBACjF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC,CAAC;gBAEjF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,CAAC;gBAEpD,4DAA4D;gBAC5D,MAAM,IAAA,+BAAoB,EAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;YAC/D,CAAC;YAED,qCAAqC;YACrC,IAAI,cAAc,EAAE,CAAC;gBACnB,sCAAsC;gBACtC,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACtE,CAAC;YAED,8BAA8B;YAC9B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.metadataQueryContext = void 0;
4
+ exports.saveMetaDataToContext = saveMetaDataToContext;
5
+ exports.getLastestMetadata = getLastestMetadata;
6
+ const node_async_hooks_1 = require("node:async_hooks");
7
+ const sqlUtils_1 = require("./sqlUtils");
8
+ exports.metadataQueryContext = new node_async_hooks_1.AsyncLocalStorage();
9
+ async function saveMetaDataToContext(metadata) {
10
+ const context = exports.metadataQueryContext.getStore();
11
+ if (context) {
12
+ context.printQueriesWithPlan = async () => {
13
+ if (process.env.NODE_ENV !== "test") {
14
+ await new Promise((r) => setTimeout(r, 200));
15
+ }
16
+ await (0, sqlUtils_1.printQueriesWithPlan)(context.forgeSQLORM, Date.now() - context.beginTime.getTime());
17
+ };
18
+ if (metadata) {
19
+ context.totalResponseSize += metadata.responseSize;
20
+ context.totalDbExecutionTime += metadata.dbExecutionTime;
21
+ }
22
+ // Log the results to console
23
+ }
24
+ }
25
+ async function getLastestMetadata() {
26
+ return exports.metadataQueryContext.getStore();
27
+ }
28
+ //# sourceMappingURL=metadataContextUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadataContextUtils.js","sourceRoot":"","sources":["../../src/utils/metadataContextUtils.ts"],"names":[],"mappings":";;;AAcA,sDAeC;AAED,gDAEC;AAjCD,uDAAqD;AAGrD,yCAAkD;AASrC,QAAA,oBAAoB,GAAG,IAAI,oCAAiB,EAAwB,CAAC;AAE3E,KAAK,UAAU,qBAAqB,CAAC,QAA2B;IACrE,MAAM,OAAO,GAAG,4BAAoB,CAAC,QAAQ,EAAE,CAAC;IAChD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,oBAAoB,GAAG,KAAK,IAAI,EAAE;YACxC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACpC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM,IAAA,+BAAoB,EAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5F,CAAC,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,iBAAiB,IAAI,QAAQ,CAAC,YAAY,CAAC;YACnD,OAAO,CAAC,oBAAoB,IAAI,QAAQ,CAAC,eAAe,CAAC;QAC3D,CAAC;QACD,6BAA6B;IAC/B,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,kBAAkB;IACtC,OAAO,4BAAoB,CAAC,QAAQ,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.operationTypeQueryContext = void 0;
4
+ exports.getOperationType = getOperationType;
5
+ const node_async_hooks_1 = require("node:async_hooks");
6
+ exports.operationTypeQueryContext = new node_async_hooks_1.AsyncLocalStorage();
7
+ async function getOperationType() {
8
+ return exports.operationTypeQueryContext.getStore()?.operationType ?? "DML";
9
+ }
10
+ //# sourceMappingURL=requestTypeContextUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestTypeContextUtils.js","sourceRoot":"","sources":["../../src/utils/requestTypeContextUtils.ts"],"names":[],"mappings":";;;AAQA,4CAEC;AAVD,uDAAqD;AAMxC,QAAA,yBAAyB,GAAG,IAAI,oCAAiB,EAA6B,CAAC;AAErF,KAAK,UAAU,gBAAgB;IACpC,OAAO,iCAAyB,CAAC,QAAQ,EAAE,EAAE,aAAa,IAAI,KAAK,CAAC;AACtE,CAAC"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.injectSqlHints = injectSqlHints;
4
+ /**
5
+ * Detects the type of SQL query and injects appropriate hints
6
+ * @param query - The SQL query to analyze
7
+ * @param hints - The hints configuration
8
+ * @returns The modified query with injected hints
9
+ */
10
+ function injectSqlHints(query, hints) {
11
+ if (!hints) {
12
+ return query;
13
+ }
14
+ // Normalize the query for easier matching
15
+ const normalizedQuery = query.trim().toUpperCase();
16
+ // Get the appropriate hints based on query type
17
+ let queryHints;
18
+ if (normalizedQuery.startsWith("SELECT")) {
19
+ queryHints = hints.select;
20
+ }
21
+ else if (normalizedQuery.startsWith("INSERT")) {
22
+ queryHints = hints.insert;
23
+ }
24
+ else if (normalizedQuery.startsWith("UPDATE")) {
25
+ queryHints = hints.update;
26
+ }
27
+ else if (normalizedQuery.startsWith("DELETE")) {
28
+ queryHints = hints.delete;
29
+ }
30
+ // If no hints for this query type, return original query
31
+ if (!queryHints || queryHints.length === 0) {
32
+ return query;
33
+ }
34
+ // Join all hints with spaces
35
+ const hintsString = queryHints.join(" ");
36
+ // Inject hints into the query
37
+ if (normalizedQuery.startsWith("SELECT")) {
38
+ return `SELECT /*+ ${hintsString} */ ${query.substring(6)}`;
39
+ }
40
+ else if (normalizedQuery.startsWith("INSERT")) {
41
+ return `INSERT /*+ ${hintsString} */ ${query.substring(6)}`;
42
+ }
43
+ else if (normalizedQuery.startsWith("UPDATE")) {
44
+ return `UPDATE /*+ ${hintsString} */ ${query.substring(6)}`;
45
+ }
46
+ else if (normalizedQuery.startsWith("DELETE")) {
47
+ return `DELETE /*+ ${hintsString} */ ${query.substring(6)}`;
48
+ }
49
+ // If no match found, return original query
50
+ return query;
51
+ }
52
+ //# sourceMappingURL=sqlHints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlHints.js","sourceRoot":"","sources":["../../src/utils/sqlHints.ts"],"names":[],"mappings":";;AAoBA,wCA0CC;AAhDD;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,KAAa,EAAE,KAAgB;IAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0CAA0C;IAC1C,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEnD,gDAAgD;IAChD,IAAI,UAAgC,CAAC;IAErC,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,CAAC;SAAM,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,CAAC;SAAM,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,CAAC;SAAM,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,yDAAyD;IACzD,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6BAA6B;IAC7B,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzC,8BAA8B;IAC9B,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,OAAO,cAAc,WAAW,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,CAAC;SAAM,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO,cAAc,WAAW,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,CAAC;SAAM,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO,cAAc,WAAW,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,CAAC;SAAM,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO,cAAc,WAAW,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,CAAC;IAED,2CAA2C;IAC3C,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sqlUtils.d.ts","sourceRoot":"","sources":["../../src/utils/sqlUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sqlUtils.d.ts","sourceRoot":"","sources":["../../src/utils/sqlUtils.ts"],"names":[],"mappings":"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"}