@proteinjs/db 1.29.3 → 1.31.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/CHANGELOG.md +23 -0
- package/dist/generated/index.js +1 -1
- package/dist/generated/index.js.map +1 -1
- package/dist/generated/test/index.d.ts.map +1 -1
- package/dist/generated/test/index.js +3 -1
- package/dist/generated/test/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/src/CursorWindowPager.d.ts +74 -0
- package/dist/src/CursorWindowPager.d.ts.map +1 -0
- package/dist/src/CursorWindowPager.js +178 -0
- package/dist/src/CursorWindowPager.js.map +1 -0
- package/dist/src/Db.d.ts +10 -0
- package/dist/src/Db.d.ts.map +1 -1
- package/dist/src/Db.js +10 -0
- package/dist/src/Db.js.map +1 -1
- package/dist/src/MigrationRunner.d.ts +68 -0
- package/dist/src/MigrationRunner.d.ts.map +1 -1
- package/dist/src/MigrationRunner.js +153 -7
- package/dist/src/MigrationRunner.js.map +1 -1
- package/dist/src/RecordIterator.d.ts +16 -6
- package/dist/src/RecordIterator.d.ts.map +1 -1
- package/dist/src/RecordIterator.js +50 -37
- package/dist/src/RecordIterator.js.map +1 -1
- package/dist/src/tables/MigrationTable.d.ts +10 -0
- package/dist/src/tables/MigrationTable.d.ts.map +1 -1
- package/dist/src/tables/MigrationTable.js +1 -0
- package/dist/src/tables/MigrationTable.js.map +1 -1
- package/dist/test/CursorWindowPager.test.d.ts +2 -0
- package/dist/test/CursorWindowPager.test.d.ts.map +1 -0
- package/dist/test/CursorWindowPager.test.js +213 -0
- package/dist/test/CursorWindowPager.test.js.map +1 -0
- package/dist/test/index.d.ts +2 -0
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +2 -0
- package/dist/test/index.js.map +1 -1
- package/dist/test/reusable/RecordIteratorTests.d.ts +13 -0
- package/dist/test/reusable/RecordIteratorTests.d.ts.map +1 -0
- package/dist/test/reusable/RecordIteratorTests.js +448 -0
- package/dist/test/reusable/RecordIteratorTests.js.map +1 -0
- package/dist/test/util/DbTestEnvironment.d.ts.map +1 -1
- package/dist/test/util/DbTestEnvironment.js +2 -1
- package/dist/test/util/DbTestEnvironment.js.map +1 -1
- package/dist/test/util/tables/recordIteratorTestTables.d.ts +25 -0
- package/dist/test/util/tables/recordIteratorTestTables.d.ts.map +1 -0
- package/dist/test/util/tables/recordIteratorTestTables.js +38 -0
- package/dist/test/util/tables/recordIteratorTestTables.js.map +1 -0
- package/generated/index.ts +1 -1
- package/generated/test/index.ts +3 -1
- package/index.ts +1 -0
- package/package.json +3 -3
- package/src/CursorWindowPager.ts +153 -0
- package/src/Db.ts +10 -0
- package/src/MigrationRunner.ts +153 -7
- package/src/RecordIterator.ts +34 -24
- package/src/tables/MigrationTable.ts +11 -1
- package/test/CursorWindowPager.test.ts +185 -0
- package/test/index.ts +2 -0
- package/test/reusable/RecordIteratorTests.ts +190 -0
- package/test/util/DbTestEnvironment.ts +2 -0
- package/test/util/tables/recordIteratorTestTables.ts +23 -0
|
@@ -0,0 +1,448 @@
|
|
|
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
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
39
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
40
|
+
var m = o[Symbol.asyncIterator], i;
|
|
41
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
42
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
43
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
44
|
+
};
|
|
45
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
46
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
47
|
+
};
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.recordIteratorTests = void 0;
|
|
50
|
+
var moment_1 = __importDefault(require("moment"));
|
|
51
|
+
var db_1 = require("@proteinjs/db");
|
|
52
|
+
var DbTestEnvironment_1 = require("../util/DbTestEnvironment");
|
|
53
|
+
var recordIteratorTestTables_1 = require("../util/tables/recordIteratorTestTables");
|
|
54
|
+
/**
|
|
55
|
+
* RecordIterator's iteration contract under CONCURRENT WRITES — the offset-window drift class.
|
|
56
|
+
*
|
|
57
|
+
* Offset paging frames every window by position (`OFFSET n`), so a row deleted behind the
|
|
58
|
+
* iterator slides an unvisited row into the already-consumed range (SKIP), and a row inserted
|
|
59
|
+
* ahead of the consumed prefix slides a consumed row back into the next window (DUPLICATE).
|
|
60
|
+
* Cursor windows frame by the tail row's sort values instead, so concurrent writes can never
|
|
61
|
+
* shift the frame. These tests mutate the table exactly at a window boundary (window size 3,
|
|
62
|
+
* mutation after the 3rd yield) and assert the OUTCOME: every seeded row visited exactly once.
|
|
63
|
+
*/
|
|
64
|
+
var recordIteratorTests = function (driver, transactionContextFactory, dropTable) {
|
|
65
|
+
return function () {
|
|
66
|
+
var db = new db_1.Db(driver, undefined, transactionContextFactory);
|
|
67
|
+
var testEnv = new DbTestEnvironment_1.DbTestEnvironment(driver, dropTable);
|
|
68
|
+
var table = recordIteratorTestTables_1.recordIteratorTestTables.IterationRow;
|
|
69
|
+
var WINDOW = 3;
|
|
70
|
+
beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
71
|
+
switch (_a.label) {
|
|
72
|
+
case 0: return [4 /*yield*/, testEnv.beforeAll()];
|
|
73
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
74
|
+
}
|
|
75
|
+
}); }); }, 30000);
|
|
76
|
+
afterAll(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
77
|
+
switch (_a.label) {
|
|
78
|
+
case 0: return [4 /*yield*/, testEnv.afterAll()];
|
|
79
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
80
|
+
}
|
|
81
|
+
}); }); }, 30000);
|
|
82
|
+
beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
83
|
+
return __generator(this, function (_a) {
|
|
84
|
+
switch (_a.label) {
|
|
85
|
+
case 0: return [4 /*yield*/, db.delete(table, new db_1.QueryBuilderFactory().getQueryBuilder(table).condition({ field: 'id', operator: 'IS NOT NULL' }))];
|
|
86
|
+
case 1:
|
|
87
|
+
_a.sent();
|
|
88
|
+
return [2 /*return*/];
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}); });
|
|
92
|
+
/** Seed rows r01..rNN with seq 10, 20, 30, ... (gaps leave room to insert ahead of them). */
|
|
93
|
+
var seed = function (count) { return __awaiter(void 0, void 0, void 0, function () {
|
|
94
|
+
var rows, i, _a, _b;
|
|
95
|
+
return __generator(this, function (_c) {
|
|
96
|
+
switch (_c.label) {
|
|
97
|
+
case 0:
|
|
98
|
+
rows = [];
|
|
99
|
+
i = 1;
|
|
100
|
+
_c.label = 1;
|
|
101
|
+
case 1:
|
|
102
|
+
if (!(i <= count)) return [3 /*break*/, 4];
|
|
103
|
+
_b = (_a = rows).push;
|
|
104
|
+
return [4 /*yield*/, db.insert(table, { name: "r".concat(String(i).padStart(2, '0')), seq: i * 10 })];
|
|
105
|
+
case 2:
|
|
106
|
+
_b.apply(_a, [_c.sent()]);
|
|
107
|
+
_c.label = 3;
|
|
108
|
+
case 3:
|
|
109
|
+
i++;
|
|
110
|
+
return [3 /*break*/, 1];
|
|
111
|
+
case 4: return [2 /*return*/, rows];
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}); };
|
|
115
|
+
var seqAscQuery = function () {
|
|
116
|
+
return new db_1.QueryBuilderFactory()
|
|
117
|
+
.getQueryBuilder(table)
|
|
118
|
+
.sort([{ field: 'seq', desc: false }]);
|
|
119
|
+
};
|
|
120
|
+
/** Iterate, running `atWindowBoundary` right after the first window's last row is consumed. */
|
|
121
|
+
var iterateWithBoundaryMutation = function (query, atWindowBoundary) { return __awaiter(void 0, void 0, void 0, function () {
|
|
122
|
+
var iterator, visited, mutated, _a, iterator_1, iterator_1_1, row, e_1_1;
|
|
123
|
+
var _b, e_1, _c, _d;
|
|
124
|
+
return __generator(this, function (_e) {
|
|
125
|
+
switch (_e.label) {
|
|
126
|
+
case 0:
|
|
127
|
+
iterator = new db_1.RecordIterator(table, query, WINDOW, db);
|
|
128
|
+
visited = [];
|
|
129
|
+
mutated = false;
|
|
130
|
+
_e.label = 1;
|
|
131
|
+
case 1:
|
|
132
|
+
_e.trys.push([1, 7, 8, 13]);
|
|
133
|
+
_a = true, iterator_1 = __asyncValues(iterator);
|
|
134
|
+
_e.label = 2;
|
|
135
|
+
case 2: return [4 /*yield*/, iterator_1.next()];
|
|
136
|
+
case 3:
|
|
137
|
+
if (!(iterator_1_1 = _e.sent(), _b = iterator_1_1.done, !_b)) return [3 /*break*/, 6];
|
|
138
|
+
_d = iterator_1_1.value;
|
|
139
|
+
_a = false;
|
|
140
|
+
row = _d;
|
|
141
|
+
visited.push(row.name);
|
|
142
|
+
if (!(!mutated && visited.length === WINDOW)) return [3 /*break*/, 5];
|
|
143
|
+
mutated = true;
|
|
144
|
+
return [4 /*yield*/, atWindowBoundary()];
|
|
145
|
+
case 4:
|
|
146
|
+
_e.sent();
|
|
147
|
+
_e.label = 5;
|
|
148
|
+
case 5:
|
|
149
|
+
_a = true;
|
|
150
|
+
return [3 /*break*/, 2];
|
|
151
|
+
case 6: return [3 /*break*/, 13];
|
|
152
|
+
case 7:
|
|
153
|
+
e_1_1 = _e.sent();
|
|
154
|
+
e_1 = { error: e_1_1 };
|
|
155
|
+
return [3 /*break*/, 13];
|
|
156
|
+
case 8:
|
|
157
|
+
_e.trys.push([8, , 11, 12]);
|
|
158
|
+
if (!(!_a && !_b && (_c = iterator_1.return))) return [3 /*break*/, 10];
|
|
159
|
+
return [4 /*yield*/, _c.call(iterator_1)];
|
|
160
|
+
case 9:
|
|
161
|
+
_e.sent();
|
|
162
|
+
_e.label = 10;
|
|
163
|
+
case 10: return [3 /*break*/, 12];
|
|
164
|
+
case 11:
|
|
165
|
+
if (e_1) throw e_1.error;
|
|
166
|
+
return [7 /*endfinally*/];
|
|
167
|
+
case 12: return [7 /*endfinally*/];
|
|
168
|
+
case 13: return [2 /*return*/, visited];
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}); };
|
|
172
|
+
test('a row deleted behind the iterator never causes surviving rows to be skipped', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
173
|
+
var visited;
|
|
174
|
+
return __generator(this, function (_a) {
|
|
175
|
+
switch (_a.label) {
|
|
176
|
+
case 0: return [4 /*yield*/, seed(9)];
|
|
177
|
+
case 1:
|
|
178
|
+
_a.sent();
|
|
179
|
+
return [4 /*yield*/, iterateWithBoundaryMutation(seqAscQuery(), function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
180
|
+
var deleted;
|
|
181
|
+
return __generator(this, function (_a) {
|
|
182
|
+
switch (_a.label) {
|
|
183
|
+
case 0: return [4 /*yield*/, db.delete(table, { name: 'r01' })];
|
|
184
|
+
case 1:
|
|
185
|
+
deleted = _a.sent();
|
|
186
|
+
expect(deleted).toBe(1);
|
|
187
|
+
return [2 /*return*/];
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
}); })];
|
|
191
|
+
case 2:
|
|
192
|
+
visited = _a.sent();
|
|
193
|
+
expect(visited).toEqual(['r01', 'r02', 'r03', 'r04', 'r05', 'r06', 'r07', 'r08', 'r09']);
|
|
194
|
+
return [2 /*return*/];
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
}); });
|
|
198
|
+
test('a row inserted ahead of the consumed prefix never duplicates rows', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
199
|
+
var visited, seeded;
|
|
200
|
+
return __generator(this, function (_a) {
|
|
201
|
+
switch (_a.label) {
|
|
202
|
+
case 0: return [4 /*yield*/, seed(9)];
|
|
203
|
+
case 1:
|
|
204
|
+
_a.sent();
|
|
205
|
+
return [4 /*yield*/, iterateWithBoundaryMutation(seqAscQuery(), function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
206
|
+
return __generator(this, function (_a) {
|
|
207
|
+
switch (_a.label) {
|
|
208
|
+
case 0:
|
|
209
|
+
// Insert a row that sorts BEFORE every consumed row: under offset paging the set slides
|
|
210
|
+
// one position right, so the next `OFFSET 3` window re-serves the last consumed row.
|
|
211
|
+
return [4 /*yield*/, db.insert(table, { name: 'x-front', seq: 1 })];
|
|
212
|
+
case 1:
|
|
213
|
+
// Insert a row that sorts BEFORE every consumed row: under offset paging the set slides
|
|
214
|
+
// one position right, so the next `OFFSET 3` window re-serves the last consumed row.
|
|
215
|
+
_a.sent();
|
|
216
|
+
return [2 /*return*/];
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}); })];
|
|
220
|
+
case 2:
|
|
221
|
+
visited = _a.sent();
|
|
222
|
+
seeded = visited.filter(function (name) { return name !== 'x-front'; });
|
|
223
|
+
expect(seeded).toEqual(['r01', 'r02', 'r03', 'r04', 'r05', 'r06', 'r07', 'r08', 'r09']);
|
|
224
|
+
return [2 /*return*/];
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}); });
|
|
228
|
+
test('default iteration (no sort) is complete under a concurrent delete', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
229
|
+
var rows, idOrder, visited;
|
|
230
|
+
return __generator(this, function (_a) {
|
|
231
|
+
switch (_a.label) {
|
|
232
|
+
case 0: return [4 /*yield*/, seed(7)];
|
|
233
|
+
case 1:
|
|
234
|
+
rows = _a.sent();
|
|
235
|
+
idOrder = rows
|
|
236
|
+
.map(function (row) { return ({ id: row.id, name: row.name }); })
|
|
237
|
+
.sort(function (a, b) { return (a.id < b.id ? -1 : 1); })
|
|
238
|
+
.map(function (row) { return row.name; });
|
|
239
|
+
return [4 /*yield*/, iterateWithBoundaryMutation({}, function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
240
|
+
var deleted;
|
|
241
|
+
return __generator(this, function (_a) {
|
|
242
|
+
switch (_a.label) {
|
|
243
|
+
case 0: return [4 /*yield*/, db.delete(table, { name: idOrder[0] })];
|
|
244
|
+
case 1:
|
|
245
|
+
deleted = _a.sent();
|
|
246
|
+
expect(deleted).toBe(1);
|
|
247
|
+
return [2 /*return*/];
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
}); })];
|
|
251
|
+
case 2:
|
|
252
|
+
visited = _a.sent();
|
|
253
|
+
expect(visited).toEqual(idOrder);
|
|
254
|
+
return [2 /*return*/];
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
}); });
|
|
258
|
+
test('tied sort values across a window boundary are all visited exactly once', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
259
|
+
var t1, t2, stamps, i, query, iterator, visited, _a, iterator_2, iterator_2_1, row, e_2_1, t1Names;
|
|
260
|
+
var _b, e_2, _c, _d;
|
|
261
|
+
return __generator(this, function (_e) {
|
|
262
|
+
switch (_e.label) {
|
|
263
|
+
case 0:
|
|
264
|
+
t1 = (0, moment_1.default)('2026-08-10T12:00:00.000Z');
|
|
265
|
+
t2 = (0, moment_1.default)('2026-08-09T12:00:00.000Z');
|
|
266
|
+
stamps = [t1, t1, t1, t1, t2, t2];
|
|
267
|
+
i = 0;
|
|
268
|
+
_e.label = 1;
|
|
269
|
+
case 1:
|
|
270
|
+
if (!(i < stamps.length)) return [3 /*break*/, 4];
|
|
271
|
+
return [4 /*yield*/, db.insert(table, {
|
|
272
|
+
name: "s".concat(String(i + 1).padStart(2, '0')),
|
|
273
|
+
stampedAt: stamps[i],
|
|
274
|
+
})];
|
|
275
|
+
case 2:
|
|
276
|
+
_e.sent();
|
|
277
|
+
_e.label = 3;
|
|
278
|
+
case 3:
|
|
279
|
+
i++;
|
|
280
|
+
return [3 /*break*/, 1];
|
|
281
|
+
case 4:
|
|
282
|
+
query = new db_1.QueryBuilderFactory()
|
|
283
|
+
.getQueryBuilder(table)
|
|
284
|
+
.sort([{ field: 'stampedAt', desc: true }]);
|
|
285
|
+
iterator = new db_1.RecordIterator(table, query, WINDOW, db);
|
|
286
|
+
visited = [];
|
|
287
|
+
_e.label = 5;
|
|
288
|
+
case 5:
|
|
289
|
+
_e.trys.push([5, 10, 11, 16]);
|
|
290
|
+
_a = true, iterator_2 = __asyncValues(iterator);
|
|
291
|
+
_e.label = 6;
|
|
292
|
+
case 6: return [4 /*yield*/, iterator_2.next()];
|
|
293
|
+
case 7:
|
|
294
|
+
if (!(iterator_2_1 = _e.sent(), _b = iterator_2_1.done, !_b)) return [3 /*break*/, 9];
|
|
295
|
+
_d = iterator_2_1.value;
|
|
296
|
+
_a = false;
|
|
297
|
+
row = _d;
|
|
298
|
+
visited.push({ name: row.name, stampedAt: row.stampedAt });
|
|
299
|
+
_e.label = 8;
|
|
300
|
+
case 8:
|
|
301
|
+
_a = true;
|
|
302
|
+
return [3 /*break*/, 6];
|
|
303
|
+
case 9: return [3 /*break*/, 16];
|
|
304
|
+
case 10:
|
|
305
|
+
e_2_1 = _e.sent();
|
|
306
|
+
e_2 = { error: e_2_1 };
|
|
307
|
+
return [3 /*break*/, 16];
|
|
308
|
+
case 11:
|
|
309
|
+
_e.trys.push([11, , 14, 15]);
|
|
310
|
+
if (!(!_a && !_b && (_c = iterator_2.return))) return [3 /*break*/, 13];
|
|
311
|
+
return [4 /*yield*/, _c.call(iterator_2)];
|
|
312
|
+
case 12:
|
|
313
|
+
_e.sent();
|
|
314
|
+
_e.label = 13;
|
|
315
|
+
case 13: return [3 /*break*/, 15];
|
|
316
|
+
case 14:
|
|
317
|
+
if (e_2) throw e_2.error;
|
|
318
|
+
return [7 /*endfinally*/];
|
|
319
|
+
case 15: return [7 /*endfinally*/];
|
|
320
|
+
case 16:
|
|
321
|
+
expect(visited.map(function (v) { return v.name; }).sort()).toEqual(['s01', 's02', 's03', 's04', 's05', 's06']);
|
|
322
|
+
t1Names = visited.slice(0, 4).map(function (v) { return (0, moment_1.default)(v.stampedAt).toISOString(); });
|
|
323
|
+
expect(t1Names).toEqual(Array(4).fill(t1.toISOString()));
|
|
324
|
+
return [2 /*return*/];
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
}); });
|
|
328
|
+
test('consumed rows are never re-served when id order opposes the sort order (equals-guarded continuation)', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
329
|
+
var i, iterator, visited, _a, iterator_3, iterator_3_1, row, e_3_1;
|
|
330
|
+
var _b, e_3, _c, _d;
|
|
331
|
+
return __generator(this, function (_e) {
|
|
332
|
+
switch (_e.label) {
|
|
333
|
+
case 0:
|
|
334
|
+
i = 6;
|
|
335
|
+
_e.label = 1;
|
|
336
|
+
case 1:
|
|
337
|
+
if (!(i >= 1)) return [3 /*break*/, 4];
|
|
338
|
+
return [4 /*yield*/, db.insert(table, { name: "v".concat(String(i).padStart(2, '0')), seq: i * 10 })];
|
|
339
|
+
case 2:
|
|
340
|
+
_e.sent();
|
|
341
|
+
_e.label = 3;
|
|
342
|
+
case 3:
|
|
343
|
+
i--;
|
|
344
|
+
return [3 /*break*/, 1];
|
|
345
|
+
case 4:
|
|
346
|
+
iterator = new db_1.RecordIterator(table, seqAscQuery(), WINDOW, db);
|
|
347
|
+
visited = [];
|
|
348
|
+
_e.label = 5;
|
|
349
|
+
case 5:
|
|
350
|
+
_e.trys.push([5, 10, 11, 16]);
|
|
351
|
+
_a = true, iterator_3 = __asyncValues(iterator);
|
|
352
|
+
_e.label = 6;
|
|
353
|
+
case 6: return [4 /*yield*/, iterator_3.next()];
|
|
354
|
+
case 7:
|
|
355
|
+
if (!(iterator_3_1 = _e.sent(), _b = iterator_3_1.done, !_b)) return [3 /*break*/, 9];
|
|
356
|
+
_d = iterator_3_1.value;
|
|
357
|
+
_a = false;
|
|
358
|
+
row = _d;
|
|
359
|
+
visited.push(row.name);
|
|
360
|
+
if (visited.length > 12) {
|
|
361
|
+
return [3 /*break*/, 9]; // a re-anchoring loop never terminates on its own — cap it and let the assert convict
|
|
362
|
+
}
|
|
363
|
+
_e.label = 8;
|
|
364
|
+
case 8:
|
|
365
|
+
_a = true;
|
|
366
|
+
return [3 /*break*/, 6];
|
|
367
|
+
case 9: return [3 /*break*/, 16];
|
|
368
|
+
case 10:
|
|
369
|
+
e_3_1 = _e.sent();
|
|
370
|
+
e_3 = { error: e_3_1 };
|
|
371
|
+
return [3 /*break*/, 16];
|
|
372
|
+
case 11:
|
|
373
|
+
_e.trys.push([11, , 14, 15]);
|
|
374
|
+
if (!(!_a && !_b && (_c = iterator_3.return))) return [3 /*break*/, 13];
|
|
375
|
+
return [4 /*yield*/, _c.call(iterator_3)];
|
|
376
|
+
case 12:
|
|
377
|
+
_e.sent();
|
|
378
|
+
_e.label = 13;
|
|
379
|
+
case 13: return [3 /*break*/, 15];
|
|
380
|
+
case 14:
|
|
381
|
+
if (e_3) throw e_3.error;
|
|
382
|
+
return [7 /*endfinally*/];
|
|
383
|
+
case 15: return [7 /*endfinally*/];
|
|
384
|
+
case 16:
|
|
385
|
+
expect(visited).toEqual(['v01', 'v02', 'v03', 'v04', 'v05', 'v06']);
|
|
386
|
+
return [2 /*return*/];
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
}); });
|
|
390
|
+
test('iteration never mutates the caller query builder', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
391
|
+
var qb, nodesBefore, iterator, visited, _a, iterator_4, iterator_4_1, row, e_4_1;
|
|
392
|
+
var _b, e_4, _c, _d;
|
|
393
|
+
return __generator(this, function (_e) {
|
|
394
|
+
switch (_e.label) {
|
|
395
|
+
case 0: return [4 /*yield*/, seed(4)];
|
|
396
|
+
case 1:
|
|
397
|
+
_e.sent();
|
|
398
|
+
qb = seqAscQuery();
|
|
399
|
+
nodesBefore = qb.graph.nodes().length;
|
|
400
|
+
iterator = new db_1.RecordIterator(table, qb, WINDOW, db);
|
|
401
|
+
visited = [];
|
|
402
|
+
_e.label = 2;
|
|
403
|
+
case 2:
|
|
404
|
+
_e.trys.push([2, 7, 8, 13]);
|
|
405
|
+
_a = true, iterator_4 = __asyncValues(iterator);
|
|
406
|
+
_e.label = 3;
|
|
407
|
+
case 3: return [4 /*yield*/, iterator_4.next()];
|
|
408
|
+
case 4:
|
|
409
|
+
if (!(iterator_4_1 = _e.sent(), _b = iterator_4_1.done, !_b)) return [3 /*break*/, 6];
|
|
410
|
+
_d = iterator_4_1.value;
|
|
411
|
+
_a = false;
|
|
412
|
+
row = _d;
|
|
413
|
+
visited.push(row.name);
|
|
414
|
+
_e.label = 5;
|
|
415
|
+
case 5:
|
|
416
|
+
_a = true;
|
|
417
|
+
return [3 /*break*/, 3];
|
|
418
|
+
case 6: return [3 /*break*/, 13];
|
|
419
|
+
case 7:
|
|
420
|
+
e_4_1 = _e.sent();
|
|
421
|
+
e_4 = { error: e_4_1 };
|
|
422
|
+
return [3 /*break*/, 13];
|
|
423
|
+
case 8:
|
|
424
|
+
_e.trys.push([8, , 11, 12]);
|
|
425
|
+
if (!(!_a && !_b && (_c = iterator_4.return))) return [3 /*break*/, 10];
|
|
426
|
+
return [4 /*yield*/, _c.call(iterator_4)];
|
|
427
|
+
case 9:
|
|
428
|
+
_e.sent();
|
|
429
|
+
_e.label = 10;
|
|
430
|
+
case 10: return [3 /*break*/, 12];
|
|
431
|
+
case 11:
|
|
432
|
+
if (e_4) throw e_4.error;
|
|
433
|
+
return [7 /*endfinally*/];
|
|
434
|
+
case 12: return [7 /*endfinally*/];
|
|
435
|
+
case 13:
|
|
436
|
+
expect(visited).toHaveLength(4);
|
|
437
|
+
// The old implementation paginated the CALLER's builder (and re-ran column-query
|
|
438
|
+
// injection into it every page); iteration must build windows on fresh copies instead.
|
|
439
|
+
expect(qb.graph.nodes().length).toBe(nodesBefore);
|
|
440
|
+
expect(qb.paginationNodeId).toBeUndefined();
|
|
441
|
+
return [2 /*return*/];
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
}); });
|
|
445
|
+
};
|
|
446
|
+
};
|
|
447
|
+
exports.recordIteratorTests = recordIteratorTests;
|
|
448
|
+
//# sourceMappingURL=RecordIteratorTests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordIteratorTests.js","sourceRoot":"","sources":["../../../test/reusable/RecordIteratorTests.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DbTestEnvironment.d.ts","sourceRoot":"","sources":["../../../test/util/DbTestEnvironment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"DbTestEnvironment.d.ts","sourceRoot":"","sources":["../../../test/util/DbTestEnvironment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAoBhD;;GAEG;AACH,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;gBADb,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC;IAGvD,SAAS;IAaT,QAAQ;CAUf"}
|
|
@@ -51,9 +51,10 @@ var cascadeDeleteTestTables_1 = require("./tables/cascadeDeleteTestTables");
|
|
|
51
51
|
var columnTypesTestTables_1 = require("./tables/columnTypesTestTables");
|
|
52
52
|
var crudTestTables_1 = require("./tables/crudTestTables");
|
|
53
53
|
var dynamicReferenceColumnTestTables_1 = require("./tables/dynamicReferenceColumnTestTables");
|
|
54
|
+
var recordIteratorTestTables_1 = require("./tables/recordIteratorTestTables");
|
|
54
55
|
var tableManagerTestTables_1 = require("./tables/tableManagerTestTables");
|
|
55
56
|
var transactionTestTables_1 = require("./tables/transactionTestTables");
|
|
56
|
-
var TABLES = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], Object.values(cascadeDeleteTestTables_1.cascadeDeleteTestTables), true), Object.values(columnTypesTestTables_1.columnTypesTestTables), true), Object.values(crudTestTables_1.crudTestTables), true), Object.values(dynamicReferenceColumnTestTables_1.dynamicReferenceTestTables), true), Object.values(tableManagerTestTables_1.tableManagerTestTables), true), Object.values(transactionTestTables_1.transactionTestTables), true);
|
|
57
|
+
var TABLES = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], Object.values(cascadeDeleteTestTables_1.cascadeDeleteTestTables), true), Object.values(columnTypesTestTables_1.columnTypesTestTables), true), Object.values(crudTestTables_1.crudTestTables), true), Object.values(dynamicReferenceColumnTestTables_1.dynamicReferenceTestTables), true), Object.values(recordIteratorTestTables_1.recordIteratorTestTables), true), Object.values(tableManagerTestTables_1.tableManagerTestTables), true), Object.values(transactionTestTables_1.transactionTestTables), true);
|
|
57
58
|
/**
|
|
58
59
|
* Convenience functions for setting up a test environment
|
|
59
60
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DbTestEnvironment.js","sourceRoot":"","sources":["../../../test/util/DbTestEnvironment.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,uCAA6D;AAC7D,4EAA2E;AAC3E,wEAAuE;AACvE,0DAAyD;AACzD,8FAAuF;AACvF,0EAAyE;AACzE,wEAAuE;AAEvE,IAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"DbTestEnvironment.js","sourceRoot":"","sources":["../../../test/util/DbTestEnvironment.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,uCAA6D;AAC7D,4EAA2E;AAC3E,wEAAuE;AACvE,0DAAyD;AACzD,8FAAuF;AACvF,8EAA6E;AAC7E,0EAAyE;AACzE,wEAAuE;AAEvE,IAAM,MAAM,yGACP,MAAM,CAAC,MAAM,CAAC,iDAAuB,CAAC,SACtC,MAAM,CAAC,MAAM,CAAC,6CAAqB,CAAC,SACpC,MAAM,CAAC,MAAM,CAAC,+BAAc,CAAC,SAC7B,MAAM,CAAC,MAAM,CAAC,6DAA0B,CAAC,SACzC,MAAM,CAAC,MAAM,CAAC,mDAAwB,CAAC,SACvC,MAAM,CAAC,MAAM,CAAC,+CAAsB,CAAC,SACrC,MAAM,CAAC,MAAM,CAAC,6CAAqB,CAAC,OACxC,CAAC;AAEF;;GAEG;AACH;IACE,2BACU,QAAkB,EAClB,aAAmD;QADnD,aAAQ,GAAR,QAAQ,CAAU;QAClB,kBAAa,GAAb,aAAa,CAAsC;IAC1D,CAAC;IAEE,qCAAS,GAAf;;;;;;wBACE,yFAAyF;wBACzF,+CAA+C;wBAC/C,IAAA,2BAAgB,GAAE,CAAC;6BACf,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAnB,wBAAmB;wBACrB,qBAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAA;;wBAA3B,SAA2B,CAAC;;;8BAGJ,EAAN,iBAAM;;;6BAAN,CAAA,oBAAM,CAAA;wBAAf,KAAK;wBACd,qBAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAA;;wBAAtD,SAAsD,CAAC;;;wBADrC,IAAM,CAAA;;;;;;KAG3B;IAEK,oCAAQ,GAAd;;;;;;wBACE,IAAA,wBAAa,GAAE,CAAC;8BACoB,EAAhB,KAAA,MAAM,CAAC,OAAO,EAAE;;;6BAAhB,CAAA,cAAgB,CAAA;wBAAzB,KAAK;wBACd,qBAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAA;;wBAA/B,SAA+B,CAAC;;;wBADd,IAAgB,CAAA;;;6BAIhC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAlB,wBAAkB;wBACpB,qBAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAA;;wBAA1B,SAA0B,CAAC;;;;;;KAE9B;IACH,wBAAC;AAAD,CAAC,AA7BD,IA6BC;AA7BY,8CAAiB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Moment } from 'moment';
|
|
2
|
+
import { Record, Table } from '@proteinjs/db';
|
|
3
|
+
export interface IterationRow extends Record {
|
|
4
|
+
name: string;
|
|
5
|
+
/** Deterministic integer sort axis (unique per row unless a test seeds ties). */
|
|
6
|
+
seq?: number | null;
|
|
7
|
+
/** Datetime sort axis for tie/round-trip coverage (values controlled by the tests). */
|
|
8
|
+
stampedAt?: Moment | null;
|
|
9
|
+
}
|
|
10
|
+
export declare class RecordIteratorTestTable extends Table<IterationRow> {
|
|
11
|
+
name: string;
|
|
12
|
+
columns: {
|
|
13
|
+
id: import("@proteinjs/db").Column<string, any>;
|
|
14
|
+
created: import("@proteinjs/db").Column<Moment, any>;
|
|
15
|
+
updated: import("@proteinjs/db").Column<Moment, any>;
|
|
16
|
+
} & {} & {
|
|
17
|
+
name: import("@proteinjs/db").Column<string, any>;
|
|
18
|
+
seq: import("@proteinjs/db").Column<number | null | undefined, any>;
|
|
19
|
+
stampedAt: import("@proteinjs/db").Column<Moment | null | undefined, any>;
|
|
20
|
+
} & {};
|
|
21
|
+
}
|
|
22
|
+
export declare const recordIteratorTestTables: {
|
|
23
|
+
IterationRow: Table<IterationRow>;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=recordIteratorTestTables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recordIteratorTestTables.d.ts","sourceRoot":"","sources":["../../../../test/util/tables/recordIteratorTestTables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAqB,MAAM,EAA+C,KAAK,EAAE,MAAM,eAAe,CAAC;AAE9G,MAAM,WAAW,YAAa,SAAQ,MAAM;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,qBAAa,uBAAwB,SAAQ,KAAK,CAAC,YAAY,CAAC;IAC9D,IAAI,SAA6B;IACjC,OAAO;;;;;;;;WAIJ;CACJ;AAED,eAAO,MAAM,wBAAwB;;CAEpC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
if (typeof b !== "function" && b !== null)
|
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
+
extendStatics(d, b);
|
|
13
|
+
function __() { this.constructor = d; }
|
|
14
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
+
};
|
|
16
|
+
})();
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.recordIteratorTestTables = exports.RecordIteratorTestTable = void 0;
|
|
19
|
+
var db_1 = require("@proteinjs/db");
|
|
20
|
+
var RecordIteratorTestTable = /** @class */ (function (_super) {
|
|
21
|
+
__extends(RecordIteratorTestTable, _super);
|
|
22
|
+
function RecordIteratorTestTable() {
|
|
23
|
+
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
24
|
+
_this.name = 'db_test_record_iterator';
|
|
25
|
+
_this.columns = (0, db_1.withRecordColumns)({
|
|
26
|
+
name: new db_1.StringColumn('name'),
|
|
27
|
+
seq: new db_1.IntegerColumn('seq'),
|
|
28
|
+
stampedAt: new db_1.DateTimeColumn('stamped_at'),
|
|
29
|
+
});
|
|
30
|
+
return _this;
|
|
31
|
+
}
|
|
32
|
+
return RecordIteratorTestTable;
|
|
33
|
+
}(db_1.Table));
|
|
34
|
+
exports.RecordIteratorTestTable = RecordIteratorTestTable;
|
|
35
|
+
exports.recordIteratorTestTables = {
|
|
36
|
+
IterationRow: new RecordIteratorTestTable(),
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=recordIteratorTestTables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recordIteratorTestTables.js","sourceRoot":"","sources":["../../../../test/util/tables/recordIteratorTestTables.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AACA,oCAA8G;AAU9G;IAA6C,2CAAmB;IAAhE;QAAA,qEAOC;QANC,UAAI,GAAG,yBAAyB,CAAC;QACjC,aAAO,GAAG,IAAA,sBAAiB,EAAe;YACxC,IAAI,EAAE,IAAI,iBAAY,CAAC,MAAM,CAAC;YAC9B,GAAG,EAAE,IAAI,kBAAa,CAAC,KAAK,CAAC;YAC7B,SAAS,EAAE,IAAI,mBAAc,CAAC,YAAY,CAAC;SAC5C,CAAC,CAAC;;IACL,CAAC;IAAD,8BAAC;AAAD,CAAC,AAPD,CAA6C,UAAK,GAOjD;AAPY,0DAAuB;AASvB,QAAA,wBAAwB,GAAG;IACtC,YAAY,EAAE,IAAI,uBAAuB,EAAyB;CACnE,CAAC"}
|