@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.
- package/README.md +3 -3
- package/dist/core/AggregateQueryHandler.d.ts +17 -0
- package/dist/core/AggregateQueryHandler.d.ts.map +1 -0
- package/dist/core/AggregateQueryHandler.js +96 -0
- package/dist/core/AggregateQueryHandler.js.map +1 -0
- package/dist/core/CascadeHandler.d.ts +17 -0
- package/dist/core/CascadeHandler.d.ts.map +1 -0
- package/dist/core/CascadeHandler.js +106 -0
- package/dist/core/CascadeHandler.js.map +1 -0
- package/dist/core/Conditions.d.ts +2 -0
- package/dist/core/Conditions.d.ts.map +1 -1
- package/dist/core/Conditions.js +15 -1
- package/dist/core/Conditions.js.map +1 -1
- package/dist/core/EntityManager.d.ts +30 -43
- package/dist/core/EntityManager.d.ts.map +1 -1
- package/dist/core/EntityManager.js +509 -1492
- package/dist/core/EntityManager.js.map +1 -1
- package/dist/core/EntityManagerInternals.d.ts +28 -0
- package/dist/core/EntityManagerInternals.d.ts.map +1 -0
- package/dist/core/EntityManagerInternals.js +3 -0
- package/dist/core/EntityManagerInternals.js.map +1 -0
- package/dist/core/ExplainQueryHandler.d.ts +16 -0
- package/dist/core/ExplainQueryHandler.d.ts.map +1 -0
- package/dist/core/ExplainQueryHandler.js +236 -0
- package/dist/core/ExplainQueryHandler.js.map +1 -0
- package/dist/core/QueryTracker.d.ts +5 -1
- package/dist/core/QueryTracker.d.ts.map +1 -1
- package/dist/core/QueryTracker.js +75 -21
- package/dist/core/QueryTracker.js.map +1 -1
- package/dist/core/RelationLoader.d.ts +13 -0
- package/dist/core/RelationLoader.d.ts.map +1 -0
- package/dist/core/RelationLoader.js +206 -0
- package/dist/core/RelationLoader.js.map +1 -0
- package/dist/core/RelationMetadataResolver.d.ts +24 -0
- package/dist/core/RelationMetadataResolver.d.ts.map +1 -0
- package/dist/core/RelationMetadataResolver.js +182 -0
- package/dist/core/RelationMetadataResolver.js.map +1 -0
- package/dist/core/ReplicationManager.d.ts +11 -0
- package/dist/core/ReplicationManager.d.ts.map +1 -0
- package/dist/core/ReplicationManager.js +38 -0
- package/dist/core/ReplicationManager.js.map +1 -0
- package/dist/core/SchemaRegistrar.d.ts +15 -0
- package/dist/core/SchemaRegistrar.d.ts.map +1 -0
- package/dist/core/SchemaRegistrar.js +238 -0
- package/dist/core/SchemaRegistrar.js.map +1 -0
- package/dist/core/generators/SchemaGenerator.d.ts.map +1 -1
- package/dist/core/generators/SchemaGenerator.js +4 -0
- package/dist/core/generators/SchemaGenerator.js.map +1 -1
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +1 -1
- package/dist/decorators/Column.d.ts +1 -1
- package/dist/decorators/Column.d.ts.map +1 -1
- package/dist/decorators/Column.js.map +1 -1
- package/dist/decorators/CreateTimestamp.d.ts +3 -0
- package/dist/decorators/CreateTimestamp.d.ts.map +1 -0
- package/dist/decorators/CreateTimestamp.js +16 -0
- package/dist/decorators/CreateTimestamp.js.map +1 -0
- package/dist/decorators/Entity.d.ts.map +1 -1
- package/dist/decorators/Entity.js +9 -3
- package/dist/decorators/Entity.js.map +1 -1
- package/dist/decorators/UpdateTimestamp.d.ts +3 -0
- package/dist/decorators/UpdateTimestamp.d.ts.map +1 -0
- package/dist/decorators/UpdateTimestamp.js +16 -0
- package/dist/decorators/UpdateTimestamp.js.map +1 -0
- package/dist/decorators/Version.d.ts.map +1 -1
- package/dist/decorators/Version.js +3 -3
- package/dist/decorators/Version.js.map +1 -1
- package/dist/decorators/index.d.ts +2 -0
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/decorators/index.js +2 -0
- package/dist/decorators/index.js.map +1 -1
- package/dist/dialects/FindOption.d.ts +2 -2
- package/dist/dialects/FindOption.d.ts.map +1 -1
- package/dist/dialects/TransactionSessionManager.d.ts.map +1 -1
- package/dist/dialects/TransactionSessionManager.js +5 -2
- package/dist/dialects/TransactionSessionManager.js.map +1 -1
- package/dist/dialects/mysql/MySqlDataSource.d.ts.map +1 -1
- package/dist/dialects/mysql/MySqlDataSource.js +3 -0
- package/dist/dialects/mysql/MySqlDataSource.js.map +1 -1
- package/dist/dialects/mysql/MySqlDriver.d.ts.map +1 -1
- package/dist/dialects/mysql/MySqlDriver.js +11 -3
- package/dist/dialects/mysql/MySqlDriver.js.map +1 -1
- package/dist/dialects/postgres/PostgresDataSource.d.ts.map +1 -1
- package/dist/dialects/postgres/PostgresDataSource.js +3 -0
- package/dist/dialects/postgres/PostgresDataSource.js.map +1 -1
- package/dist/dialects/postgres/PostgresDriver.d.ts.map +1 -1
- package/dist/dialects/postgres/PostgresDriver.js +6 -0
- package/dist/dialects/postgres/PostgresDriver.js.map +1 -1
- package/dist/dialects/sqlite/SqliteDataSource.d.ts.map +1 -1
- package/dist/dialects/sqlite/SqliteDataSource.js +3 -0
- package/dist/dialects/sqlite/SqliteDataSource.js.map +1 -1
- package/dist/dialects/sqlite/SqliteDriver.d.ts.map +1 -1
- package/dist/dialects/sqlite/SqliteDriver.js +5 -0
- package/dist/dialects/sqlite/SqliteDriver.js.map +1 -1
- package/dist/errors/DatabaseConnectionFailedError.d.ts +2 -1
- package/dist/errors/DatabaseConnectionFailedError.d.ts.map +1 -1
- package/dist/errors/DatabaseConnectionFailedError.js +12 -2
- package/dist/errors/DatabaseConnectionFailedError.js.map +1 -1
- package/dist/errors/OptimisticLockError.d.ts +5 -0
- package/dist/errors/OptimisticLockError.d.ts.map +1 -0
- package/dist/errors/OptimisticLockError.js +14 -0
- package/dist/errors/OptimisticLockError.js.map +1 -0
- package/dist/errors/OrmErrorCode.d.ts +3 -1
- package/dist/errors/OrmErrorCode.d.ts.map +1 -1
- package/dist/errors/OrmErrorCode.js +2 -0
- package/dist/errors/OrmErrorCode.js.map +1 -1
- package/dist/errors/index.d.ts +1 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +1 -0
- package/dist/errors/index.js.map +1 -1
- package/dist/metadata/MetadataContext.d.ts.map +1 -1
- package/dist/metadata/MetadataContext.js +3 -1
- package/dist/metadata/MetadataContext.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/validateSavepointName.d.ts +2 -0
- package/dist/utils/validateSavepointName.d.ts.map +1 -0
- package/dist/utils/validateSavepointName.js +12 -0
- package/dist/utils/validateSavepointName.js.map +1 -0
- 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
|
|
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;
|
|
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.
|
|
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
|
-
|
|
33
|
+
const entry = {
|
|
26
34
|
entityName,
|
|
27
35
|
sql: sqlText,
|
|
28
36
|
durationMs,
|
|
29
37
|
timestamp: now,
|
|
30
|
-
}
|
|
31
|
-
if (this.
|
|
32
|
-
this.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
84
|
-
|
|
118
|
+
if (removeCount > 0) {
|
|
119
|
+
this.unboundedLog.splice(0, removeCount);
|
|
85
120
|
}
|
|
86
121
|
}
|
|
87
|
-
|
|
88
|
-
this.
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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":";;;AAAA,4CAAyC;AAwDzC,MAAa,YAAY;
|
|
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"}
|