@adobe/data 0.2.12 → 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/dist/ecs/database/create-database.js +12 -8
- package/dist/ecs/database/create-database.js.map +1 -1
- package/dist/ecs/database/create-database.test.js +11 -11
- package/dist/ecs/database/create-database.test.js.map +1 -1
- package/dist/ecs/database/database-schema/create-database-schema-test.js +21 -0
- package/dist/ecs/database/database-schema/create-database-schema-test.js.map +1 -1
- package/dist/ecs/database/database-schema/create-database-schema.js +21 -0
- package/dist/ecs/database/database-schema/create-database-schema.js.map +1 -1
- package/dist/ecs/database/database-schema/database-schema.js +21 -0
- package/dist/ecs/database/database-schema/database-schema.js.map +1 -1
- package/dist/ecs/database/database-schema/index.js +21 -0
- package/dist/ecs/database/database-schema/index.js.map +1 -1
- package/dist/ecs/database/database.d.ts +3 -0
- package/dist/ecs/database/observe-dependent-value.test.js +1 -1
- package/dist/ecs/database/observe-dependent-value.test.js.map +1 -1
- package/dist/ecs/database/observe-select-entities.d.ts +7 -0
- package/dist/ecs/database/observe-select-entities.js +117 -0
- package/dist/ecs/database/observe-select-entities.js.map +1 -0
- package/dist/ecs/database/observe-select-entities.performance.test.d.ts +1 -0
- package/dist/ecs/database/observe-select-entities.performance.test.js +175 -0
- package/dist/ecs/database/observe-select-entities.performance.test.js.map +1 -0
- package/dist/ecs/database/observe-select-entities.test.d.ts +1 -0
- package/dist/ecs/database/observe-select-entities.test.js +544 -0
- package/dist/ecs/database/observe-select-entities.test.js.map +1 -0
- package/dist/ecs/database/transactional-store/create-transactional-store.js +10 -8
- package/dist/ecs/database/transactional-store/create-transactional-store.js.map +1 -1
- package/dist/ecs/database/transactional-store/create-transactional-store.test.js +178 -13
- package/dist/ecs/database/transactional-store/create-transactional-store.test.js.map +1 -1
- package/dist/ecs/database/transactional-store/patch-entity-values.d.ts +2 -0
- package/dist/ecs/database/transactional-store/patch-entity-values.js +7 -0
- package/dist/ecs/database/transactional-store/patch-entity-values.js.map +1 -0
- package/dist/ecs/database/transactional-store/patch.d.ts +3 -0
- package/dist/ecs/database/transactional-store/patch.js +7 -0
- package/dist/ecs/database/transactional-store/patch.js.map +1 -0
- package/dist/ecs/database/transactional-store/transactional-store.d.ts +1 -1
- package/dist/ecs/store/core/core.d.ts +12 -8
- package/dist/ecs/store/core/create-core.js +7 -1
- package/dist/ecs/store/core/create-core.js.map +1 -1
- package/dist/ecs/store/core/create-core.test.js +1 -1
- package/dist/ecs/store/core/create-core.test.js.map +1 -1
- package/dist/ecs/store/core/select-entities.d.ts +6 -0
- package/dist/ecs/store/core/select-entities.js +78 -0
- package/dist/ecs/store/core/select-entities.js.map +1 -0
- package/dist/ecs/store/core/select-entities.test.d.ts +1 -0
- package/dist/ecs/store/core/select-entities.test.js +375 -0
- package/dist/ecs/store/core/select-entities.test.js.map +1 -0
- package/dist/ecs/store/create-store.js +2 -14
- package/dist/ecs/store/create-store.js.map +1 -1
- package/dist/ecs/store/create-store.test.js.map +1 -1
- package/dist/ecs/store/entity-select-options.d.ts +15 -0
- package/dist/ecs/store/entity-select-options.js +23 -0
- package/dist/ecs/store/entity-select-options.js.map +1 -0
- package/dist/ecs/store/query.d.ts +47 -0
- package/dist/ecs/store/query.js +2 -0
- package/dist/ecs/store/query.js.map +1 -0
- package/dist/ecs/store/select-options.d.ts +1 -0
- package/dist/ecs/store/select-options.js +16 -0
- package/dist/ecs/store/select-options.js.map +1 -0
- package/dist/ecs/store/select.d.ts +44 -0
- package/dist/ecs/store/select.js +2 -0
- package/dist/ecs/store/select.js.map +1 -0
- package/dist/ecs/store/store.d.ts +3 -2
- package/dist/equals-shallow.js +21 -0
- package/dist/equals-shallow.js.map +1 -1
- package/dist/equals-shallow.test.js +21 -0
- package/dist/equals-shallow.test.js.map +1 -1
- package/dist/functions/apply-args.js +21 -0
- package/dist/functions/apply-args.js.map +1 -1
- package/dist/functions/index.js +21 -0
- package/dist/functions/index.js.map +1 -1
- package/dist/internal/function/memoize-factory.js +21 -0
- package/dist/internal/function/memoize-factory.js.map +1 -1
- package/dist/is-data.js +21 -0
- package/dist/is-data.js.map +1 -1
- package/dist/lit/decorators/apply-decorator.js +21 -0
- package/dist/lit/decorators/apply-decorator.js.map +1 -1
- package/dist/lit/decorators/apply-service-decorators.js +21 -0
- package/dist/lit/decorators/apply-service-decorators.js.map +1 -1
- package/dist/lit/decorators/require-service.js +21 -0
- package/dist/lit/decorators/require-service.js.map +1 -1
- package/dist/lit/elements/index.js +21 -0
- package/dist/lit/elements/index.js.map +1 -1
- package/dist/lit/elements/service-application.js +21 -0
- package/dist/lit/elements/service-application.js.map +1 -1
- package/dist/lit/elements/service-context.js +21 -0
- package/dist/lit/elements/service-context.js.map +1 -1
- package/dist/lit/elements/service-element.js +21 -0
- package/dist/lit/elements/service-element.js.map +1 -1
- package/dist/lit/hooks/component/component.js +21 -0
- package/dist/lit/hooks/component/component.js.map +1 -1
- package/dist/lit/hooks/component/stack.js +21 -0
- package/dist/lit/hooks/component/stack.js.map +1 -1
- package/dist/lit/hooks/index.js +21 -0
- package/dist/lit/hooks/index.js.map +1 -1
- package/dist/lit/hooks/use-connected.js +21 -0
- package/dist/lit/hooks/use-connected.js.map +1 -1
- package/dist/lit/hooks/use-effect.js +21 -0
- package/dist/lit/hooks/use-effect.js.map +1 -1
- package/dist/lit/hooks/use-element.js +21 -0
- package/dist/lit/hooks/use-element.js.map +1 -1
- package/dist/lit/hooks/use-memo.js +21 -0
- package/dist/lit/hooks/use-memo.js.map +1 -1
- package/dist/lit/hooks/use-observable-values.js +21 -0
- package/dist/lit/hooks/use-observable-values.js.map +1 -1
- package/dist/lit/hooks/use-observable.js +21 -0
- package/dist/lit/hooks/use-observable.js.map +1 -1
- package/dist/lit/hooks/use-ref.js +21 -0
- package/dist/lit/hooks/use-ref.js.map +1 -1
- package/dist/lit/hooks/use-resize-observer.js +21 -0
- package/dist/lit/hooks/use-resize-observer.js.map +1 -1
- package/dist/lit/hooks/use-state.js +21 -0
- package/dist/lit/hooks/use-state.js.map +1 -1
- package/dist/lit/hooks/use-window-event.js +21 -0
- package/dist/lit/hooks/use-window-event.js.map +1 -1
- package/dist/lit/hooks/with-hooks.js +21 -0
- package/dist/lit/hooks/with-hooks.js.map +1 -1
- package/dist/lit/index.js +21 -0
- package/dist/lit/index.js.map +1 -1
- package/dist/observe/create-query-state.js +21 -0
- package/dist/observe/create-query-state.js.map +1 -1
- package/dist/schema/boolean.js +21 -0
- package/dist/schema/boolean.js.map +1 -1
- package/dist/schema/time.js +21 -0
- package/dist/schema/time.js.map +1 -1
- package/dist/schema/tuple.js +21 -0
- package/dist/schema/tuple.js.map +1 -1
- package/dist/service/is-service.js +21 -0
- package/dist/service/is-service.js.map +1 -1
- package/dist/table/copy-column-to-gpu-buffer.js +21 -0
- package/dist/table/copy-column-to-gpu-buffer.js.map +1 -1
- package/dist/table/ensure-capacity copy.d.ts +2 -0
- package/dist/table/ensure-capacity copy.js +15 -0
- package/dist/table/ensure-capacity copy.js.map +1 -0
- package/dist/table/filter-rows.d.ts +2 -0
- package/dist/table/filter-rows.js +15 -0
- package/dist/table/filter-rows.js.map +1 -0
- package/dist/table/select-rows.d.ts +27 -0
- package/dist/table/select-rows.js +54 -0
- package/dist/table/select-rows.js.map +1 -0
- package/dist/table/select-rows.test.d.ts +1 -0
- package/dist/table/select-rows.test.js +131 -0
- package/dist/table/select-rows.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/typed-buffer/copy-to-gpu-buffer.js +21 -0
- package/dist/typed-buffer/copy-to-gpu-buffer.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
/*MIT License
|
|
2
|
+
|
|
3
|
+
© Copyright 2025 Adobe. All rights reserved.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.*/
|
|
22
|
+
import { describe, expect, it, beforeEach, vi } from "vitest";
|
|
23
|
+
import { createStore } from "../store/create-store.js";
|
|
24
|
+
import { createDatabase } from "./create-database.js";
|
|
25
|
+
import { F32Schema } from "../../schema/f32.js";
|
|
26
|
+
import { BooleanSchema } from "../../schema/boolean.js";
|
|
27
|
+
describe("observeSelectEntities", () => {
|
|
28
|
+
let database;
|
|
29
|
+
let entities;
|
|
30
|
+
function createTestDatabase() {
|
|
31
|
+
const store = createStore({
|
|
32
|
+
position: F32Schema,
|
|
33
|
+
health: F32Schema,
|
|
34
|
+
name: { type: "string" },
|
|
35
|
+
score: F32Schema,
|
|
36
|
+
active: BooleanSchema
|
|
37
|
+
}, {}, {
|
|
38
|
+
Position: ["position"],
|
|
39
|
+
Health: ["health"],
|
|
40
|
+
Name: ["name"],
|
|
41
|
+
PositionHealth: ["position", "health"],
|
|
42
|
+
PositionName: ["position", "name"],
|
|
43
|
+
HealthName: ["health", "name"],
|
|
44
|
+
Full: ["position", "health", "name", "score", "active"]
|
|
45
|
+
});
|
|
46
|
+
return createDatabase(store, store => ({
|
|
47
|
+
createPositionEntity(args) {
|
|
48
|
+
return store.archetypes.Position.insert(args);
|
|
49
|
+
},
|
|
50
|
+
createHealthEntity(args) {
|
|
51
|
+
return store.archetypes.Health.insert(args);
|
|
52
|
+
},
|
|
53
|
+
createNameEntity(args) {
|
|
54
|
+
return store.archetypes.Name.insert(args);
|
|
55
|
+
},
|
|
56
|
+
createPositionHealthEntity(args) {
|
|
57
|
+
return store.archetypes.PositionHealth.insert(args);
|
|
58
|
+
},
|
|
59
|
+
createPositionNameEntity(args) {
|
|
60
|
+
return store.archetypes.PositionName.insert(args);
|
|
61
|
+
},
|
|
62
|
+
createHealthNameEntity(args) {
|
|
63
|
+
return store.archetypes.HealthName.insert(args);
|
|
64
|
+
},
|
|
65
|
+
createFullEntity(args) {
|
|
66
|
+
return store.archetypes.Full.insert(args);
|
|
67
|
+
},
|
|
68
|
+
updateEntity(args) {
|
|
69
|
+
return store.update(args.entity, args.values);
|
|
70
|
+
},
|
|
71
|
+
deleteEntity(args) {
|
|
72
|
+
return store.delete(args.entity);
|
|
73
|
+
}
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
beforeEach(() => {
|
|
77
|
+
database = createTestDatabase();
|
|
78
|
+
// Create test entities across different archetypes
|
|
79
|
+
entities = {
|
|
80
|
+
// Position only archetype
|
|
81
|
+
pos1: database.transactions.createPositionEntity({ position: 1 }),
|
|
82
|
+
pos2: database.transactions.createPositionEntity({ position: 2 }),
|
|
83
|
+
pos3: database.transactions.createPositionEntity({ position: 3 }),
|
|
84
|
+
// Health only archetype
|
|
85
|
+
health1: database.transactions.createHealthEntity({ health: 50 }),
|
|
86
|
+
health2: database.transactions.createHealthEntity({ health: 75 }),
|
|
87
|
+
health3: database.transactions.createHealthEntity({ health: 25 }),
|
|
88
|
+
// Name only archetype
|
|
89
|
+
name1: database.transactions.createNameEntity({ name: "Alice" }),
|
|
90
|
+
name2: database.transactions.createNameEntity({ name: "Bob" }),
|
|
91
|
+
name3: database.transactions.createNameEntity({ name: "Charlie" }),
|
|
92
|
+
// Position + Health archetype
|
|
93
|
+
posHealth1: database.transactions.createPositionHealthEntity({
|
|
94
|
+
position: 10,
|
|
95
|
+
health: 80
|
|
96
|
+
}),
|
|
97
|
+
posHealth2: database.transactions.createPositionHealthEntity({
|
|
98
|
+
position: 13,
|
|
99
|
+
health: 90
|
|
100
|
+
}),
|
|
101
|
+
// Position + Name archetype
|
|
102
|
+
posName1: database.transactions.createPositionNameEntity({
|
|
103
|
+
position: 16,
|
|
104
|
+
name: "David"
|
|
105
|
+
}),
|
|
106
|
+
posName2: database.transactions.createPositionNameEntity({
|
|
107
|
+
position: 19,
|
|
108
|
+
name: "Eve"
|
|
109
|
+
}),
|
|
110
|
+
// Health + Name archetype
|
|
111
|
+
healthName1: database.transactions.createHealthNameEntity({
|
|
112
|
+
health: 60,
|
|
113
|
+
name: "Frank"
|
|
114
|
+
}),
|
|
115
|
+
healthName2: database.transactions.createHealthNameEntity({
|
|
116
|
+
health: 40,
|
|
117
|
+
name: "Grace"
|
|
118
|
+
}),
|
|
119
|
+
// Full archetype with all components
|
|
120
|
+
full1: database.transactions.createFullEntity({
|
|
121
|
+
position: 22,
|
|
122
|
+
health: 95,
|
|
123
|
+
name: "Henry",
|
|
124
|
+
score: 85.5,
|
|
125
|
+
active: true
|
|
126
|
+
}),
|
|
127
|
+
full2: database.transactions.createFullEntity({
|
|
128
|
+
position: 25,
|
|
129
|
+
health: 30,
|
|
130
|
+
name: "Iris",
|
|
131
|
+
score: 92.0,
|
|
132
|
+
active: false
|
|
133
|
+
}),
|
|
134
|
+
full3: database.transactions.createFullEntity({
|
|
135
|
+
position: 28,
|
|
136
|
+
health: 70,
|
|
137
|
+
name: "Jack",
|
|
138
|
+
score: 78.3,
|
|
139
|
+
active: true
|
|
140
|
+
}),
|
|
141
|
+
};
|
|
142
|
+
});
|
|
143
|
+
describe("Basic functionality", () => {
|
|
144
|
+
it("should observe entities with position component", () => {
|
|
145
|
+
const observer = vi.fn();
|
|
146
|
+
const unsubscribe = database.observe.select(["position"])(observer);
|
|
147
|
+
// Should include entities from position-only, position+health, position+name, and full archetypes
|
|
148
|
+
const expected = [
|
|
149
|
+
entities.pos1, entities.pos2, entities.pos3,
|
|
150
|
+
entities.posHealth1, entities.posHealth2,
|
|
151
|
+
entities.posName1, entities.posName2,
|
|
152
|
+
entities.full1, entities.full2, entities.full3
|
|
153
|
+
];
|
|
154
|
+
expect(observer).toHaveBeenCalledWith(expect.arrayContaining(expected));
|
|
155
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
156
|
+
unsubscribe();
|
|
157
|
+
});
|
|
158
|
+
it("should observe entities with health component", () => {
|
|
159
|
+
const observer = vi.fn();
|
|
160
|
+
const unsubscribe = database.observe.select(["health"])(observer);
|
|
161
|
+
// Should include entities from health-only, position+health, health+name, and full archetypes
|
|
162
|
+
const expected = [
|
|
163
|
+
entities.health1, entities.health2, entities.health3,
|
|
164
|
+
entities.posHealth1, entities.posHealth2,
|
|
165
|
+
entities.healthName1, entities.healthName2,
|
|
166
|
+
entities.full1, entities.full2, entities.full3
|
|
167
|
+
];
|
|
168
|
+
expect(observer).toHaveBeenCalledWith(expect.arrayContaining(expected));
|
|
169
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
170
|
+
unsubscribe();
|
|
171
|
+
});
|
|
172
|
+
it("should observe entities with name component", () => {
|
|
173
|
+
const observer = vi.fn();
|
|
174
|
+
const unsubscribe = database.observe.select(["name"])(observer);
|
|
175
|
+
// Should include entities from name-only, position+name, health+name, and full archetypes
|
|
176
|
+
const expected = [
|
|
177
|
+
entities.name1, entities.name2, entities.name3,
|
|
178
|
+
entities.posName1, entities.posName2,
|
|
179
|
+
entities.healthName1, entities.healthName2,
|
|
180
|
+
entities.full1, entities.full2, entities.full3
|
|
181
|
+
];
|
|
182
|
+
expect(observer).toHaveBeenCalledWith(expect.arrayContaining(expected));
|
|
183
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
184
|
+
unsubscribe();
|
|
185
|
+
});
|
|
186
|
+
it("should observe entities with multiple components", () => {
|
|
187
|
+
const observer = vi.fn();
|
|
188
|
+
const unsubscribe = database.observe.select(["position", "health"])(observer);
|
|
189
|
+
// Should only include entities from position+health and full archetypes
|
|
190
|
+
const expected = [
|
|
191
|
+
entities.posHealth1, entities.posHealth2,
|
|
192
|
+
entities.full1, entities.full2, entities.full3
|
|
193
|
+
];
|
|
194
|
+
expect(observer).toHaveBeenCalledWith(expect.arrayContaining(expected));
|
|
195
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
196
|
+
unsubscribe();
|
|
197
|
+
});
|
|
198
|
+
it("should observe entities with all components", () => {
|
|
199
|
+
const observer = vi.fn();
|
|
200
|
+
const unsubscribe = database.observe.select(["position", "health", "name", "score", "active"])(observer);
|
|
201
|
+
// Should only include entities from full archetype
|
|
202
|
+
const expected = [entities.full1, entities.full2, entities.full3];
|
|
203
|
+
expect(observer).toHaveBeenCalledWith(expect.arrayContaining(expected));
|
|
204
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
205
|
+
unsubscribe();
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
describe("Reactive updates", () => {
|
|
209
|
+
it("should notify when relevant components change", async () => {
|
|
210
|
+
const observer = vi.fn();
|
|
211
|
+
const unsubscribe = database.observe.select(["position"])(observer);
|
|
212
|
+
// Initial notification
|
|
213
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
214
|
+
const initialCall = observer.mock.calls[0][0];
|
|
215
|
+
expect(initialCall).toContain(entities.pos1);
|
|
216
|
+
// Update position component - should NOT trigger new notification since entity stays in result set
|
|
217
|
+
database.transactions.updateEntity({
|
|
218
|
+
entity: entities.pos1,
|
|
219
|
+
values: { position: 999 }
|
|
220
|
+
});
|
|
221
|
+
// Wait for microtask to complete
|
|
222
|
+
await Promise.resolve();
|
|
223
|
+
// Should still only be called once (no new notification since only values changed)
|
|
224
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
225
|
+
unsubscribe();
|
|
226
|
+
});
|
|
227
|
+
it("should not notify when irrelevant components change", async () => {
|
|
228
|
+
const observer = vi.fn();
|
|
229
|
+
const unsubscribe = database.observe.select(["position"])(observer);
|
|
230
|
+
// Initial notification
|
|
231
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
232
|
+
// Update health component - should NOT trigger notification for position query
|
|
233
|
+
database.transactions.updateEntity({
|
|
234
|
+
entity: entities.health1,
|
|
235
|
+
values: { health: 999 }
|
|
236
|
+
});
|
|
237
|
+
// Wait for microtask to complete
|
|
238
|
+
await Promise.resolve();
|
|
239
|
+
// Should still only be called once (no new notification)
|
|
240
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
241
|
+
unsubscribe();
|
|
242
|
+
});
|
|
243
|
+
it("should handle entity creation", async () => {
|
|
244
|
+
const observer = vi.fn();
|
|
245
|
+
const unsubscribe = database.observe.select(["position"])(observer);
|
|
246
|
+
// Initial notification
|
|
247
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
248
|
+
const initialCount = observer.mock.calls[0][0].length;
|
|
249
|
+
// Create new entity with position component
|
|
250
|
+
const newEntity = database.transactions.createPositionEntity({ position: 100 });
|
|
251
|
+
// Wait for microtask to complete
|
|
252
|
+
await Promise.resolve();
|
|
253
|
+
// Should get new notification with additional entity
|
|
254
|
+
expect(observer).toHaveBeenCalledTimes(2);
|
|
255
|
+
const updatedCall = observer.mock.calls[1][0];
|
|
256
|
+
expect(updatedCall).toContain(newEntity);
|
|
257
|
+
expect(updatedCall.length).toBe(initialCount + 1);
|
|
258
|
+
unsubscribe();
|
|
259
|
+
});
|
|
260
|
+
it("should handle entity deletion", async () => {
|
|
261
|
+
const observer = vi.fn();
|
|
262
|
+
const unsubscribe = database.observe.select(["position"])(observer);
|
|
263
|
+
// Initial notification
|
|
264
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
265
|
+
const initialCall = observer.mock.calls[0][0];
|
|
266
|
+
expect(initialCall).toContain(entities.pos1);
|
|
267
|
+
// Delete entity with position component
|
|
268
|
+
database.transactions.deleteEntity({ entity: entities.pos1 });
|
|
269
|
+
// Wait for microtask to complete
|
|
270
|
+
await Promise.resolve();
|
|
271
|
+
// Should get new notification without the deleted entity
|
|
272
|
+
expect(observer).toHaveBeenCalledTimes(2);
|
|
273
|
+
const updatedCall = observer.mock.calls[1][0];
|
|
274
|
+
expect(updatedCall).not.toContain(entities.pos1);
|
|
275
|
+
unsubscribe();
|
|
276
|
+
});
|
|
277
|
+
it("should handle entity updates", async () => {
|
|
278
|
+
const observer = vi.fn();
|
|
279
|
+
const unsubscribe = database.observe.select(["position", "health"])(observer);
|
|
280
|
+
// Initial notification
|
|
281
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
282
|
+
expect(observer.mock.calls[0][0]).toContain(entities.posHealth1);
|
|
283
|
+
// Update both position and health components - should NOT trigger new notification since entity stays in result set
|
|
284
|
+
database.transactions.updateEntity({
|
|
285
|
+
entity: entities.posHealth1,
|
|
286
|
+
values: { position: 999, health: 888 }
|
|
287
|
+
});
|
|
288
|
+
// Wait for microtask to complete
|
|
289
|
+
await Promise.resolve();
|
|
290
|
+
// Should still only be called once (no new notification since only values changed)
|
|
291
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
292
|
+
unsubscribe();
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
describe("Caching behavior", () => {
|
|
296
|
+
it("should cache observe functions for identical queries", () => {
|
|
297
|
+
const observer1 = vi.fn();
|
|
298
|
+
const observer2 = vi.fn();
|
|
299
|
+
// Create two observers with identical queries
|
|
300
|
+
const unsubscribe1 = database.observe.select(["position"])(observer1);
|
|
301
|
+
const unsubscribe2 = database.observe.select(["position"])(observer2);
|
|
302
|
+
// Both should be called with the same initial data
|
|
303
|
+
expect(observer1).toHaveBeenCalledTimes(1);
|
|
304
|
+
expect(observer2).toHaveBeenCalledTimes(1);
|
|
305
|
+
expect(observer1.mock.calls[0][0]).toEqual(observer2.mock.calls[0][0]);
|
|
306
|
+
// Verify they're the same function reference (cached)
|
|
307
|
+
const observe1 = database.observe.select(["position"]);
|
|
308
|
+
const observe2 = database.observe.select(["position"]);
|
|
309
|
+
expect(observe1).toBe(observe2);
|
|
310
|
+
unsubscribe1();
|
|
311
|
+
unsubscribe2();
|
|
312
|
+
});
|
|
313
|
+
it("should create new observe functions for different queries", () => {
|
|
314
|
+
const observer1 = vi.fn();
|
|
315
|
+
const observer2 = vi.fn();
|
|
316
|
+
// Create observers with different queries
|
|
317
|
+
const unsubscribe1 = database.observe.select(["position"])(observer1);
|
|
318
|
+
const unsubscribe2 = database.observe.select(["health"])(observer2);
|
|
319
|
+
// Both should be called with different initial data
|
|
320
|
+
expect(observer1).toHaveBeenCalledTimes(1);
|
|
321
|
+
expect(observer2).toHaveBeenCalledTimes(1);
|
|
322
|
+
expect(observer1.mock.calls[0][0]).not.toEqual(observer2.mock.calls[0][0]);
|
|
323
|
+
// Verify they're different function references
|
|
324
|
+
const observe1 = database.observe.select(["position"]);
|
|
325
|
+
const observe2 = database.observe.select(["health"]);
|
|
326
|
+
expect(observe1).not.toBe(observe2);
|
|
327
|
+
unsubscribe1();
|
|
328
|
+
unsubscribe2();
|
|
329
|
+
});
|
|
330
|
+
it("should batch multiple synchronous transactions into single notification", async () => {
|
|
331
|
+
const observer = vi.fn();
|
|
332
|
+
const unsubscribe = database.observe.select(["position"])(observer);
|
|
333
|
+
// Initial notification
|
|
334
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
335
|
+
const initialCount = observer.mock.calls[0][0].length;
|
|
336
|
+
// Execute multiple transactions synchronously
|
|
337
|
+
const entity1 = database.transactions.createPositionEntity({ position: 100 });
|
|
338
|
+
const entity2 = database.transactions.createPositionEntity({ position: 200 });
|
|
339
|
+
const entity3 = database.transactions.createPositionEntity({ position: 300 });
|
|
340
|
+
// Wait for microtask to complete
|
|
341
|
+
await Promise.resolve();
|
|
342
|
+
// Should only get one additional notification (not three)
|
|
343
|
+
expect(observer).toHaveBeenCalledTimes(2);
|
|
344
|
+
const updatedCall = observer.mock.calls[1][0];
|
|
345
|
+
expect(updatedCall).toContain(entity1);
|
|
346
|
+
expect(updatedCall).toContain(entity2);
|
|
347
|
+
expect(updatedCall).toContain(entity3);
|
|
348
|
+
expect(updatedCall.length).toBe(initialCount + 3);
|
|
349
|
+
unsubscribe();
|
|
350
|
+
});
|
|
351
|
+
it("should handle mixed synchronous and asynchronous transactions", async () => {
|
|
352
|
+
const observer = vi.fn();
|
|
353
|
+
const unsubscribe = database.observe.select(["position"])(observer);
|
|
354
|
+
// Initial notification
|
|
355
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
356
|
+
const initialCount = observer.mock.calls[0][0].length;
|
|
357
|
+
// First synchronous transaction
|
|
358
|
+
const entity1 = database.transactions.createPositionEntity({ position: 100 });
|
|
359
|
+
// Wait for microtask
|
|
360
|
+
await Promise.resolve();
|
|
361
|
+
// Second synchronous transaction
|
|
362
|
+
const entity2 = database.transactions.createPositionEntity({ position: 200 });
|
|
363
|
+
// Wait for microtask
|
|
364
|
+
await Promise.resolve();
|
|
365
|
+
// Should get two additional notifications (one for each batch)
|
|
366
|
+
expect(observer).toHaveBeenCalledTimes(3);
|
|
367
|
+
const firstUpdate = observer.mock.calls[1][0];
|
|
368
|
+
expect(firstUpdate).toContain(entity1);
|
|
369
|
+
expect(firstUpdate.length).toBe(initialCount + 1);
|
|
370
|
+
const secondUpdate = observer.mock.calls[2][0];
|
|
371
|
+
expect(secondUpdate).toContain(entity2);
|
|
372
|
+
expect(secondUpdate.length).toBe(initialCount + 2);
|
|
373
|
+
unsubscribe();
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
describe("Filtering and ordering", () => {
|
|
377
|
+
it("should support where clause filtering", () => {
|
|
378
|
+
const observer = vi.fn();
|
|
379
|
+
const unsubscribe = database.observe.select(["name"], {
|
|
380
|
+
where: { name: "Alice" }
|
|
381
|
+
})(observer);
|
|
382
|
+
// Should only include the entity with name "Alice"
|
|
383
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
384
|
+
const result = observer.mock.calls[0][0];
|
|
385
|
+
expect(result).toHaveLength(1);
|
|
386
|
+
expect(result).toContain(entities.name1);
|
|
387
|
+
unsubscribe();
|
|
388
|
+
});
|
|
389
|
+
it("should support numeric comparison filtering", () => {
|
|
390
|
+
const observer = vi.fn();
|
|
391
|
+
const unsubscribe = database.observe.select(["score"], {
|
|
392
|
+
where: { score: { ">": 80 } }
|
|
393
|
+
})(observer);
|
|
394
|
+
// Should only include entities with score > 80
|
|
395
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
396
|
+
const result = observer.mock.calls[0][0];
|
|
397
|
+
expect(result).toHaveLength(2);
|
|
398
|
+
expect(result).toContain(entities.full1); // score: 85.5
|
|
399
|
+
expect(result).toContain(entities.full2); // score: 92.0
|
|
400
|
+
unsubscribe();
|
|
401
|
+
});
|
|
402
|
+
it("should support boolean filtering", () => {
|
|
403
|
+
const observer = vi.fn();
|
|
404
|
+
const unsubscribe = database.observe.select(["active"], {
|
|
405
|
+
where: { active: true }
|
|
406
|
+
})(observer);
|
|
407
|
+
// Should only include entities with active: true
|
|
408
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
409
|
+
const result = observer.mock.calls[0][0];
|
|
410
|
+
expect(result).toHaveLength(2);
|
|
411
|
+
expect(result).toContain(entities.full1);
|
|
412
|
+
expect(result).toContain(entities.full3);
|
|
413
|
+
unsubscribe();
|
|
414
|
+
});
|
|
415
|
+
it("should support multiple condition filtering", () => {
|
|
416
|
+
const observer = vi.fn();
|
|
417
|
+
const unsubscribe = database.observe.select(["position", "health"], {
|
|
418
|
+
where: {
|
|
419
|
+
position: 22,
|
|
420
|
+
health: 95
|
|
421
|
+
}
|
|
422
|
+
})(observer);
|
|
423
|
+
// Should only include entities with exact position and health values
|
|
424
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
425
|
+
const result = observer.mock.calls[0][0];
|
|
426
|
+
expect(result).toHaveLength(1);
|
|
427
|
+
expect(result).toContain(entities.full1);
|
|
428
|
+
unsubscribe();
|
|
429
|
+
});
|
|
430
|
+
it("should support order clause sorting", () => {
|
|
431
|
+
const observer = vi.fn();
|
|
432
|
+
const unsubscribe = database.observe.select(["score"], {
|
|
433
|
+
order: { score: true }
|
|
434
|
+
})(observer);
|
|
435
|
+
// Should be ordered by score ascending
|
|
436
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
437
|
+
const result = observer.mock.calls[0][0];
|
|
438
|
+
expect(result).toHaveLength(3);
|
|
439
|
+
expect(result[0]).toBe(entities.full3); // 78.3
|
|
440
|
+
expect(result[1]).toBe(entities.full1); // 85.5
|
|
441
|
+
expect(result[2]).toBe(entities.full2); // 92.0
|
|
442
|
+
unsubscribe();
|
|
443
|
+
});
|
|
444
|
+
it("should support descending order", () => {
|
|
445
|
+
const observer = vi.fn();
|
|
446
|
+
const unsubscribe = database.observe.select(["score"], {
|
|
447
|
+
order: { score: false }
|
|
448
|
+
})(observer);
|
|
449
|
+
// Should be ordered by score descending
|
|
450
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
451
|
+
const result = observer.mock.calls[0][0];
|
|
452
|
+
expect(result).toHaveLength(3);
|
|
453
|
+
expect(result[0]).toBe(entities.full2); // 92.0
|
|
454
|
+
expect(result[1]).toBe(entities.full1); // 85.5
|
|
455
|
+
expect(result[2]).toBe(entities.full3); // 78.3
|
|
456
|
+
unsubscribe();
|
|
457
|
+
});
|
|
458
|
+
it("should support string ordering", () => {
|
|
459
|
+
const observer = vi.fn();
|
|
460
|
+
const unsubscribe = database.observe.select(["name"], {
|
|
461
|
+
order: { name: true }
|
|
462
|
+
})(observer);
|
|
463
|
+
// Should be ordered alphabetically
|
|
464
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
465
|
+
const result = observer.mock.calls[0][0];
|
|
466
|
+
expect(result).toHaveLength(10);
|
|
467
|
+
expect(result[0]).toBe(entities.name1); // Alice
|
|
468
|
+
expect(result[1]).toBe(entities.name2); // Bob
|
|
469
|
+
expect(result[2]).toBe(entities.name3); // Charlie
|
|
470
|
+
unsubscribe();
|
|
471
|
+
});
|
|
472
|
+
it("should support combined filtering and ordering", () => {
|
|
473
|
+
const observer = vi.fn();
|
|
474
|
+
const unsubscribe = database.observe.select(["score"], {
|
|
475
|
+
where: { score: { ">": 80 } },
|
|
476
|
+
order: { score: true }
|
|
477
|
+
})(observer);
|
|
478
|
+
// Should filter to score > 80 and order ascending
|
|
479
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
480
|
+
const result = observer.mock.calls[0][0];
|
|
481
|
+
expect(result).toHaveLength(2);
|
|
482
|
+
expect(result[0]).toBe(entities.full1); // 85.5
|
|
483
|
+
expect(result[1]).toBe(entities.full2); // 92.0
|
|
484
|
+
unsubscribe();
|
|
485
|
+
});
|
|
486
|
+
it("should handle empty results from filtering", () => {
|
|
487
|
+
const observer = vi.fn();
|
|
488
|
+
const unsubscribe = database.observe.select(["name"], {
|
|
489
|
+
where: { name: "NonExistent" }
|
|
490
|
+
})(observer);
|
|
491
|
+
// Should return empty array for non-existent name
|
|
492
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
493
|
+
const result = observer.mock.calls[0][0];
|
|
494
|
+
expect(result).toHaveLength(0);
|
|
495
|
+
unsubscribe();
|
|
496
|
+
});
|
|
497
|
+
it("should reactively update filtered results", async () => {
|
|
498
|
+
const observer = vi.fn();
|
|
499
|
+
const unsubscribe = database.observe.select(["score"], {
|
|
500
|
+
where: { score: { ">": 80 } }
|
|
501
|
+
})(observer);
|
|
502
|
+
// Initial notification
|
|
503
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
504
|
+
const initialResult = observer.mock.calls[0][0];
|
|
505
|
+
expect(initialResult).toHaveLength(2);
|
|
506
|
+
// Update score to make it eligible for the filter
|
|
507
|
+
database.transactions.updateEntity({
|
|
508
|
+
entity: entities.full3,
|
|
509
|
+
values: { score: 95.0 }
|
|
510
|
+
});
|
|
511
|
+
// Wait for microtask to complete
|
|
512
|
+
await Promise.resolve();
|
|
513
|
+
// Should get new notification with updated results
|
|
514
|
+
expect(observer).toHaveBeenCalledTimes(2);
|
|
515
|
+
const updatedResult = observer.mock.calls[1][0];
|
|
516
|
+
expect(updatedResult).toHaveLength(3);
|
|
517
|
+
expect(updatedResult).toContain(entities.full3);
|
|
518
|
+
unsubscribe();
|
|
519
|
+
});
|
|
520
|
+
it("should reactively update ordered results", async () => {
|
|
521
|
+
const observer = vi.fn();
|
|
522
|
+
const unsubscribe = database.observe.select(["score"], {
|
|
523
|
+
order: { score: true }
|
|
524
|
+
})(observer);
|
|
525
|
+
// Initial notification
|
|
526
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
527
|
+
const initialResult = observer.mock.calls[0][0];
|
|
528
|
+
expect(initialResult[0]).toBe(entities.full3); // 78.3
|
|
529
|
+
// Update score to change the order
|
|
530
|
+
database.transactions.updateEntity({
|
|
531
|
+
entity: entities.full3,
|
|
532
|
+
values: { score: 100.0 }
|
|
533
|
+
});
|
|
534
|
+
// Wait for microtask to complete
|
|
535
|
+
await Promise.resolve();
|
|
536
|
+
// Should get new notification with reordered results
|
|
537
|
+
expect(observer).toHaveBeenCalledTimes(2);
|
|
538
|
+
const updatedResult = observer.mock.calls[1][0];
|
|
539
|
+
expect(updatedResult[2]).toBe(entities.full3); // Now last (100.0)
|
|
540
|
+
unsubscribe();
|
|
541
|
+
});
|
|
542
|
+
});
|
|
543
|
+
});
|
|
544
|
+
//# sourceMappingURL=observe-select-entities.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observe-select-entities.test.js","sourceRoot":"","sources":["../../../src/ecs/database/observe-select-entities.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { patchEntityValues } from "./patch-entity-values.js";
|
|
1
2
|
// Sentinel value used to indicate a component should be deleted
|
|
2
3
|
const DELETE = "_$_DELETE_$_";
|
|
3
4
|
export function createTransactionalStore(store) {
|
|
@@ -5,7 +6,7 @@ export function createTransactionalStore(store) {
|
|
|
5
6
|
let undoOperationsInReverseOrder = [];
|
|
6
7
|
let redoOperations = [];
|
|
7
8
|
const changed = {
|
|
8
|
-
entities: new
|
|
9
|
+
entities: new Map(),
|
|
9
10
|
components: new Set(),
|
|
10
11
|
archetypes: new Set(),
|
|
11
12
|
};
|
|
@@ -21,7 +22,7 @@ export function createTransactionalStore(store) {
|
|
|
21
22
|
values: values,
|
|
22
23
|
});
|
|
23
24
|
undoOperationsInReverseOrder.push({ type: "delete", entity });
|
|
24
|
-
changed.entities.
|
|
25
|
+
changed.entities.set(entity, values);
|
|
25
26
|
changed.archetypes.add(id);
|
|
26
27
|
for (const key in values) {
|
|
27
28
|
changed.components.add(key);
|
|
@@ -59,17 +60,17 @@ export function createTransactionalStore(store) {
|
|
|
59
60
|
changed.components.add(name);
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
|
-
changed.entities.
|
|
63
|
+
changed.entities.set(entity, patchEntityValues(changed.entities.get(entity), values));
|
|
63
64
|
const location = store.locate(entity);
|
|
64
65
|
if (location) {
|
|
65
|
-
changed.archetypes.add(location.archetype);
|
|
66
|
+
changed.archetypes.add(location.archetype.id);
|
|
66
67
|
}
|
|
67
68
|
// Perform the actual update
|
|
68
69
|
store.update(entity, values);
|
|
69
70
|
// Check if archetype changed after update
|
|
70
71
|
const newLocation = store.locate(entity);
|
|
71
72
|
if (newLocation) {
|
|
72
|
-
changed.archetypes.add(newLocation.archetype);
|
|
73
|
+
changed.archetypes.add(newLocation.archetype.id);
|
|
73
74
|
}
|
|
74
75
|
// Add operations with potential combining
|
|
75
76
|
addUpdateOperationsMaybeCombineLast(undoOperationsInReverseOrder, redoOperations, entity, values, replacedValues);
|
|
@@ -78,9 +79,9 @@ export function createTransactionalStore(store) {
|
|
|
78
79
|
const deleteEntity = (entity) => {
|
|
79
80
|
const location = store.locate(entity);
|
|
80
81
|
if (location) {
|
|
81
|
-
changed.archetypes.add(location.archetype);
|
|
82
|
+
changed.archetypes.add(location.archetype.id);
|
|
82
83
|
}
|
|
83
|
-
changed.entities.
|
|
84
|
+
changed.entities.set(entity, null);
|
|
84
85
|
const oldValues = store.read(entity);
|
|
85
86
|
if (!oldValues) {
|
|
86
87
|
throw new Error(`Entity not found: ${entity}`);
|
|
@@ -109,6 +110,7 @@ export function createTransactionalStore(store) {
|
|
|
109
110
|
// Create transaction-aware store
|
|
110
111
|
const transactionStore = {
|
|
111
112
|
...store,
|
|
113
|
+
archetypes: Object.fromEntries(Object.entries(store.archetypes).map(([key, value]) => [key, getWrappedArchetype(value)])),
|
|
112
114
|
resources,
|
|
113
115
|
ensureArchetype: (componentNames) => {
|
|
114
116
|
const archetype = store.ensureArchetype(componentNames);
|
|
@@ -134,7 +136,7 @@ export function createTransactionalStore(store) {
|
|
|
134
136
|
transient: options?.transient ?? false,
|
|
135
137
|
redo: [...redoOperations],
|
|
136
138
|
undo: [...undoOperationsInReverseOrder.reverse()],
|
|
137
|
-
changedEntities: new
|
|
139
|
+
changedEntities: new Map(changed.entities),
|
|
138
140
|
changedComponents: new Set(changed.components),
|
|
139
141
|
changedArchetypes: new Set(changed.archetypes),
|
|
140
142
|
};
|