@proteinjs/db 1.28.1 → 1.29.1
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/CHANGELOG.md +22 -0
- package/LICENSE +21 -0
- package/dist/generated/index.js +1 -1
- package/dist/generated/index.js.map +1 -1
- package/dist/generated/test/index.js +3 -3
- package/dist/generated/test/index.js.map +1 -1
- package/dist/src/Db.d.ts +9 -0
- package/dist/src/Db.d.ts.map +1 -1
- package/dist/src/Db.js +99 -30
- package/dist/src/Db.js.map +1 -1
- package/dist/src/Table.d.ts +6 -0
- package/dist/src/Table.d.ts.map +1 -1
- package/dist/src/Table.js +5 -0
- package/dist/src/Table.js.map +1 -1
- package/dist/src/schema/TableManager.js +1 -1
- package/dist/src/schema/TableManager.js.map +1 -1
- package/dist/test/index.d.ts +1 -0
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +1 -0
- package/dist/test/index.js.map +1 -1
- package/dist/test/reusable/PreloadReferencesTests.d.ts +10 -0
- package/dist/test/reusable/PreloadReferencesTests.d.ts.map +1 -0
- package/dist/test/reusable/PreloadReferencesTests.js +241 -0
- package/dist/test/reusable/PreloadReferencesTests.js.map +1 -0
- package/generated/index.ts +15 -18
- package/generated/test/index.ts +40 -43
- package/package.json +3 -2
- package/src/Db.ts +66 -4
- package/src/Table.ts +6 -1
- package/src/schema/TableManager.ts +1 -1
- package/test/index.ts +1 -0
- package/test/reusable/PreloadReferencesTests.ts +126 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.preloadReferencesTests = void 0;
|
|
40
|
+
var db_1 = require("@proteinjs/db");
|
|
41
|
+
var DbTestEnvironment_1 = require("../util/DbTestEnvironment");
|
|
42
|
+
var dynamicReferenceColumnTestTables_1 = require("../util/tables/dynamicReferenceColumnTestTables");
|
|
43
|
+
var cascadeDeleteTestTables_1 = require("../util/tables/cascadeDeleteTestTables");
|
|
44
|
+
/**
|
|
45
|
+
* Preload behavior tests: `preloadReferences` must hydrate every reference in the result set
|
|
46
|
+
* with ONE query per referenced table — batching is the point of the option (a 30-row window
|
|
47
|
+
* preloaded per-row is 30 serialized point reads). The assertions count driver round trips,
|
|
48
|
+
* the outcome that keeps preload cheap, and then verify hydration is complete (no further
|
|
49
|
+
* round trips to read every referenced object).
|
|
50
|
+
*/
|
|
51
|
+
var preloadReferencesTests = function (driver, dropTable) {
|
|
52
|
+
return function () {
|
|
53
|
+
// Counting proxy: every runQuery through the driver increments `queryCount`. Db reads
|
|
54
|
+
// nothing else off the driver during query execution that matters here; everything not
|
|
55
|
+
// overridden delegates to the real driver via the prototype chain.
|
|
56
|
+
var queryCount = 0;
|
|
57
|
+
var countingDriver = Object.create(driver, {
|
|
58
|
+
runQuery: {
|
|
59
|
+
value: function () {
|
|
60
|
+
var args = [];
|
|
61
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
62
|
+
args[_i] = arguments[_i];
|
|
63
|
+
}
|
|
64
|
+
queryCount++;
|
|
65
|
+
return driver.runQuery.apply(driver, args);
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
var db = new db_1.Db(countingDriver);
|
|
70
|
+
var testEnv = new DbTestEnvironment_1.DbTestEnvironment(driver, dropTable);
|
|
71
|
+
beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
72
|
+
switch (_a.label) {
|
|
73
|
+
case 0: return [4 /*yield*/, testEnv.beforeAll()];
|
|
74
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
75
|
+
}
|
|
76
|
+
}); }); }, 30000);
|
|
77
|
+
afterAll(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
78
|
+
switch (_a.label) {
|
|
79
|
+
case 0: return [4 /*yield*/, testEnv.afterAll()];
|
|
80
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
81
|
+
}
|
|
82
|
+
}); }); }, 30000);
|
|
83
|
+
test('preload hydrates dynamic references with one query per referenced table', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
84
|
+
var engineerA, engineerB, designer, employees, employeeTables, i, qb, assignments, queriesDuringPreload, names;
|
|
85
|
+
return __generator(this, function (_a) {
|
|
86
|
+
switch (_a.label) {
|
|
87
|
+
case 0: return [4 /*yield*/, db.insert(dynamicReferenceColumnTestTables_1.dynamicReferenceTestTables.Engineer, {
|
|
88
|
+
name: 'preload-batch engineer A',
|
|
89
|
+
yearsOfExperience: 3,
|
|
90
|
+
})];
|
|
91
|
+
case 1:
|
|
92
|
+
engineerA = _a.sent();
|
|
93
|
+
return [4 /*yield*/, db.insert(dynamicReferenceColumnTestTables_1.dynamicReferenceTestTables.Engineer, {
|
|
94
|
+
name: 'preload-batch engineer B',
|
|
95
|
+
yearsOfExperience: 7,
|
|
96
|
+
})];
|
|
97
|
+
case 2:
|
|
98
|
+
engineerB = _a.sent();
|
|
99
|
+
return [4 /*yield*/, db.insert(dynamicReferenceColumnTestTables_1.dynamicReferenceTestTables.Designer, {
|
|
100
|
+
name: 'preload-batch designer',
|
|
101
|
+
specialization: 'Motion',
|
|
102
|
+
})];
|
|
103
|
+
case 3:
|
|
104
|
+
designer = _a.sent();
|
|
105
|
+
employees = [engineerA, engineerB, designer];
|
|
106
|
+
employeeTables = [
|
|
107
|
+
dynamicReferenceColumnTestTables_1.dynamicReferenceTestTables.Engineer.name,
|
|
108
|
+
dynamicReferenceColumnTestTables_1.dynamicReferenceTestTables.Engineer.name,
|
|
109
|
+
dynamicReferenceColumnTestTables_1.dynamicReferenceTestTables.Designer.name,
|
|
110
|
+
];
|
|
111
|
+
i = 0;
|
|
112
|
+
_a.label = 4;
|
|
113
|
+
case 4:
|
|
114
|
+
if (!(i < employees.length)) return [3 /*break*/, 7];
|
|
115
|
+
return [4 /*yield*/, db.insert(dynamicReferenceColumnTestTables_1.dynamicReferenceTestTables.ProjectAssignment, {
|
|
116
|
+
projectName: "preload-batch project ".concat(i),
|
|
117
|
+
employeeRef: new db_1.Reference(employeeTables[i], employees[i].id),
|
|
118
|
+
startDate: '2026-01-01',
|
|
119
|
+
})];
|
|
120
|
+
case 5:
|
|
121
|
+
_a.sent();
|
|
122
|
+
_a.label = 6;
|
|
123
|
+
case 6:
|
|
124
|
+
i++;
|
|
125
|
+
return [3 /*break*/, 4];
|
|
126
|
+
case 7:
|
|
127
|
+
qb = new db_1.QueryBuilderFactory()
|
|
128
|
+
.getQueryBuilder(dynamicReferenceColumnTestTables_1.dynamicReferenceTestTables.ProjectAssignment)
|
|
129
|
+
.condition({ field: 'projectName', operator: 'LIKE', value: 'preload-batch project %' });
|
|
130
|
+
queryCount = 0;
|
|
131
|
+
return [4 /*yield*/, db.query(dynamicReferenceColumnTestTables_1.dynamicReferenceTestTables.ProjectAssignment, qb, {
|
|
132
|
+
preloadReferences: { enabled: true, includeColumns: ['employeeRef'] },
|
|
133
|
+
})];
|
|
134
|
+
case 8:
|
|
135
|
+
assignments = _a.sent();
|
|
136
|
+
queriesDuringPreload = queryCount;
|
|
137
|
+
expect(assignments.length).toBe(3);
|
|
138
|
+
// Hydration must be complete: every referenced object readable with ZERO further round trips.
|
|
139
|
+
queryCount = 0;
|
|
140
|
+
return [4 /*yield*/, Promise.all(assignments.map(function (assignment) { return assignment.employeeRef.get(); }))];
|
|
141
|
+
case 9:
|
|
142
|
+
names = (_a.sent())
|
|
143
|
+
.map(function (employee) { return employee.name; })
|
|
144
|
+
.sort();
|
|
145
|
+
expect(names).toEqual(['preload-batch designer', 'preload-batch engineer A', 'preload-batch engineer B']);
|
|
146
|
+
expect(queryCount).toBe(0);
|
|
147
|
+
// One round trip for the assignments window, then one per referenced table
|
|
148
|
+
// (engineers, designers) — never one per row.
|
|
149
|
+
expect(queriesDuringPreload).toBe(3);
|
|
150
|
+
return [2 /*return*/];
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}); });
|
|
154
|
+
test('preload hydrates reference arrays with one query per referenced table', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
155
|
+
var memberIds, g, ids, m, member, g, qb, groups, queriesDuringPreload, g, members;
|
|
156
|
+
return __generator(this, function (_a) {
|
|
157
|
+
switch (_a.label) {
|
|
158
|
+
case 0:
|
|
159
|
+
memberIds = [];
|
|
160
|
+
g = 0;
|
|
161
|
+
_a.label = 1;
|
|
162
|
+
case 1:
|
|
163
|
+
if (!(g < 2)) return [3 /*break*/, 7];
|
|
164
|
+
ids = [];
|
|
165
|
+
m = 0;
|
|
166
|
+
_a.label = 2;
|
|
167
|
+
case 2:
|
|
168
|
+
if (!(m < 2)) return [3 /*break*/, 5];
|
|
169
|
+
return [4 /*yield*/, db.insert(cascadeDeleteTestTables_1.cascadeDeleteTestTables.MemberArr, {
|
|
170
|
+
name: "preload-arr member ".concat(g, ".").concat(m),
|
|
171
|
+
})];
|
|
172
|
+
case 3:
|
|
173
|
+
member = _a.sent();
|
|
174
|
+
ids.push(member.id);
|
|
175
|
+
_a.label = 4;
|
|
176
|
+
case 4:
|
|
177
|
+
m++;
|
|
178
|
+
return [3 /*break*/, 2];
|
|
179
|
+
case 5:
|
|
180
|
+
memberIds.push(ids);
|
|
181
|
+
_a.label = 6;
|
|
182
|
+
case 6:
|
|
183
|
+
g++;
|
|
184
|
+
return [3 /*break*/, 1];
|
|
185
|
+
case 7:
|
|
186
|
+
g = 0;
|
|
187
|
+
_a.label = 8;
|
|
188
|
+
case 8:
|
|
189
|
+
if (!(g < 2)) return [3 /*break*/, 11];
|
|
190
|
+
return [4 /*yield*/, db.insert(cascadeDeleteTestTables_1.cascadeDeleteTestTables.GroupArr, {
|
|
191
|
+
groupName: "preload-arr group ".concat(g),
|
|
192
|
+
memberRefs: new db_1.ReferenceArray(cascadeDeleteTestTables_1.cascadeDeleteTestTables.MemberArr.name, memberIds[g]),
|
|
193
|
+
})];
|
|
194
|
+
case 9:
|
|
195
|
+
_a.sent();
|
|
196
|
+
_a.label = 10;
|
|
197
|
+
case 10:
|
|
198
|
+
g++;
|
|
199
|
+
return [3 /*break*/, 8];
|
|
200
|
+
case 11:
|
|
201
|
+
qb = new db_1.QueryBuilderFactory()
|
|
202
|
+
.getQueryBuilder(cascadeDeleteTestTables_1.cascadeDeleteTestTables.GroupArr)
|
|
203
|
+
.condition({ field: 'groupName', operator: 'LIKE', value: 'preload-arr group %' })
|
|
204
|
+
.sort([{ field: 'groupName', desc: false }]);
|
|
205
|
+
queryCount = 0;
|
|
206
|
+
return [4 /*yield*/, db.query(cascadeDeleteTestTables_1.cascadeDeleteTestTables.GroupArr, qb, {
|
|
207
|
+
preloadReferences: { enabled: true },
|
|
208
|
+
})];
|
|
209
|
+
case 12:
|
|
210
|
+
groups = _a.sent();
|
|
211
|
+
queriesDuringPreload = queryCount;
|
|
212
|
+
expect(groups.length).toBe(2);
|
|
213
|
+
// Hydration must be complete AND ordered per each array's _ids, with zero further round trips.
|
|
214
|
+
queryCount = 0;
|
|
215
|
+
g = 0;
|
|
216
|
+
_a.label = 13;
|
|
217
|
+
case 13:
|
|
218
|
+
if (!(g < 2)) return [3 /*break*/, 16];
|
|
219
|
+
return [4 /*yield*/, groups[g].memberRefs.get()];
|
|
220
|
+
case 14:
|
|
221
|
+
members = _a.sent();
|
|
222
|
+
expect(members.map(function (member) { return member.name; })).toEqual([
|
|
223
|
+
"preload-arr member ".concat(g, ".0"),
|
|
224
|
+
"preload-arr member ".concat(g, ".1"),
|
|
225
|
+
]);
|
|
226
|
+
_a.label = 15;
|
|
227
|
+
case 15:
|
|
228
|
+
g++;
|
|
229
|
+
return [3 /*break*/, 13];
|
|
230
|
+
case 16:
|
|
231
|
+
expect(queryCount).toBe(0);
|
|
232
|
+
// One round trip for the groups, one for ALL members across both arrays.
|
|
233
|
+
expect(queriesDuringPreload).toBe(2);
|
|
234
|
+
return [2 /*return*/];
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
}); });
|
|
238
|
+
};
|
|
239
|
+
};
|
|
240
|
+
exports.preloadReferencesTests = preloadReferencesTests;
|
|
241
|
+
//# sourceMappingURL=PreloadReferencesTests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreloadReferencesTests.js","sourceRoot":"","sources":["../../../test/reusable/PreloadReferencesTests.ts"],"names":[],"mappings":"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"}
|