@adobe/data 0.9.59 → 0.9.61
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/dist/ecs/database/combine-plugins.d.ts +5 -1
- package/dist/ecs/database/combine-plugins.js +3 -3
- package/dist/ecs/database/combine-plugins.js.map +1 -1
- package/dist/ecs/database/create-plugin.d.ts +17 -14
- package/dist/ecs/database/create-plugin.js +2 -1
- package/dist/ecs/database/create-plugin.js.map +1 -1
- package/dist/ecs/database/database.d.ts +32 -4
- package/dist/ecs/database/database.index.performance.test.d.ts +1 -0
- package/dist/ecs/database/database.index.performance.test.js +417 -0
- package/dist/ecs/database/database.index.performance.test.js.map +1 -0
- package/dist/ecs/database/database.index.test.d.ts +1 -0
- package/dist/ecs/database/database.index.test.js +762 -0
- package/dist/ecs/database/database.index.test.js.map +1 -0
- package/dist/ecs/database/database.index.type-test.d.ts +1 -0
- package/dist/ecs/database/database.index.type-test.js +275 -0
- package/dist/ecs/database/database.index.type-test.js.map +1 -0
- package/dist/ecs/database/database.js.map +1 -1
- package/dist/ecs/database/deep-extends-chain.type-test.d.ts +256 -256
- package/dist/ecs/database/index-api-proof.type-test.d.ts +1 -0
- package/dist/ecs/database/index-api-proof.type-test.js +88 -0
- package/dist/ecs/database/index-api-proof.type-test.js.map +1 -0
- package/dist/ecs/database/index-registry/create-index-registry.d.ts +53 -0
- package/dist/ecs/database/index-registry/create-index-registry.js +174 -0
- package/dist/ecs/database/index-registry/create-index-registry.js.map +1 -0
- package/dist/ecs/database/index-registry/create-index.d.ts +60 -0
- package/dist/ecs/database/index-registry/create-index.js +539 -0
- package/dist/ecs/database/index-registry/create-index.js.map +1 -0
- package/dist/ecs/database/index-registry/index.d.ts +4 -0
- package/dist/ecs/database/index-registry/index.js +4 -0
- package/dist/ecs/database/index-registry/index.js.map +1 -0
- package/dist/ecs/database/public/create-database.js +146 -0
- package/dist/ecs/database/public/create-database.js.map +1 -1
- package/dist/ecs/database/transactional-store/transactional-store.d.ts +3 -2
- package/dist/ecs/plugins/scheduler/scheduler.d.ts +1 -0
- package/dist/ecs/store/index-types.d.ts +132 -0
- package/dist/ecs/store/index-types.js +3 -0
- package/dist/ecs/store/index-types.js.map +1 -0
- package/dist/ecs/store/public/create-store.js +189 -3
- package/dist/ecs/store/public/create-store.js.map +1 -1
- package/dist/ecs/store/store.d.ts +30 -13
- package/dist/ecs/store/store.js +5 -4
- package/dist/ecs/store/store.js.map +1 -1
- package/dist/ecs/store/transaction-functions.d.ts +4 -3
- package/dist/equals.js +24 -6
- package/dist/equals.js.map +1 -1
- package/dist/math/aabb/face/from-position.d.ts +1 -1
- package/dist/math/aabb/face/from-position.js +4 -3
- package/dist/math/aabb/face/from-position.js.map +1 -1
- package/dist/math/aabb/schema.js +1 -1
- package/dist/math/aabb/schema.js.map +1 -1
- package/dist/schema/fractional-index/between-n.d.ts +2 -0
- package/dist/schema/fractional-index/between-n.js +34 -0
- package/dist/schema/fractional-index/between-n.js.map +1 -0
- package/dist/schema/fractional-index/between-n.test.d.ts +1 -0
- package/dist/schema/fractional-index/between-n.test.js +36 -0
- package/dist/schema/fractional-index/between-n.test.js.map +1 -0
- package/dist/schema/fractional-index/between.d.ts +2 -0
- package/dist/schema/fractional-index/between.js +3 -0
- package/dist/schema/fractional-index/between.js.map +1 -0
- package/dist/schema/fractional-index/between.test.d.ts +1 -0
- package/dist/schema/fractional-index/between.test.js +68 -0
- package/dist/schema/fractional-index/between.test.js.map +1 -0
- package/dist/schema/fractional-index/decrement-integer.d.ts +1 -0
- package/dist/schema/fractional-index/decrement-integer.js +32 -0
- package/dist/schema/fractional-index/decrement-integer.js.map +1 -0
- package/dist/schema/fractional-index/decrement-integer.test.d.ts +1 -0
- package/dist/schema/fractional-index/decrement-integer.test.js +31 -0
- package/dist/schema/fractional-index/decrement-integer.test.js.map +1 -0
- package/dist/schema/fractional-index/digits.d.ts +1 -0
- package/dist/schema/fractional-index/digits.js +3 -0
- package/dist/schema/fractional-index/digits.js.map +1 -0
- package/dist/schema/fractional-index/fractional-index.d.ts +4 -0
- package/dist/schema/fractional-index/fractional-index.js +2 -0
- package/dist/schema/fractional-index/fractional-index.js.map +1 -0
- package/dist/schema/fractional-index/increment-integer.d.ts +1 -0
- package/dist/schema/fractional-index/increment-integer.js +32 -0
- package/dist/schema/fractional-index/increment-integer.js.map +1 -0
- package/dist/schema/fractional-index/increment-integer.test.d.ts +1 -0
- package/dist/schema/fractional-index/increment-integer.test.js +34 -0
- package/dist/schema/fractional-index/increment-integer.test.js.map +1 -0
- package/dist/schema/fractional-index/initial.d.ts +2 -0
- package/dist/schema/fractional-index/initial.js +2 -0
- package/dist/schema/fractional-index/initial.js.map +1 -0
- package/dist/schema/fractional-index/integer-length.d.ts +1 -0
- package/dist/schema/fractional-index/integer-length.js +9 -0
- package/dist/schema/fractional-index/integer-length.js.map +1 -0
- package/dist/schema/fractional-index/integer-part.d.ts +1 -0
- package/dist/schema/fractional-index/integer-part.js +9 -0
- package/dist/schema/fractional-index/integer-part.js.map +1 -0
- package/dist/schema/fractional-index/key-between.d.ts +2 -0
- package/dist/schema/fractional-index/key-between.js +39 -0
- package/dist/schema/fractional-index/key-between.js.map +1 -0
- package/dist/schema/fractional-index/midpoint.d.ts +1 -0
- package/dist/schema/fractional-index/midpoint.js +23 -0
- package/dist/schema/fractional-index/midpoint.js.map +1 -0
- package/dist/schema/fractional-index/midpoint.test.d.ts +1 -0
- package/dist/schema/fractional-index/midpoint.test.js +83 -0
- package/dist/schema/fractional-index/midpoint.test.js.map +1 -0
- package/dist/schema/fractional-index/public.d.ts +4 -0
- package/dist/schema/fractional-index/public.js +6 -0
- package/dist/schema/fractional-index/public.js.map +1 -0
- package/dist/schema/fractional-index/schema.d.ts +4 -0
- package/dist/schema/fractional-index/schema.js +5 -0
- package/dist/schema/fractional-index/schema.js.map +1 -0
- package/dist/schema/fractional-index/smallest-integer.d.ts +1 -0
- package/dist/schema/fractional-index/smallest-integer.js +3 -0
- package/dist/schema/fractional-index/smallest-integer.js.map +1 -0
- package/dist/schema/fractional-index/validate-integer.d.ts +1 -0
- package/dist/schema/fractional-index/validate-integer.js +7 -0
- package/dist/schema/fractional-index/validate-integer.js.map +1 -0
- package/dist/schema/fractional-index/validate-order-key.d.ts +1 -0
- package/dist/schema/fractional-index/validate-order-key.js +11 -0
- package/dist/schema/fractional-index/validate-order-key.js.map +1 -0
- package/dist/schema/guid/create.d.ts +2 -0
- package/dist/schema/guid/create.js +10 -0
- package/dist/schema/guid/create.js.map +1 -0
- package/dist/schema/guid/create.test.d.ts +1 -0
- package/dist/schema/guid/create.test.js +39 -0
- package/dist/schema/guid/create.test.js.map +1 -0
- package/dist/schema/guid/equals.d.ts +2 -0
- package/dist/schema/guid/equals.js +3 -0
- package/dist/schema/guid/equals.js.map +1 -0
- package/dist/schema/guid/equals.test.d.ts +1 -0
- package/dist/schema/guid/equals.test.js +30 -0
- package/dist/schema/guid/equals.test.js.map +1 -0
- package/dist/schema/guid/from-uuid.d.ts +2 -0
- package/dist/schema/guid/from-uuid.js +15 -0
- package/dist/schema/guid/from-uuid.js.map +1 -0
- package/dist/schema/guid/from-uuid.test.d.ts +1 -0
- package/dist/schema/guid/from-uuid.test.js +39 -0
- package/dist/schema/guid/from-uuid.test.js.map +1 -0
- package/dist/schema/guid/guid.performance.test.d.ts +1 -0
- package/dist/schema/guid/guid.performance.test.js +297 -0
- package/dist/schema/guid/guid.performance.test.js.map +1 -0
- package/dist/schema/guid/index.d.ts +4 -0
- package/dist/schema/guid/index.js +3 -0
- package/dist/schema/guid/index.js.map +1 -0
- package/dist/schema/guid/layout.d.ts +1 -0
- package/dist/schema/guid/layout.js +5 -0
- package/dist/schema/guid/layout.js.map +1 -0
- package/dist/schema/guid/nil.d.ts +2 -0
- package/dist/schema/guid/nil.js +3 -0
- package/dist/schema/guid/nil.js.map +1 -0
- package/dist/schema/guid/public.d.ts +8 -0
- package/dist/schema/guid/public.js +10 -0
- package/dist/schema/guid/public.js.map +1 -0
- package/dist/schema/guid/schema.d.ts +12 -0
- package/dist/schema/guid/schema.js +10 -0
- package/dist/schema/guid/schema.js.map +1 -0
- package/dist/schema/guid/schema.test.d.ts +1 -0
- package/dist/schema/guid/schema.test.js +35 -0
- package/dist/schema/guid/schema.test.js.map +1 -0
- package/dist/schema/guid/to-unserializable-key.d.ts +2 -0
- package/dist/schema/guid/to-unserializable-key.js +10 -0
- package/dist/schema/guid/to-unserializable-key.js.map +1 -0
- package/dist/schema/guid/to-uuid.d.ts +2 -0
- package/dist/schema/guid/to-uuid.js +15 -0
- package/dist/schema/guid/to-uuid.js.map +1 -0
- package/dist/schema/guid/to-uuid.test.d.ts +1 -0
- package/dist/schema/guid/to-uuid.test.js +31 -0
- package/dist/schema/guid/to-uuid.test.js.map +1 -0
- package/dist/schema/index.d.ts +2 -0
- package/dist/schema/index.js +2 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/table/select-rows.d.ts +7 -4
- package/dist/table/select-rows.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/references/data-lit/package.json +1 -1
- package/references/data-lit-tictactoe/package.json +1 -1
- package/references/data-react/package.json +1 -1
- package/references/data-react-hello/package.json +1 -1
- package/references/data-react-pixie/package.json +1 -1
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { Database } from "./database.js";
|
|
4
|
+
/**
|
|
5
|
+
* Big-O verification for index insertion paths.
|
|
6
|
+
*
|
|
7
|
+
* For each declaration shape, we insert `N` rows and check that doubling
|
|
8
|
+
* `N` doubles total time (linear in `N`, i.e. amortized `O(1)` per insert)
|
|
9
|
+
* rather than scaling quadratically. The test compares the ratio between
|
|
10
|
+
* the two batches' insert times against a quadratic-growth threshold.
|
|
11
|
+
*
|
|
12
|
+
* Each test inserts BEFORE any read so the deferred-sort path stays on
|
|
13
|
+
* its happy path: writes are O(1) append + dirty-set membership; the sort
|
|
14
|
+
* only happens when a read drains a dirty bucket.
|
|
15
|
+
*
|
|
16
|
+
* Timing on CI varies, so we use a generous slack and skip when the
|
|
17
|
+
* timer can't resolve a meaningful value (sub-millisecond). When the
|
|
18
|
+
* test does measure, it asserts the time ratio between N and 2N is
|
|
19
|
+
* below `quadratic_floor`, i.e. nowhere near `O(n²)`.
|
|
20
|
+
*/
|
|
21
|
+
const SIZES = [2000, 4000];
|
|
22
|
+
// Doubling N: a truly linear operation gives ~2× total time; an O(n²)
|
|
23
|
+
// regression gives ~4×. We allow up to 5× to absorb GC pauses and JIT
|
|
24
|
+
// warmup variance when the suite runs alongside the rest of the repo,
|
|
25
|
+
// while still flagging a quadratic regression with margin (it would
|
|
26
|
+
// reliably exceed 4×, often by a lot, as N grows).
|
|
27
|
+
const QUADRATIC_FLOOR = 5.0;
|
|
28
|
+
function measureMs(fn) {
|
|
29
|
+
const start = performance.now();
|
|
30
|
+
fn();
|
|
31
|
+
return performance.now() - start;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Run `fn` once to warm V8's JIT and any per-fixture cold paths, then run
|
|
35
|
+
* it again and return the measured time. Without this, the first invocation
|
|
36
|
+
* in a SIZES.map sees cold optimization and skews the linear-growth ratio,
|
|
37
|
+
* particularly when this suite runs alongside the full repo's other tests.
|
|
38
|
+
*/
|
|
39
|
+
function warmThenMeasure(fn) {
|
|
40
|
+
fn();
|
|
41
|
+
return fn();
|
|
42
|
+
}
|
|
43
|
+
function expectAmortizedLinear(times) {
|
|
44
|
+
if (times.some(t => t <= 1)) {
|
|
45
|
+
// Below the resolution we trust — skip the assertion but the
|
|
46
|
+
// test still verified the inserts ran without throwing.
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const ratio = times[1] / times[0];
|
|
50
|
+
expect(ratio).toBeLessThan(QUADRATIC_FLOOR);
|
|
51
|
+
}
|
|
52
|
+
describe("Index insertion big-O", () => {
|
|
53
|
+
it("non-unique single-column key (O(1) push per insert)", () => {
|
|
54
|
+
const times = SIZES.map((n) => warmThenMeasure(() => {
|
|
55
|
+
const plugin = Database.Plugin.create({
|
|
56
|
+
components: { parent: { type: "number" } },
|
|
57
|
+
archetypes: { Child: ["parent"] },
|
|
58
|
+
indexes: { childrenOf: { key: "parent" } },
|
|
59
|
+
transactions: {
|
|
60
|
+
add: (t, p) => t.archetypes.Child.insert({ parent: p }),
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
const db = Database.create(plugin);
|
|
64
|
+
return measureMs(() => {
|
|
65
|
+
for (let i = 0; i < n; i++)
|
|
66
|
+
db.transactions.add(0); // all in one bucket
|
|
67
|
+
});
|
|
68
|
+
}));
|
|
69
|
+
expectAmortizedLinear(times);
|
|
70
|
+
});
|
|
71
|
+
it("unique single-column key (O(1) Map set per insert)", () => {
|
|
72
|
+
const times = SIZES.map((n) => warmThenMeasure(() => {
|
|
73
|
+
const plugin = Database.Plugin.create({
|
|
74
|
+
components: { sku: { type: "number" } },
|
|
75
|
+
archetypes: { Row: ["sku"] },
|
|
76
|
+
indexes: { bySku: { key: "sku", unique: true } },
|
|
77
|
+
transactions: {
|
|
78
|
+
add: (t, sku) => t.archetypes.Row.insert({ sku }),
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
const db = Database.create(plugin);
|
|
82
|
+
return measureMs(() => {
|
|
83
|
+
for (let i = 0; i < n; i++)
|
|
84
|
+
db.transactions.add(i); // distinct keys
|
|
85
|
+
});
|
|
86
|
+
}));
|
|
87
|
+
expectAmortizedLinear(times);
|
|
88
|
+
});
|
|
89
|
+
it("sorted single-key (deferred: O(1) append + dirty mark per insert)", () => {
|
|
90
|
+
// This is the key case for deferred sort: many inserts into the
|
|
91
|
+
// same sorted bucket should be linear in batch size, not quadratic.
|
|
92
|
+
const times = SIZES.map((n) => warmThenMeasure(() => {
|
|
93
|
+
const plugin = Database.Plugin.create({
|
|
94
|
+
components: {
|
|
95
|
+
parent: { type: "number" },
|
|
96
|
+
fractIndex: { type: "string" },
|
|
97
|
+
},
|
|
98
|
+
archetypes: { Child: ["parent", "fractIndex"] },
|
|
99
|
+
indexes: {
|
|
100
|
+
ordered: { key: "parent", order: { by: ["fractIndex"] } },
|
|
101
|
+
},
|
|
102
|
+
transactions: {
|
|
103
|
+
add: (t, fractIndex) => t.archetypes.Child.insert({ parent: 0, fractIndex }),
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
const db = Database.create(plugin);
|
|
107
|
+
return measureMs(() => {
|
|
108
|
+
// Insert in reverse-sorted order to stress the comparator
|
|
109
|
+
// path. With deferred sort we never call the comparator
|
|
110
|
+
// during inserts — only on the (deferred) read.
|
|
111
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
112
|
+
db.transactions.add(String(i).padStart(8, "0"));
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}));
|
|
116
|
+
expectAmortizedLinear(times);
|
|
117
|
+
});
|
|
118
|
+
it("sorted multi-key with custom comparator (deferred)", () => {
|
|
119
|
+
const times = SIZES.map((n) => warmThenMeasure(() => {
|
|
120
|
+
const plugin = Database.Plugin.create({
|
|
121
|
+
components: {
|
|
122
|
+
owner: { type: "number" },
|
|
123
|
+
priority: { type: "number" },
|
|
124
|
+
due: { type: "number" },
|
|
125
|
+
},
|
|
126
|
+
archetypes: { Task: ["owner", "priority", "due"] },
|
|
127
|
+
indexes: {
|
|
128
|
+
tasksByPriority: {
|
|
129
|
+
key: "owner",
|
|
130
|
+
order: {
|
|
131
|
+
by: ["priority", "due"],
|
|
132
|
+
compare: (a, b) => b.priority - a.priority || a.due - b.due,
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
transactions: {
|
|
137
|
+
add: (t, args) => t.archetypes.Task.insert({
|
|
138
|
+
owner: 0,
|
|
139
|
+
priority: args.priority,
|
|
140
|
+
due: args.due,
|
|
141
|
+
}),
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
const db = Database.create(plugin);
|
|
145
|
+
return measureMs(() => {
|
|
146
|
+
for (let i = 0; i < n; i++) {
|
|
147
|
+
db.transactions.add({ priority: n - i, due: i });
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}));
|
|
151
|
+
expectAmortizedLinear(times);
|
|
152
|
+
});
|
|
153
|
+
it("multi-value array fan-out (O(elements-per-row) per insert)", () => {
|
|
154
|
+
// Fan-out cost is proportional to the array size per row, not to
|
|
155
|
+
// the total dataset size. Keep the array size constant; insertion
|
|
156
|
+
// time should still be linear in N.
|
|
157
|
+
const times = SIZES.map((n) => warmThenMeasure(() => {
|
|
158
|
+
const plugin = Database.Plugin.create({
|
|
159
|
+
components: {
|
|
160
|
+
title: { type: "string" },
|
|
161
|
+
assigned: { type: "array", items: { type: "string" } },
|
|
162
|
+
},
|
|
163
|
+
archetypes: { Task: ["title", "assigned"] },
|
|
164
|
+
indexes: { tasksByAssignee: { key: "assigned" } },
|
|
165
|
+
transactions: {
|
|
166
|
+
add: (t, args) => t.archetypes.Task.insert(args),
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
const db = Database.create(plugin);
|
|
170
|
+
return measureMs(() => {
|
|
171
|
+
for (let i = 0; i < n; i++) {
|
|
172
|
+
db.transactions.add({
|
|
173
|
+
title: `t${i}`,
|
|
174
|
+
assigned: ["a", "b", "c"],
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}));
|
|
179
|
+
expectAmortizedLinear(times);
|
|
180
|
+
});
|
|
181
|
+
it("computed scalar key (O(compute) per insert)", () => {
|
|
182
|
+
const times = SIZES.map((n) => warmThenMeasure(() => {
|
|
183
|
+
const plugin = Database.Plugin.create({
|
|
184
|
+
components: { email: { type: "string" } },
|
|
185
|
+
archetypes: { User: ["email"] },
|
|
186
|
+
indexes: {
|
|
187
|
+
byEmailCi: {
|
|
188
|
+
key: (email) => email.toLowerCase(),
|
|
189
|
+
components: ["email"],
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
transactions: {
|
|
193
|
+
add: (t, email) => t.archetypes.User.insert({ email }),
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
const db = Database.create(plugin);
|
|
197
|
+
return measureMs(() => {
|
|
198
|
+
for (let i = 0; i < n; i++)
|
|
199
|
+
db.transactions.add(`User${i}@X.com`);
|
|
200
|
+
});
|
|
201
|
+
}));
|
|
202
|
+
expectAmortizedLinear(times);
|
|
203
|
+
});
|
|
204
|
+
it("computed multi-value (O(elements + compute) per insert)", () => {
|
|
205
|
+
const times = SIZES.map((n) => warmThenMeasure(() => {
|
|
206
|
+
const plugin = Database.Plugin.create({
|
|
207
|
+
components: { body: { type: "string" } },
|
|
208
|
+
archetypes: { Doc: ["body"] },
|
|
209
|
+
indexes: {
|
|
210
|
+
docsByKeyword: {
|
|
211
|
+
key: (body) => body.split(/\s+/),
|
|
212
|
+
components: ["body"],
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
transactions: {
|
|
216
|
+
add: (t, body) => t.archetypes.Doc.insert({ body }),
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
const db = Database.create(plugin);
|
|
220
|
+
return measureMs(() => {
|
|
221
|
+
for (let i = 0; i < n; i++)
|
|
222
|
+
db.transactions.add("alpha beta gamma");
|
|
223
|
+
});
|
|
224
|
+
}));
|
|
225
|
+
expectAmortizedLinear(times);
|
|
226
|
+
});
|
|
227
|
+
it("slot map key (O(slots) per insert)", () => {
|
|
228
|
+
const times = SIZES.map((n) => warmThenMeasure(() => {
|
|
229
|
+
const plugin = Database.Plugin.create({
|
|
230
|
+
components: {
|
|
231
|
+
team: { type: "number" },
|
|
232
|
+
roster: {
|
|
233
|
+
type: "object",
|
|
234
|
+
properties: { role: { type: "string" } },
|
|
235
|
+
required: ["role"],
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
archetypes: { Player: ["team", "roster"] },
|
|
239
|
+
indexes: {
|
|
240
|
+
playerByTeamRole: {
|
|
241
|
+
key: {
|
|
242
|
+
team: "team",
|
|
243
|
+
role: (r) => r.role,
|
|
244
|
+
},
|
|
245
|
+
components: ["roster"],
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
transactions: {
|
|
249
|
+
add: (t, args) => t.archetypes.Player.insert(args),
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
const db = Database.create(plugin);
|
|
253
|
+
return measureMs(() => {
|
|
254
|
+
for (let i = 0; i < n; i++) {
|
|
255
|
+
db.transactions.add({ team: i, roster: { role: "qb" } });
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}));
|
|
259
|
+
expectAmortizedLinear(times);
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
describe("Single-entity write is O(1) in bucket size", () => {
|
|
263
|
+
// These tests catch regressions where a single-row delete/update
|
|
264
|
+
// becomes proportional to the bucket size (e.g. via `arr.indexOf`).
|
|
265
|
+
// We compare two bucket sizes ~10× apart; if the per-delete cost
|
|
266
|
+
// were linear in bucket size, the ratio would be ~10× and exceed
|
|
267
|
+
// the threshold. With O(1) bucket-removal it stays near 1×.
|
|
268
|
+
const SMALL = 4_000;
|
|
269
|
+
const BIG = 40_000;
|
|
270
|
+
const DELETES = 2_000;
|
|
271
|
+
function pickTargets(bucketSize, count) {
|
|
272
|
+
// Targets scattered through the bucket — front, middle, back, with
|
|
273
|
+
// a step. If we picked only the first K, `arr.indexOf` would hit
|
|
274
|
+
// index 0 immediately and the linear-scan cost wouldn't show up.
|
|
275
|
+
const stride = Math.max(1, Math.floor(bucketSize / count));
|
|
276
|
+
const out = [];
|
|
277
|
+
for (let i = 0; i < count; i++)
|
|
278
|
+
out.push(i * stride);
|
|
279
|
+
return out;
|
|
280
|
+
}
|
|
281
|
+
function timeDeletes(bucketSize) {
|
|
282
|
+
const plugin = Database.Plugin.create({
|
|
283
|
+
components: { parent: { type: "number" } },
|
|
284
|
+
archetypes: { Child: ["parent"] },
|
|
285
|
+
indexes: { childrenOf: { key: "parent" } },
|
|
286
|
+
transactions: {
|
|
287
|
+
add: (t, p) => t.archetypes.Child.insert({ parent: p }),
|
|
288
|
+
delete: (t, e) => t.delete(e),
|
|
289
|
+
},
|
|
290
|
+
});
|
|
291
|
+
const db = Database.create(plugin);
|
|
292
|
+
const entities = [];
|
|
293
|
+
for (let i = 0; i < bucketSize; i++) {
|
|
294
|
+
entities.push(db.transactions.add(0));
|
|
295
|
+
}
|
|
296
|
+
const targets = pickTargets(bucketSize, DELETES).map((i) => entities[i]);
|
|
297
|
+
return measureMs(() => {
|
|
298
|
+
for (const e of targets)
|
|
299
|
+
db.transactions.delete(e);
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
function timeUpdatesBucketChange(bucketSize) {
|
|
303
|
+
const plugin = Database.Plugin.create({
|
|
304
|
+
components: { parent: { type: "number" } },
|
|
305
|
+
archetypes: { Child: ["parent"] },
|
|
306
|
+
indexes: { childrenOf: { key: "parent" } },
|
|
307
|
+
transactions: {
|
|
308
|
+
add: (t, p) => t.archetypes.Child.insert({ parent: p }),
|
|
309
|
+
move: (t, args) => t.update(args.e, { parent: args.p }),
|
|
310
|
+
},
|
|
311
|
+
});
|
|
312
|
+
const db = Database.create(plugin);
|
|
313
|
+
const entities = [];
|
|
314
|
+
for (let i = 0; i < bucketSize; i++) {
|
|
315
|
+
entities.push(db.transactions.add(0));
|
|
316
|
+
}
|
|
317
|
+
const targets = pickTargets(bucketSize, DELETES).map((i) => entities[i]);
|
|
318
|
+
return measureMs(() => {
|
|
319
|
+
let p = 1;
|
|
320
|
+
for (const e of targets)
|
|
321
|
+
db.transactions.move({ e, p: p++ });
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
it("non-unique delete: small vs big bucket — ratio stays near 1×", () => {
|
|
325
|
+
const small = warmThenMeasure(() => timeDeletes(SMALL));
|
|
326
|
+
const big = warmThenMeasure(() => timeDeletes(BIG));
|
|
327
|
+
if (small <= 1)
|
|
328
|
+
return; // sub-ms; can't measure reliably
|
|
329
|
+
// O(bucket.size) would give ratio ~= BIG/SMALL = 10×. O(1) → ~1×.
|
|
330
|
+
// Threshold 3 is permissive enough for CI noise but rejects linear.
|
|
331
|
+
expect(big / small).toBeLessThan(3);
|
|
332
|
+
});
|
|
333
|
+
it("update-with-bucket-change: small vs big source bucket — ratio stays near 1×", () => {
|
|
334
|
+
const small = warmThenMeasure(() => timeUpdatesBucketChange(SMALL));
|
|
335
|
+
const big = warmThenMeasure(() => timeUpdatesBucketChange(BIG));
|
|
336
|
+
if (small <= 1)
|
|
337
|
+
return;
|
|
338
|
+
expect(big / small).toBeLessThan(3);
|
|
339
|
+
});
|
|
340
|
+
it("sorted-index delete: small vs big bucket — ratio stays near 1×", () => {
|
|
341
|
+
// Sorted indexes used arr.splice with indexOf in the V1 path —
|
|
342
|
+
// O(bucket.size) per delete. Now Set.delete is O(1); the sort
|
|
343
|
+
// cache is invalidated, paid only on the next read.
|
|
344
|
+
function timeSortedDeletes(bucketSize) {
|
|
345
|
+
const plugin = Database.Plugin.create({
|
|
346
|
+
components: {
|
|
347
|
+
parent: { type: "number" },
|
|
348
|
+
fractIndex: { type: "string" },
|
|
349
|
+
},
|
|
350
|
+
archetypes: { Child: ["parent", "fractIndex"] },
|
|
351
|
+
indexes: {
|
|
352
|
+
ordered: { key: "parent", order: { by: ["fractIndex"] } },
|
|
353
|
+
},
|
|
354
|
+
transactions: {
|
|
355
|
+
add: (t, fractIndex) => t.archetypes.Child.insert({ parent: 0, fractIndex }),
|
|
356
|
+
delete: (t, e) => t.delete(e),
|
|
357
|
+
},
|
|
358
|
+
});
|
|
359
|
+
const db = Database.create(plugin);
|
|
360
|
+
const entities = [];
|
|
361
|
+
for (let i = 0; i < bucketSize; i++) {
|
|
362
|
+
entities.push(db.transactions.add(String(i).padStart(8, "0")));
|
|
363
|
+
}
|
|
364
|
+
const targets = pickTargets(bucketSize, DELETES).map((i) => entities[i]);
|
|
365
|
+
return measureMs(() => {
|
|
366
|
+
for (const e of targets)
|
|
367
|
+
db.transactions.delete(e);
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
const small = warmThenMeasure(() => timeSortedDeletes(SMALL));
|
|
371
|
+
const big = warmThenMeasure(() => timeSortedDeletes(BIG));
|
|
372
|
+
if (small <= 1)
|
|
373
|
+
return;
|
|
374
|
+
expect(big / small).toBeLessThan(3);
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
describe("Index read after batched inserts", () => {
|
|
378
|
+
it("sorted read after N inserts pays exactly one O(n log n) sort then is free", () => {
|
|
379
|
+
// The deferred-sort contract: the FIRST find/findRange on a dirty
|
|
380
|
+
// bucket pays the catch-up sort; the second is free. We verify by
|
|
381
|
+
// measuring two consecutive reads.
|
|
382
|
+
const n = 5000;
|
|
383
|
+
const plugin = Database.Plugin.create({
|
|
384
|
+
components: {
|
|
385
|
+
parent: { type: "number" },
|
|
386
|
+
fractIndex: { type: "string" },
|
|
387
|
+
},
|
|
388
|
+
archetypes: { Child: ["parent", "fractIndex"] },
|
|
389
|
+
indexes: {
|
|
390
|
+
ordered: { key: "parent", order: { by: ["fractIndex"] } },
|
|
391
|
+
},
|
|
392
|
+
transactions: {
|
|
393
|
+
add: (t, fractIndex) => t.archetypes.Child.insert({ parent: 0, fractIndex }),
|
|
394
|
+
},
|
|
395
|
+
});
|
|
396
|
+
const db = Database.create(plugin);
|
|
397
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
398
|
+
db.transactions.add(String(i).padStart(8, "0"));
|
|
399
|
+
}
|
|
400
|
+
const firstReadTime = measureMs(() => {
|
|
401
|
+
const out = db.indexes.ordered.find(0);
|
|
402
|
+
expect(out.length).toBe(n);
|
|
403
|
+
// Verify the sort actually happened.
|
|
404
|
+
expect(out[0]).toBeDefined();
|
|
405
|
+
});
|
|
406
|
+
const secondReadTime = measureMs(() => {
|
|
407
|
+
const out = db.indexes.ordered.find(0);
|
|
408
|
+
expect(out.length).toBe(n);
|
|
409
|
+
});
|
|
410
|
+
// The second read should be at least an order of magnitude
|
|
411
|
+
// cheaper than the first. Allow generous slack for noise.
|
|
412
|
+
if (firstReadTime > 1) {
|
|
413
|
+
expect(secondReadTime).toBeLessThan(firstReadTime);
|
|
414
|
+
}
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
//# sourceMappingURL=database.index.performance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.index.performance.test.js","sourceRoot":"","sources":["../../../src/ecs/database/database.index.performance.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|