@stingerloom/orm 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +3 -3
  2. package/dist/core/AggregateQueryHandler.d.ts +17 -0
  3. package/dist/core/AggregateQueryHandler.d.ts.map +1 -0
  4. package/dist/core/AggregateQueryHandler.js +96 -0
  5. package/dist/core/AggregateQueryHandler.js.map +1 -0
  6. package/dist/core/CascadeHandler.d.ts +17 -0
  7. package/dist/core/CascadeHandler.d.ts.map +1 -0
  8. package/dist/core/CascadeHandler.js +106 -0
  9. package/dist/core/CascadeHandler.js.map +1 -0
  10. package/dist/core/Conditions.d.ts +2 -0
  11. package/dist/core/Conditions.d.ts.map +1 -1
  12. package/dist/core/Conditions.js +15 -1
  13. package/dist/core/Conditions.js.map +1 -1
  14. package/dist/core/EntityManager.d.ts +30 -43
  15. package/dist/core/EntityManager.d.ts.map +1 -1
  16. package/dist/core/EntityManager.js +509 -1492
  17. package/dist/core/EntityManager.js.map +1 -1
  18. package/dist/core/EntityManagerInternals.d.ts +28 -0
  19. package/dist/core/EntityManagerInternals.d.ts.map +1 -0
  20. package/dist/core/EntityManagerInternals.js +3 -0
  21. package/dist/core/EntityManagerInternals.js.map +1 -0
  22. package/dist/core/ExplainQueryHandler.d.ts +16 -0
  23. package/dist/core/ExplainQueryHandler.d.ts.map +1 -0
  24. package/dist/core/ExplainQueryHandler.js +236 -0
  25. package/dist/core/ExplainQueryHandler.js.map +1 -0
  26. package/dist/core/QueryTracker.d.ts +5 -1
  27. package/dist/core/QueryTracker.d.ts.map +1 -1
  28. package/dist/core/QueryTracker.js +75 -21
  29. package/dist/core/QueryTracker.js.map +1 -1
  30. package/dist/core/RelationLoader.d.ts +13 -0
  31. package/dist/core/RelationLoader.d.ts.map +1 -0
  32. package/dist/core/RelationLoader.js +206 -0
  33. package/dist/core/RelationLoader.js.map +1 -0
  34. package/dist/core/RelationMetadataResolver.d.ts +24 -0
  35. package/dist/core/RelationMetadataResolver.d.ts.map +1 -0
  36. package/dist/core/RelationMetadataResolver.js +182 -0
  37. package/dist/core/RelationMetadataResolver.js.map +1 -0
  38. package/dist/core/ReplicationManager.d.ts +11 -0
  39. package/dist/core/ReplicationManager.d.ts.map +1 -0
  40. package/dist/core/ReplicationManager.js +38 -0
  41. package/dist/core/ReplicationManager.js.map +1 -0
  42. package/dist/core/SchemaRegistrar.d.ts +15 -0
  43. package/dist/core/SchemaRegistrar.d.ts.map +1 -0
  44. package/dist/core/SchemaRegistrar.js +238 -0
  45. package/dist/core/SchemaRegistrar.js.map +1 -0
  46. package/dist/core/generators/SchemaGenerator.d.ts.map +1 -1
  47. package/dist/core/generators/SchemaGenerator.js +4 -0
  48. package/dist/core/generators/SchemaGenerator.js.map +1 -1
  49. package/dist/core/index.d.ts +8 -0
  50. package/dist/core/index.d.ts.map +1 -1
  51. package/dist/core/index.js +8 -0
  52. package/dist/core/index.js.map +1 -1
  53. package/dist/decorators/Column.d.ts +1 -1
  54. package/dist/decorators/Column.d.ts.map +1 -1
  55. package/dist/decorators/Column.js.map +1 -1
  56. package/dist/decorators/CreateTimestamp.d.ts +3 -0
  57. package/dist/decorators/CreateTimestamp.d.ts.map +1 -0
  58. package/dist/decorators/CreateTimestamp.js +16 -0
  59. package/dist/decorators/CreateTimestamp.js.map +1 -0
  60. package/dist/decorators/Entity.d.ts.map +1 -1
  61. package/dist/decorators/Entity.js +9 -3
  62. package/dist/decorators/Entity.js.map +1 -1
  63. package/dist/decorators/UpdateTimestamp.d.ts +3 -0
  64. package/dist/decorators/UpdateTimestamp.d.ts.map +1 -0
  65. package/dist/decorators/UpdateTimestamp.js +16 -0
  66. package/dist/decorators/UpdateTimestamp.js.map +1 -0
  67. package/dist/decorators/Version.d.ts.map +1 -1
  68. package/dist/decorators/Version.js +3 -3
  69. package/dist/decorators/Version.js.map +1 -1
  70. package/dist/decorators/index.d.ts +2 -0
  71. package/dist/decorators/index.d.ts.map +1 -1
  72. package/dist/decorators/index.js +2 -0
  73. package/dist/decorators/index.js.map +1 -1
  74. package/dist/dialects/FindOption.d.ts +2 -2
  75. package/dist/dialects/FindOption.d.ts.map +1 -1
  76. package/dist/dialects/TransactionSessionManager.d.ts.map +1 -1
  77. package/dist/dialects/TransactionSessionManager.js +5 -2
  78. package/dist/dialects/TransactionSessionManager.js.map +1 -1
  79. package/dist/dialects/mysql/MySqlDataSource.d.ts.map +1 -1
  80. package/dist/dialects/mysql/MySqlDataSource.js +3 -0
  81. package/dist/dialects/mysql/MySqlDataSource.js.map +1 -1
  82. package/dist/dialects/mysql/MySqlDriver.d.ts.map +1 -1
  83. package/dist/dialects/mysql/MySqlDriver.js +11 -3
  84. package/dist/dialects/mysql/MySqlDriver.js.map +1 -1
  85. package/dist/dialects/postgres/PostgresDataSource.d.ts.map +1 -1
  86. package/dist/dialects/postgres/PostgresDataSource.js +3 -0
  87. package/dist/dialects/postgres/PostgresDataSource.js.map +1 -1
  88. package/dist/dialects/postgres/PostgresDriver.d.ts.map +1 -1
  89. package/dist/dialects/postgres/PostgresDriver.js +6 -0
  90. package/dist/dialects/postgres/PostgresDriver.js.map +1 -1
  91. package/dist/dialects/sqlite/SqliteDataSource.d.ts.map +1 -1
  92. package/dist/dialects/sqlite/SqliteDataSource.js +3 -0
  93. package/dist/dialects/sqlite/SqliteDataSource.js.map +1 -1
  94. package/dist/dialects/sqlite/SqliteDriver.d.ts.map +1 -1
  95. package/dist/dialects/sqlite/SqliteDriver.js +5 -0
  96. package/dist/dialects/sqlite/SqliteDriver.js.map +1 -1
  97. package/dist/errors/DatabaseConnectionFailedError.d.ts +2 -1
  98. package/dist/errors/DatabaseConnectionFailedError.d.ts.map +1 -1
  99. package/dist/errors/DatabaseConnectionFailedError.js +12 -2
  100. package/dist/errors/DatabaseConnectionFailedError.js.map +1 -1
  101. package/dist/errors/OptimisticLockError.d.ts +5 -0
  102. package/dist/errors/OptimisticLockError.d.ts.map +1 -0
  103. package/dist/errors/OptimisticLockError.js +14 -0
  104. package/dist/errors/OptimisticLockError.js.map +1 -0
  105. package/dist/errors/OrmErrorCode.d.ts +3 -1
  106. package/dist/errors/OrmErrorCode.d.ts.map +1 -1
  107. package/dist/errors/OrmErrorCode.js +2 -0
  108. package/dist/errors/OrmErrorCode.js.map +1 -1
  109. package/dist/errors/index.d.ts +1 -0
  110. package/dist/errors/index.d.ts.map +1 -1
  111. package/dist/errors/index.js +1 -0
  112. package/dist/errors/index.js.map +1 -1
  113. package/dist/metadata/MetadataContext.d.ts.map +1 -1
  114. package/dist/metadata/MetadataContext.js +3 -1
  115. package/dist/metadata/MetadataContext.js.map +1 -1
  116. package/dist/utils/index.d.ts +1 -0
  117. package/dist/utils/index.d.ts.map +1 -1
  118. package/dist/utils/index.js +1 -0
  119. package/dist/utils/index.js.map +1 -1
  120. package/dist/utils/validateSavepointName.d.ts +2 -0
  121. package/dist/utils/validateSavepointName.d.ts.map +1 -0
  122. package/dist/utils/validateSavepointName.js +12 -0
  123. package/dist/utils/validateSavepointName.js.map +1 -0
  124. package/package.json +7 -3
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ExplainQueryHandler = void 0;
37
+ const sql_template_tag_1 = __importStar(require("sql-template-tag"));
38
+ const Conditions_1 = require("./Conditions");
39
+ const RawQueryBuilderFactory_1 = require("./RawQueryBuilderFactory");
40
+ const EntityMetadataNotFoundError_1 = require("../errors/EntityMetadataNotFoundError");
41
+ const InvalidQueryError_1 = require("../errors/InvalidQueryError");
42
+ class ExplainQueryHandler {
43
+ constructor(resolver, ctx) {
44
+ this.resolver = resolver;
45
+ this.ctx = ctx;
46
+ }
47
+ async explain(entity, findOption = {}) {
48
+ const driver = this.ctx.getDriver();
49
+ if (!driver || !driver.supportsExplain()) {
50
+ throw new InvalidQueryError_1.InvalidQueryError("EXPLAIN is not supported by the current database driver.");
51
+ }
52
+ const { select, orderBy, where, take } = findOption;
53
+ const { limit } = findOption;
54
+ const metadata = this.resolver.resolveEntityMetadata(entity);
55
+ if (!metadata) {
56
+ throw new EntityMetadataNotFoundError_1.EntityMetadataNotFoundError(entity.name);
57
+ }
58
+ const qb = RawQueryBuilderFactory_1.RawQueryBuilderFactory.create();
59
+ const selectMap = [];
60
+ const whereMap = [];
61
+ const orderByMap = [];
62
+ const manyToOneRelations = this.resolver.resolveManyToOneMetadata(entity);
63
+ const eagerRelations = manyToOneRelations.filter((rel) => {
64
+ const isEager = rel.option?.eager === true;
65
+ const isInRelations = findOption.relations?.includes(rel.columnName);
66
+ return isEager || isInRelations;
67
+ });
68
+ const oneToOneRelations = this.resolver.resolveOneToOneMetadata(entity);
69
+ const eagerOneToOneRelations = oneToOneRelations.filter((rel) => {
70
+ if (!rel.joinColumn)
71
+ return false;
72
+ const isEager = rel.option?.eager === true;
73
+ const isInRelations = findOption.relations?.includes(rel.propertyKey);
74
+ return isEager || isInRelations;
75
+ });
76
+ const hasEagerJoins = eagerRelations.length > 0 || eagerOneToOneRelations.length > 0;
77
+ const tableName = metadata.name;
78
+ if (select) {
79
+ const selectedColumns = this.ctx.resolveSelectColumns(select);
80
+ if (hasEagerJoins) {
81
+ selectMap.push(...selectedColumns.map((col) => `${this.ctx.wrap(tableName)}.${this.ctx.wrap(col)}`));
82
+ }
83
+ else {
84
+ selectMap.push(...selectedColumns.map((col) => this.ctx.wrap(col)));
85
+ }
86
+ }
87
+ else {
88
+ if (hasEagerJoins) {
89
+ selectMap.push(...metadata.columns.map((column) => `${this.ctx.wrap(tableName)}.${this.ctx.wrap(column.name)}`));
90
+ }
91
+ else {
92
+ selectMap.push(...metadata.columns.map((column) => this.ctx.wrap(column.name)));
93
+ }
94
+ }
95
+ for (const key in where) {
96
+ const value = where[key];
97
+ if (value !== undefined && value !== null) {
98
+ if (hasEagerJoins) {
99
+ whereMap.push(Conditions_1.Conditions.equals(`${this.ctx.wrap(tableName)}.${this.ctx.wrap(key)}`, value));
100
+ }
101
+ else {
102
+ whereMap.push(Conditions_1.Conditions.equals(this.ctx.wrap(key), value));
103
+ }
104
+ }
105
+ }
106
+ const deletedAtColumn = this.resolver.getDeletedAtColumn(entity);
107
+ if (deletedAtColumn && !findOption.withDeleted) {
108
+ if (hasEagerJoins) {
109
+ whereMap.push(Conditions_1.Conditions.isNull(`${this.ctx.wrap(tableName)}.${this.ctx.wrap(deletedAtColumn)}`));
110
+ }
111
+ else {
112
+ whereMap.push(Conditions_1.Conditions.isNull(this.ctx.wrap(deletedAtColumn)));
113
+ }
114
+ }
115
+ for (const key in orderBy) {
116
+ const value = orderBy[key];
117
+ if (value) {
118
+ orderByMap.push({ column: this.ctx.wrap(key), direction: value });
119
+ }
120
+ }
121
+ qb.select(selectMap).from(this.ctx.wrap(tableName));
122
+ qb.where(whereMap).orderBy(orderByMap);
123
+ if (Array.isArray(limit)) {
124
+ let [offset, count] = limit;
125
+ if (offset < 0)
126
+ offset = 0;
127
+ if (count < 0)
128
+ count = 0;
129
+ if (count === 0)
130
+ count = 1;
131
+ if (take && take > 0)
132
+ count = take;
133
+ if (this.ctx.isMySqlFamily())
134
+ qb.setDatabaseType("mysql");
135
+ qb.limit([offset, count]);
136
+ }
137
+ else if (limit) {
138
+ qb.limit(limit);
139
+ }
140
+ const selectQuery = qb.build();
141
+ const explainPrefix = driver.buildExplainSql("");
142
+ const explainQuery = (0, sql_template_tag_1.default) `${(0, sql_template_tag_1.raw)(explainPrefix)}${selectQuery}`;
143
+ const readNode = this.ctx.getReadNode(findOption.useMaster);
144
+ return this.ctx.executeInTransaction(async (session) => {
145
+ const result = await session.query(explainQuery);
146
+ const rawRows = result?.results ?? [];
147
+ return this.parseExplainResult(rawRows);
148
+ }, undefined, readNode);
149
+ }
150
+ parseExplainResult(rawRows) {
151
+ if (!rawRows || rawRows.length === 0) {
152
+ return {
153
+ raw: [],
154
+ rows: null,
155
+ type: null,
156
+ possibleKeys: null,
157
+ key: null,
158
+ cost: null,
159
+ };
160
+ }
161
+ const firstRow = rawRows[0];
162
+ if (firstRow && "QUERY PLAN" in firstRow) {
163
+ return this.parsePostgresExplain(firstRow["QUERY PLAN"]);
164
+ }
165
+ if ("type" in firstRow || "select_type" in firstRow) {
166
+ return this.parseMysqlExplain(rawRows);
167
+ }
168
+ if ("detail" in firstRow || "notused" in firstRow) {
169
+ return this.parseSqliteExplain(rawRows);
170
+ }
171
+ return {
172
+ raw: rawRows,
173
+ rows: null,
174
+ type: null,
175
+ possibleKeys: null,
176
+ key: null,
177
+ cost: null,
178
+ };
179
+ }
180
+ parseMysqlExplain(rawRows) {
181
+ const first = rawRows[0];
182
+ const rows = first.rows != null ? Number(first.rows) : null;
183
+ const type = first.type != null ? String(first.type) : null;
184
+ const possibleKeysRaw = first.possible_keys;
185
+ const possibleKeys = possibleKeysRaw != null
186
+ ? String(possibleKeysRaw)
187
+ .split(",")
188
+ .map((k) => k.trim())
189
+ : null;
190
+ const key = first.key != null ? String(first.key) : null;
191
+ const cost = first.filtered != null ? Number(first.filtered) : null;
192
+ return { raw: rawRows, rows, type, possibleKeys, key, cost };
193
+ }
194
+ parsePostgresExplain(queryPlan) {
195
+ const rawArray = Array.isArray(queryPlan) ? queryPlan : [queryPlan];
196
+ const plan = rawArray[0]?.Plan ?? rawArray[0]?.["Plan"] ?? null;
197
+ if (!plan) {
198
+ return {
199
+ raw: rawArray,
200
+ rows: null,
201
+ type: null,
202
+ possibleKeys: null,
203
+ key: null,
204
+ cost: null,
205
+ };
206
+ }
207
+ const rows = plan["Plan Rows"] != null ? Number(plan["Plan Rows"]) : null;
208
+ const type = plan["Node Type"] != null ? String(plan["Node Type"]) : null;
209
+ const key = plan["Index Name"] != null ? String(plan["Index Name"]) : null;
210
+ const cost = plan["Total Cost"] != null ? Number(plan["Total Cost"]) : null;
211
+ return { raw: rawArray, rows, type, possibleKeys: null, key, cost };
212
+ }
213
+ parseSqliteExplain(rawRows) {
214
+ const details = rawRows.map((r) => String(r.detail ?? ""));
215
+ const firstDetail = details[0] ?? "";
216
+ let type = null;
217
+ let key = null;
218
+ if (firstDetail.startsWith("SCAN"))
219
+ type = "SCAN";
220
+ else if (firstDetail.startsWith("SEARCH"))
221
+ type = "SEARCH";
222
+ const indexMatch = firstDetail.match(/USING (?:COVERING )?INDEX (\S+)/);
223
+ if (indexMatch)
224
+ key = indexMatch[1];
225
+ return {
226
+ raw: rawRows,
227
+ rows: null,
228
+ type,
229
+ possibleKeys: null,
230
+ key,
231
+ cost: null,
232
+ };
233
+ }
234
+ }
235
+ exports.ExplainQueryHandler = ExplainQueryHandler;
236
+ //# sourceMappingURL=ExplainQueryHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExplainQueryHandler.js","sourceRoot":"","sources":["../../src/core/ExplainQueryHandler.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,11 @@ export interface QueryTrackerOptions {
13
13
  ttlMs?: number;
14
14
  }
15
15
  export declare class QueryTracker {
16
- private readonly log;
16
+ private buffer;
17
+ private head;
18
+ private _size;
19
+ private readonly unboundedLog;
20
+ private readonly unbounded;
17
21
  private readonly logger;
18
22
  private readonly windowMs;
19
23
  private readonly threshold;
@@ -1 +1 @@
1
- {"version":3,"file":"QueryTracker.d.ts","sourceRoot":"","sources":["../../src/core/QueryTracker.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD,MAAM,WAAW,mBAAmB;IAElC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAO5B,aAAa,CAAC,EAAE,MAAM,CAAC;IAOvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAOlB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAWD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAuB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IAErD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAG5C,OAAO,CAAC,iBAAiB,CAAK;gBAElB,OAAO,CAAC,EAAE,mBAAmB;IAazC,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAoCpE,MAAM,IAAI,aAAa,CAAC,aAAa,CAAC;IAOtC,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAKD,UAAU,IAAI,IAAI;IAOlB,QAAQ,IAAI,IAAI;IAWV,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuBzD,KAAK,IAAI,IAAI;IAQb,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,cAAc;CAuBvB"}
1
+ {"version":3,"file":"QueryTracker.d.ts","sourceRoot":"","sources":["../../src/core/QueryTracker.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD,MAAM,WAAW,mBAAmB;IAElC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAO5B,aAAa,CAAC,EAAE,MAAM,CAAC;IAOvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAOlB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAWD,qBAAa,YAAY;IAEvB,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,KAAK,CAAK;IAGlB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IAEpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IAErD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAG5C,OAAO,CAAC,iBAAiB,CAAK;gBAElB,OAAO,CAAC,EAAE,mBAAmB;IAkBzC,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IA0CpE,MAAM,IAAI,aAAa,CAAC,aAAa,CAAC;IActC,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAKD,UAAU,IAAI,IAAI;IAOlB,QAAQ,IAAI,IAAI;IAWV,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuBzD,KAAK,IAAI,IAAI;IAab,OAAO,CAAC,YAAY;IA4BpB,OAAO,CAAC,cAAc;CA8BvB"}
@@ -4,7 +4,10 @@ exports.QueryTracker = void 0;
4
4
  const Logger_1 = require("../utils/Logger");
5
5
  class QueryTracker {
6
6
  constructor(options) {
7
- this.log = [];
7
+ this.buffer = [];
8
+ this.head = 0;
9
+ this._size = 0;
10
+ this.unboundedLog = [];
8
11
  this.logger = new Logger_1.Logger("QueryTracker");
9
12
  this.warned = new Set();
10
13
  this._activeQueryCount = 0;
@@ -14,6 +17,11 @@ class QueryTracker {
14
17
  this.maxLogEntries = options?.maxLogEntries ?? 1000;
15
18
  this.enabled = options?.enabled ?? true;
16
19
  this.ttlMs = options?.ttlMs ?? 0;
20
+ this.unbounded =
21
+ this.maxLogEntries <= 0 || !isFinite(this.maxLogEntries);
22
+ if (!this.unbounded) {
23
+ this.buffer = new Array(this.maxLogEntries);
24
+ }
17
25
  }
18
26
  track(entityName, sqlText, durationMs) {
19
27
  if (!this.enabled)
@@ -22,14 +30,24 @@ class QueryTracker {
22
30
  if (this.ttlMs > 0) {
23
31
  this.evictExpired(now);
24
32
  }
25
- this.log.push({
33
+ const entry = {
26
34
  entityName,
27
35
  sql: sqlText,
28
36
  durationMs,
29
37
  timestamp: now,
30
- });
31
- if (this.maxLogEntries > 0 && this.log.length > this.maxLogEntries) {
32
- this.log.splice(0, this.log.length - this.maxLogEntries);
38
+ };
39
+ if (this.unbounded) {
40
+ this.unboundedLog.push(entry);
41
+ }
42
+ else {
43
+ const writeIdx = (this.head + this._size) % this.maxLogEntries;
44
+ this.buffer[writeIdx] = entry;
45
+ if (this._size < this.maxLogEntries) {
46
+ this._size++;
47
+ }
48
+ else {
49
+ this.head = (this.head + 1) % this.maxLogEntries;
50
+ }
33
51
  }
34
52
  if (this.slowQueryMs !== null && durationMs > this.slowQueryMs) {
35
53
  this.logger.warn(`[SLOW QUERY] ${durationMs}ms: ${sqlText}`);
@@ -37,7 +55,13 @@ class QueryTracker {
37
55
  this.detectNPlusOne(entityName, now);
38
56
  }
39
57
  getLog() {
40
- return this.log;
58
+ if (this.unbounded)
59
+ return this.unboundedLog;
60
+ const result = [];
61
+ for (let i = 0; i < this._size; i++) {
62
+ result.push(this.buffer[(this.head + i) % this.maxLogEntries]);
63
+ }
64
+ return result;
41
65
  }
42
66
  get activeQueryCount() {
43
67
  return this._activeQueryCount;
@@ -70,22 +94,42 @@ class QueryTracker {
70
94
  });
71
95
  }
72
96
  reset() {
73
- this.log.length = 0;
97
+ if (this.unbounded) {
98
+ this.unboundedLog.length = 0;
99
+ }
100
+ else {
101
+ this.head = 0;
102
+ this._size = 0;
103
+ }
74
104
  this.warned.clear();
75
105
  }
76
106
  evictExpired(now) {
77
107
  const cutoff = now - this.ttlMs;
78
- let removeCount = 0;
79
- for (let i = 0; i < this.log.length; i++) {
80
- if (this.log[i].timestamp < cutoff) {
81
- removeCount++;
108
+ if (this.unbounded) {
109
+ let removeCount = 0;
110
+ for (let i = 0; i < this.unboundedLog.length; i++) {
111
+ if (this.unboundedLog[i].timestamp < cutoff) {
112
+ removeCount++;
113
+ }
114
+ else {
115
+ break;
116
+ }
82
117
  }
83
- else {
84
- break;
118
+ if (removeCount > 0) {
119
+ this.unboundedLog.splice(0, removeCount);
85
120
  }
86
121
  }
87
- if (removeCount > 0) {
88
- this.log.splice(0, removeCount);
122
+ else {
123
+ while (this._size > 0) {
124
+ const entry = this.buffer[this.head];
125
+ if (entry && entry.timestamp < cutoff) {
126
+ this.head = (this.head + 1) % this.maxLogEntries;
127
+ this._size--;
128
+ }
129
+ else {
130
+ break;
131
+ }
132
+ }
89
133
  }
90
134
  }
91
135
  detectNPlusOne(entityName, now) {
@@ -93,12 +137,22 @@ class QueryTracker {
93
137
  return;
94
138
  const windowStart = now - this.windowMs;
95
139
  let count = 0;
96
- for (let i = this.log.length - 1; i >= 0; i--) {
97
- const entry = this.log[i];
98
- if (entry.timestamp < windowStart)
99
- break;
100
- if (entry.entityName === entityName) {
101
- count++;
140
+ if (this.unbounded) {
141
+ for (let i = this.unboundedLog.length - 1; i >= 0; i--) {
142
+ const entry = this.unboundedLog[i];
143
+ if (entry.timestamp < windowStart)
144
+ break;
145
+ if (entry.entityName === entityName)
146
+ count++;
147
+ }
148
+ }
149
+ else {
150
+ for (let i = this._size - 1; i >= 0; i--) {
151
+ const entry = this.buffer[(this.head + i) % this.maxLogEntries];
152
+ if (entry.timestamp < windowStart)
153
+ break;
154
+ if (entry.entityName === entityName)
155
+ count++;
102
156
  }
103
157
  }
104
158
  if (count >= this.threshold) {
@@ -1 +1 @@
1
- {"version":3,"file":"QueryTracker.js","sourceRoot":"","sources":["../../src/core/QueryTracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QueryTracker.js","sourceRoot":"","sources":["../../src/core/QueryTracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { ClazzType } from "../utils";
2
+ import { TransactionSessionManager } from "../dialects/TransactionSessionManager";
3
+ import { RelationMetadataResolver } from "./RelationMetadataResolver";
4
+ import { EntityManagerInternals } from "./EntityManagerInternals";
5
+ export declare class RelationLoader {
6
+ private readonly resolver;
7
+ private readonly ctx;
8
+ constructor(resolver: RelationMetadataResolver, ctx: EntityManagerInternals);
9
+ loadOneToManyRelations<T>(entity: ClazzType<T>, parentResults: T | T[], relations: string[], existingSession?: TransactionSessionManager): Promise<void>;
10
+ loadManyToManyRelations<T>(entity: ClazzType<T>, parentResults: T | T[], relations: string[], existingSession?: TransactionSessionManager): Promise<void>;
11
+ loadOneToOneRelations<T>(entity: ClazzType<T>, parentResults: T | T[], relations: string[], existingSession?: TransactionSessionManager): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=RelationLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationLoader.d.ts","sourceRoot":"","sources":["../../src/core/RelationLoader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAKlF,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAMlE,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBADH,QAAQ,EAAE,wBAAwB,EAClC,GAAG,EAAE,sBAAsB;IAWxC,sBAAsB,CAAC,CAAC,EAC5B,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EACpB,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,EACtB,SAAS,EAAE,MAAM,EAAE,EACnB,eAAe,CAAC,EAAE,yBAAyB,GAC1C,OAAO,CAAC,IAAI,CAAC;IA+DV,uBAAuB,CAAC,CAAC,EAC7B,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EACpB,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,EACtB,SAAS,EAAE,MAAM,EAAE,EACnB,eAAe,CAAC,EAAE,yBAAyB,GAC1C,OAAO,CAAC,IAAI,CAAC;IA+FV,qBAAqB,CAAC,CAAC,EAC3B,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EACpB,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,EACtB,SAAS,EAAE,MAAM,EAAE,EACnB,eAAe,CAAC,EAAE,yBAAyB,GAC1C,OAAO,CAAC,IAAI,CAAC;CAwEjB"}