@vworlds/vecs 1.0.20 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +84 -99
- package/dist/component.d.ts +5 -2
- package/dist/component.js +4 -57
- package/dist/component.js.map +1 -1
- package/dist/component_meta.d.ts +15 -8
- package/dist/component_meta.js +6 -4
- package/dist/component_meta.js.map +1 -1
- package/dist/dsl.d.ts +56 -11
- package/dist/dsl.js +55 -38
- package/dist/dsl.js.map +1 -1
- package/dist/entity/entity.base.d.ts +4 -3
- package/dist/entity/entity.base.js +4 -4
- package/dist/entity/entity.base.js.map +1 -1
- package/dist/entity/entity.components.d.ts +16 -7
- package/dist/entity/entity.components.js +48 -23
- package/dist/entity/entity.components.js.map +1 -1
- package/dist/entity/entity.d.ts +5 -1
- package/dist/entity/entity.js +5 -0
- package/dist/entity/entity.js.map +1 -1
- package/dist/entity/entity.lifecycle.js +25 -25
- package/dist/entity/entity.lifecycle.js.map +1 -1
- package/dist/entity/entity.queries.js +0 -6
- package/dist/entity/entity.queries.js.map +1 -1
- package/dist/entity/entity.relationships.d.ts +1 -1
- package/dist/entity/entity.relationships.js +7 -5
- package/dist/entity/entity.relationships.js.map +1 -1
- package/dist/entity/index.d.ts +1 -1
- package/dist/entity/index.js.map +1 -1
- package/dist/filter.d.ts +6 -6
- package/dist/filter.js +2 -1
- package/dist/filter.js.map +1 -1
- package/dist/index.d.ts +10 -6
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/inject.d.ts +18 -17
- package/dist/inject.js +34 -34
- package/dist/inject.js.map +1 -1
- package/dist/module.d.ts +4 -4
- package/dist/module.js +0 -3
- package/dist/module.js.map +1 -1
- package/dist/modules/pipeline.d.ts +20 -0
- package/dist/modules/pipeline.js +57 -0
- package/dist/modules/pipeline.js.map +1 -0
- package/dist/modules/relationship_types.d.ts +37 -0
- package/dist/modules/relationship_types.js +39 -0
- package/dist/modules/relationship_types.js.map +1 -0
- package/dist/modules/relationships.d.ts +24 -0
- package/dist/modules/relationships.js +82 -0
- package/dist/modules/relationships.js.map +1 -0
- package/dist/modules/singleton.js +1 -2
- package/dist/modules/singleton.js.map +1 -1
- package/dist/package.json +2 -2
- package/dist/query/callbacks.d.ts +17 -0
- package/dist/query/callbacks.js +113 -0
- package/dist/query/callbacks.js.map +1 -0
- package/dist/query/constants.d.ts +1 -0
- package/dist/query/constants.js +2 -0
- package/dist/query/constants.js.map +1 -0
- package/dist/query/{query.03.tracking.d.ts → group.d.ts} +11 -9
- package/dist/query/group.js +31 -0
- package/dist/query/group.js.map +1 -0
- package/dist/query/grouped_query.d.ts +26 -0
- package/dist/query/grouped_query.js +121 -0
- package/dist/query/grouped_query.js.map +1 -0
- package/dist/query/grouped_query_registry.d.ts +4 -0
- package/dist/query/grouped_query_registry.js +11 -0
- package/dist/query/grouped_query_registry.js.map +1 -0
- package/dist/query/grouping.d.ts +24 -0
- package/dist/query/{query.07.groups.js → grouping.js} +29 -60
- package/dist/query/grouping.js.map +1 -0
- package/dist/query/index.d.ts +6 -6
- package/dist/query/index.js +6 -4
- package/dist/query/index.js.map +1 -1
- package/dist/query/query.d.ts +58 -28
- package/dist/query/query.js +334 -88
- package/dist/query/query.js.map +1 -1
- package/dist/system.d.ts +24 -54
- package/dist/system.js +47 -81
- package/dist/system.js.map +1 -1
- package/dist/terms/all_term.d.ts +2 -6
- package/dist/terms/all_term.js +2 -7
- package/dist/terms/all_term.js.map +1 -1
- package/dist/terms/any_term.d.ts +2 -6
- package/dist/terms/any_term.js +2 -7
- package/dist/terms/any_term.js.map +1 -1
- package/dist/terms/build.d.ts +9 -6
- package/dist/terms/build.js +17 -14
- package/dist/terms/build.js.map +1 -1
- package/dist/terms/component_term.d.ts +3 -3
- package/dist/terms/component_term.js.map +1 -1
- package/dist/terms/composite_build.d.ts +32 -0
- package/dist/terms/composite_build.js +28 -0
- package/dist/terms/composite_build.js.map +1 -0
- package/dist/terms/only_term.d.ts +3 -3
- package/dist/terms/only_term.js.map +1 -1
- package/dist/terms/predicate_term.d.ts +3 -3
- package/dist/terms/predicate_term.js +3 -3
- package/dist/terms/predicate_term.js.map +1 -1
- package/dist/terms/target_term.d.ts +3 -2
- package/dist/terms/target_term.js +11 -17
- package/dist/terms/target_term.js.map +1 -1
- package/dist/util/dense_set.js +1 -1
- package/dist/util/id_pool.d.ts +2 -0
- package/dist/util/id_pool.js +10 -0
- package/dist/util/id_pool.js.map +1 -1
- package/dist/util/ordered_set.js +15 -10
- package/dist/util/ordered_set.js.map +1 -1
- package/dist/world/world.components.d.ts +5 -9
- package/dist/world/world.components.js +16 -28
- package/dist/world/world.components.js.map +1 -1
- package/dist/world/world.d.ts +3 -6
- package/dist/world/world.entities.d.ts +2 -2
- package/dist/world/world.entities.js.map +1 -1
- package/dist/world/world.js +10 -10
- package/dist/world/world.js.map +1 -1
- package/dist/world/world.modules.d.ts +4 -7
- package/dist/world/world.modules.js +13 -10
- package/dist/world/world.modules.js.map +1 -1
- package/dist/world/world.pipeline.d.ts +5 -8
- package/dist/world/world.pipeline.js +24 -53
- package/dist/world/world.pipeline.js.map +1 -1
- package/dist/world/world.pools.d.ts +2 -1
- package/dist/world/world.pools.js.map +1 -1
- package/dist/world/world.queries.d.ts +3 -5
- package/dist/world/world.queries.js +11 -8
- package/dist/world/world.queries.js.map +1 -1
- package/package.json +2 -2
- package/dist/phase.d.ts +0 -29
- package/dist/phase.js +0 -24
- package/dist/phase.js.map +0 -1
- package/dist/query/query.00.base.d.ts +0 -23
- package/dist/query/query.00.base.js +0 -77
- package/dist/query/query.00.base.js.map +0 -1
- package/dist/query/query.01.reactive.d.ts +0 -7
- package/dist/query/query.01.reactive.js +0 -58
- package/dist/query/query.01.reactive.js.map +0 -1
- package/dist/query/query.02.lifecycle.d.ts +0 -6
- package/dist/query/query.02.lifecycle.js +0 -63
- package/dist/query/query.02.lifecycle.js.map +0 -1
- package/dist/query/query.03.tracking.js +0 -31
- package/dist/query/query.03.tracking.js.map +0 -1
- package/dist/query/query.04.callbacks.d.ts +0 -14
- package/dist/query/query.04.callbacks.js +0 -65
- package/dist/query/query.04.callbacks.js.map +0 -1
- package/dist/query/query.05.updates.d.ts +0 -14
- package/dist/query/query.05.updates.js +0 -81
- package/dist/query/query.05.updates.js.map +0 -1
- package/dist/query/query.06.predicate.d.ts +0 -13
- package/dist/query/query.06.predicate.js +0 -40
- package/dist/query/query.06.predicate.js.map +0 -1
- package/dist/query/query.07.groups.d.ts +0 -41
- package/dist/query/query.07.groups.js.map +0 -1
- package/dist/relationship.d.ts +0 -19
- package/dist/relationship.js +0 -18
- package/dist/relationship.js.map +0 -1
package/dist/query/query.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import { type ComponentType } from "../component.js";
|
|
1
|
+
import { type ComponentRef, type ComponentType } from "../component.js";
|
|
2
|
+
import { type ExtractSpecsRequired, type QueryDSL, type QuerySpec } from "../dsl.js";
|
|
3
|
+
import { Entity } from "../entity/index.js";
|
|
4
|
+
import { Iter, type FanInjectTuple, type InjectTuple, type MaybeResolvedInjectTuple, type RequiredResolvedInjectTuple } from "../inject.js";
|
|
5
|
+
import { TermConsumer, TermEventKind, type Term } from "../terms/term.js";
|
|
2
6
|
import { type World } from "../world/index.js";
|
|
3
|
-
import {
|
|
4
|
-
import { Groups } from "./query.07.groups.js";
|
|
7
|
+
import { type GroupedQuery } from "./grouped_query.js";
|
|
5
8
|
/**
|
|
6
9
|
* A reactive, always-up-to-date set of entities matching a {@link QueryDSL}
|
|
7
10
|
* predicate.
|
|
@@ -21,33 +24,60 @@ import { Groups } from "./query.07.groups.js";
|
|
|
21
24
|
* you want a reactive entity set without pipeline integration.
|
|
22
25
|
*
|
|
23
26
|
* @typeParam R - Component classes guaranteed present on every matched entity
|
|
24
|
-
* (declared via {@link
|
|
25
|
-
* Components in `R` appear as non-nullable in {@link
|
|
27
|
+
* (declared via {@link with} or the `hint` field of a {@link QueryConfig}).
|
|
28
|
+
* Components in `R` appear as non-nullable in {@link orderBy}, {@link forEach},
|
|
26
29
|
* and {@link update} callback tuples.
|
|
27
30
|
*/
|
|
28
|
-
export declare class Query<R extends ComponentType[] = []>
|
|
31
|
+
export declare class Query<R extends ComponentType[] = []> implements TermConsumer {
|
|
32
|
+
/** True when membership or watched component data changed since the last reset. */
|
|
33
|
+
changed: boolean;
|
|
34
|
+
/** Entity that stores this query as a component and carries query traits. */
|
|
35
|
+
readonly entity: Entity;
|
|
36
|
+
/** Materialized root term that owns membership for this query. */
|
|
37
|
+
rootTerm: Term | undefined;
|
|
29
38
|
constructor(name: string, world: World, track?: boolean);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
39
|
+
/** `true` once this query has been registered with its world. */
|
|
40
|
+
get built(): boolean;
|
|
41
|
+
/** Unique display name; forwards to the backing entity identity. */
|
|
42
|
+
get name(): string | undefined;
|
|
43
|
+
/** World that owns this query; forwards to the backing entity. */
|
|
44
|
+
get world(): World;
|
|
45
|
+
get count(): number;
|
|
46
|
+
[Symbol.iterator](): IterableIterator<Entity>;
|
|
47
|
+
belongs(e: Entity): boolean;
|
|
48
|
+
has(e: Entity): boolean;
|
|
49
|
+
forEach(callback: (e: Entity) => void): this;
|
|
50
|
+
forEach<J extends FanInjectTuple>(components: readonly [...J], callback: (e: Entity, resolved: MaybeResolvedInjectTuple<J, R>) => void): this;
|
|
51
|
+
forEach<J extends FanInjectTuple>(cursor: typeof Entity, components: readonly [...J], callback: (e: Entity, resolved: MaybeResolvedInjectTuple<J, R>) => void): this;
|
|
52
|
+
forEach<J extends FanInjectTuple>(cursor: typeof Iter, components: readonly [...J], callback: (it: Iter, resolved: MaybeResolvedInjectTuple<J, R>) => void): this;
|
|
53
|
+
toString(): string;
|
|
54
|
+
with<const S extends readonly QuerySpec[]>(...specs: [...S]): Query<[...R, ...ExtractSpecsRequired<S>]>;
|
|
55
|
+
without(dsl: QueryDSL): this;
|
|
56
|
+
track(): this;
|
|
57
|
+
orderBy<J extends InjectTuple>(components: readonly [...J], compare: (entityA: Entity, a: MaybeResolvedInjectTuple<J, R>, entityB: Entity, b: MaybeResolvedInjectTuple<J, R>) => number): this;
|
|
58
|
+
orderBy<J extends InjectTuple>(cursor: typeof Entity, components: readonly [...J], compare: (entityA: Entity, a: MaybeResolvedInjectTuple<J, R>, entityB: Entity, b: MaybeResolvedInjectTuple<J, R>) => number): this;
|
|
59
|
+
orderBy<J extends InjectTuple>(cursor: typeof Iter, components: readonly [...J], compare: (a: Iter, aResolved: MaybeResolvedInjectTuple<J, R>, b: Iter, bResolved: MaybeResolvedInjectTuple<J, R>) => number): this;
|
|
60
|
+
cascade(rel: ComponentRef): this;
|
|
61
|
+
cascade(rel: ComponentRef, compare: (a: Entity, b: Entity) => number): this;
|
|
62
|
+
groupBy<K, J extends FanInjectTuple>(components: readonly [...J], key: (e: Entity, resolved: MaybeResolvedInjectTuple<J, R>) => K): GroupedQuery<K, R>;
|
|
63
|
+
groupBy(relationship: ComponentRef): GroupedQuery<Entity, R>;
|
|
64
|
+
ignoreSource(source: QueryDSL | Query): this;
|
|
65
|
+
enter<J extends InjectTuple>(inject: readonly [...J], callback: (e: Entity, injected: RequiredResolvedInjectTuple<J>) => void): this;
|
|
66
|
+
enter<J extends InjectTuple>(cursor: typeof Entity, inject: readonly [...J], callback: (e: Entity, injected: RequiredResolvedInjectTuple<J>) => void): this;
|
|
67
|
+
enter<J extends InjectTuple>(cursor: typeof Iter, inject: readonly [...J], callback: (it: Iter, injected: RequiredResolvedInjectTuple<J>) => void): this;
|
|
68
|
+
enter(callback: (e: Entity) => void): this;
|
|
69
|
+
exit<J extends InjectTuple>(inject: readonly [...J], callback: (e: Entity, injected: RequiredResolvedInjectTuple<J>) => void): this;
|
|
70
|
+
exit<J extends InjectTuple>(cursor: typeof Entity, inject: readonly [...J], callback: (e: Entity, injected: RequiredResolvedInjectTuple<J>) => void): this;
|
|
71
|
+
exit<J extends InjectTuple>(cursor: typeof Iter, inject: readonly [...J], callback: (it: Iter, injected: RequiredResolvedInjectTuple<J>) => void): this;
|
|
72
|
+
exit(callback: (e: Entity) => void): this;
|
|
73
|
+
update<C extends ComponentType>(ComponentClass: C, callback: (e: Entity, c: InstanceType<C>) => void): this;
|
|
74
|
+
update<C extends ComponentType, J extends InjectTuple>(ComponentClass: C, inject: readonly [...J], callback: (e: Entity, c: InstanceType<C>, injected: MaybeResolvedInjectTuple<J, R>) => void): this;
|
|
75
|
+
update<C extends ComponentType, J extends InjectTuple>(cursor: typeof Entity, ComponentClass: C, inject: readonly [...J], callback: (e: Entity, c: InstanceType<C>, injected: MaybeResolvedInjectTuple<J, R>) => void): this;
|
|
76
|
+
update<C extends ComponentType>(cursor: typeof Entity, ComponentClass: C, callback: (e: Entity, c: InstanceType<C>) => void): this;
|
|
77
|
+
update<C extends ComponentType, J extends InjectTuple>(cursor: typeof Iter, ComponentClass: C, inject: readonly [...J], callback: (it: Iter, c: InstanceType<C>, injected: MaybeResolvedInjectTuple<J, R>) => void): this;
|
|
78
|
+
build(): this;
|
|
52
79
|
destroy(): void;
|
|
80
|
+
onTermEvent(kind: TermEventKind, entity: Entity): void;
|
|
81
|
+
private _buildSilenceQuery;
|
|
82
|
+
private _reSortCascade;
|
|
53
83
|
}
|
package/dist/query/query.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { containsDownTerm, isQueryConfig, } from "../dsl.js";
|
|
2
|
+
import { forEachInjected, } from "../inject.js";
|
|
3
|
+
import { SilenceSource, Traversable } from "../modules/relationships.js";
|
|
4
|
+
import { ArrayMap } from "../util/array_map.js";
|
|
5
|
+
import { Bitset } from "../util/bitset.js";
|
|
6
|
+
import { OrderedSet } from "../util/ordered_set.js";
|
|
7
|
+
import { makeEnterCallback, makeExitCallback, makeSortedEntitySet, makeUpdateRegistration, } from "./callbacks.js";
|
|
8
|
+
import { SOURCE_TRACKED_QUERY_ERROR } from "./constants.js";
|
|
9
|
+
import { getGroupedQueryPrototype } from "./grouped_query_registry.js";
|
|
10
|
+
const EMPTY_ENTITIES = new Set();
|
|
7
11
|
/**
|
|
8
12
|
* A reactive, always-up-to-date set of entities matching a {@link QueryDSL}
|
|
9
13
|
* predicate.
|
|
@@ -23,116 +27,358 @@ import { Groups } from "./query.07.groups.js";
|
|
|
23
27
|
* you want a reactive entity set without pipeline integration.
|
|
24
28
|
*
|
|
25
29
|
* @typeParam R - Component classes guaranteed present on every matched entity
|
|
26
|
-
* (declared via {@link
|
|
27
|
-
* Components in `R` appear as non-nullable in {@link
|
|
30
|
+
* (declared via {@link with} or the `hint` field of a {@link QueryConfig}).
|
|
31
|
+
* Components in `R` appear as non-nullable in {@link orderBy}, {@link forEach},
|
|
28
32
|
* and {@link update} callback tuples.
|
|
29
33
|
*/
|
|
30
|
-
export class Query
|
|
34
|
+
export class Query {
|
|
31
35
|
constructor(name, world, track = true) {
|
|
32
|
-
|
|
36
|
+
/** True when membership or watched component data changed since the last reset. */
|
|
37
|
+
this.changed = false;
|
|
38
|
+
/** @internal DSL predicate used to build the root membership term. */
|
|
39
|
+
this._dsl = undefined;
|
|
40
|
+
/** @internal `enter` callback (already wraps any injection logic). */
|
|
41
|
+
this._enterCallback = undefined;
|
|
42
|
+
/** @internal `exit` callback (already wraps any injection logic). */
|
|
43
|
+
this._exitCallback = undefined;
|
|
44
|
+
/** @internal Component eids the exit callback needs snapshotted before component removal. */
|
|
45
|
+
this._exitSnapshotTypes = undefined;
|
|
46
|
+
/** @internal Whether membership APIs are enabled for this query. */
|
|
47
|
+
this._tracking = false;
|
|
48
|
+
/** @internal Bitmask of component eids this query reacts to via `update`. */
|
|
49
|
+
this._watchlistBitmask = new Bitset();
|
|
50
|
+
/** @internal `true` once this query has been registered with its world. */
|
|
51
|
+
this._built = false;
|
|
52
|
+
/** @internal Guards destroy hooks against recursive removal. */
|
|
53
|
+
this._destroyed = false;
|
|
54
|
+
/** @internal `true` once `with` has set an explicit predicate. */
|
|
55
|
+
this._hasExplicitQuery = false;
|
|
56
|
+
/** @internal Per-component-eid `update` callbacks. */
|
|
57
|
+
this._componentUpdateCallbacks = new ArrayMap();
|
|
58
|
+
this._queryComponentClass = Query;
|
|
59
|
+
this.entity = world.entity();
|
|
60
|
+
this.entity.name = name;
|
|
61
|
+
this.entity.attach(Query, this);
|
|
62
|
+
world._addUnbuiltQuery(this);
|
|
63
|
+
if (track) {
|
|
64
|
+
this.track();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/* -------------------------------------------------------------------------
|
|
68
|
+
* Identity And Membership Views
|
|
69
|
+
* -------------------------------------------------------------------------
|
|
70
|
+
* Read-only accessors over the backing entity and current matched set. These
|
|
71
|
+
* methods do not change query configuration or world registration state.
|
|
72
|
+
*/
|
|
73
|
+
/** `true` once this query has been registered with its world. */
|
|
74
|
+
get built() {
|
|
75
|
+
return this._built;
|
|
76
|
+
}
|
|
77
|
+
/** Unique display name; forwards to the backing entity identity. */
|
|
78
|
+
get name() {
|
|
79
|
+
return this.entity.name;
|
|
80
|
+
}
|
|
81
|
+
/** World that owns this query; forwards to the backing entity. */
|
|
82
|
+
get world() {
|
|
83
|
+
return this.entity.world;
|
|
84
|
+
}
|
|
85
|
+
get count() {
|
|
86
|
+
if (!this._tracking) {
|
|
87
|
+
return 0;
|
|
88
|
+
}
|
|
89
|
+
return this._entities?.size ?? this.rootTerm?.count ?? 0;
|
|
90
|
+
}
|
|
91
|
+
[Symbol.iterator]() {
|
|
92
|
+
return this._matchedEntities()[Symbol.iterator]();
|
|
93
|
+
}
|
|
94
|
+
belongs(e) {
|
|
95
|
+
return this.rootTerm?.has(e) ?? false;
|
|
96
|
+
}
|
|
97
|
+
has(e) {
|
|
98
|
+
if (!this._tracking) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
return this._entities?.has(e) ?? this.rootTerm?.has(e) ?? false;
|
|
102
|
+
}
|
|
103
|
+
forEach(arg0, arg1, arg2) {
|
|
104
|
+
this.changed = false;
|
|
105
|
+
this._forEach(arg0, arg1, arg2);
|
|
106
|
+
return this;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* @internal Iterate the matched entities with injection, **without**
|
|
110
|
+
* consuming the {@link changed} flag. Used by `System.each`, which runs every
|
|
111
|
+
* tick and must not reset `changed` (that flag tracks whether membership or
|
|
112
|
+
* watched data changed since the caller last read it).
|
|
113
|
+
*/
|
|
114
|
+
_forEach(arg0, arg1, arg2) {
|
|
115
|
+
forEachInjected(this.world, this._matchedEntities(), arg0, arg1, arg2);
|
|
116
|
+
}
|
|
117
|
+
toString() {
|
|
118
|
+
return this.name ?? "";
|
|
119
|
+
}
|
|
120
|
+
/* -------------------------------------------------------------------------
|
|
121
|
+
* Predicate And Membership Configuration
|
|
122
|
+
* -------------------------------------------------------------------------
|
|
123
|
+
* Fluent builder methods that decide which entities belong to the query and
|
|
124
|
+
* how that membership is tracked, ordered, grouped, or source-filtered.
|
|
125
|
+
*/
|
|
126
|
+
with(...specs) {
|
|
127
|
+
this._assertConfigurable();
|
|
128
|
+
const terms = [];
|
|
129
|
+
let cascade;
|
|
130
|
+
for (const spec of specs) {
|
|
131
|
+
if (isQueryConfig(spec)) {
|
|
132
|
+
terms.push(spec.with);
|
|
133
|
+
if (spec.cascade !== undefined) {
|
|
134
|
+
cascade = spec.cascade;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
terms.push(spec);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
this._dsl = this._dsl === undefined ? { all: terms } : { all: [this._dsl, ...terms] };
|
|
142
|
+
this._hasExplicitQuery = true;
|
|
143
|
+
if (cascade !== undefined) {
|
|
144
|
+
this.cascade(cascade);
|
|
145
|
+
}
|
|
146
|
+
return this;
|
|
147
|
+
}
|
|
148
|
+
without(dsl) {
|
|
149
|
+
this.with({ not: dsl });
|
|
150
|
+
return this;
|
|
151
|
+
}
|
|
152
|
+
track() {
|
|
153
|
+
this._assertConfigurable();
|
|
154
|
+
this._tracking = true;
|
|
155
|
+
return this;
|
|
156
|
+
}
|
|
157
|
+
orderBy(arg0, arg1, arg2) {
|
|
158
|
+
this._assertConfigurable();
|
|
159
|
+
this._tracking = true;
|
|
160
|
+
this._entities = makeSortedEntitySet(this.world, arg0, arg1, arg2);
|
|
161
|
+
return this;
|
|
162
|
+
}
|
|
163
|
+
cascade(rel, compare) {
|
|
164
|
+
this._assertConfigurable();
|
|
165
|
+
const relEntity = this.world.entity(rel);
|
|
166
|
+
const relMeta = relEntity.meta;
|
|
167
|
+
if (!relMeta.isRelationship) {
|
|
168
|
+
throw new Error(`Component ${relMeta.Class.name} is not a Relationship`);
|
|
169
|
+
}
|
|
170
|
+
const traversable = relEntity.get(Traversable);
|
|
171
|
+
if (!traversable) {
|
|
172
|
+
throw new Error(`Relationship ${relMeta.Class.name} does not have the Traversable trait`);
|
|
173
|
+
}
|
|
174
|
+
const depths = traversable.depths;
|
|
175
|
+
this.orderBy([], (a, _ra, b) => {
|
|
176
|
+
const da = depths.get(a) ?? -1;
|
|
177
|
+
const db = depths.get(b) ?? -1;
|
|
178
|
+
return da - db || compare?.(a, b) || 0;
|
|
179
|
+
});
|
|
180
|
+
this.update(relMeta.Class, (entity) => {
|
|
181
|
+
this._reSortCascade(entity, relMeta.eid);
|
|
182
|
+
});
|
|
183
|
+
return this;
|
|
184
|
+
}
|
|
185
|
+
groupBy(arg0, arg1) {
|
|
186
|
+
this._assertConfigurable();
|
|
187
|
+
Object.setPrototypeOf(this, getGroupedQueryPrototype());
|
|
188
|
+
return this._initialize(arg0, arg1);
|
|
189
|
+
}
|
|
190
|
+
ignoreSource(source) {
|
|
191
|
+
this._assertConfigurable();
|
|
192
|
+
const query = typeof source === "object" && !Array.isArray(source) && "entity" in source
|
|
193
|
+
? source
|
|
194
|
+
: this._buildSilenceQuery(source);
|
|
195
|
+
this.entity.set(SilenceSource, { target: query.entity });
|
|
196
|
+
this._silenceQuery = query;
|
|
197
|
+
return this;
|
|
198
|
+
}
|
|
199
|
+
enter(arg0, arg1, arg2) {
|
|
200
|
+
this._assertConfigurable();
|
|
201
|
+
this._enterCallback = makeEnterCallback(this.world, arg0, arg1, arg2);
|
|
202
|
+
return this;
|
|
203
|
+
}
|
|
204
|
+
exit(arg0, arg1, arg2) {
|
|
205
|
+
this._assertConfigurable();
|
|
206
|
+
const exit = makeExitCallback(this.world, arg0, arg1, arg2);
|
|
207
|
+
this._exitCallback = exit.callback;
|
|
208
|
+
this._exitSnapshotTypes = exit.snapshotTypes;
|
|
209
|
+
return this;
|
|
210
|
+
}
|
|
211
|
+
update(arg0, arg1, arg2, arg3) {
|
|
212
|
+
this._assertConfigurable();
|
|
213
|
+
const { componentEid, callback } = makeUpdateRegistration(this.world, arg0, arg1, arg2, arg3);
|
|
214
|
+
this._componentUpdateCallbacks.set(componentEid, callback);
|
|
215
|
+
this._watchlistBitmask.add(componentEid);
|
|
216
|
+
if (!this._hasExplicitQuery) {
|
|
217
|
+
this._dsl = this._watchlistBitmask.indices();
|
|
218
|
+
}
|
|
219
|
+
return this;
|
|
220
|
+
}
|
|
221
|
+
/* -------------------------------------------------------------------------
|
|
222
|
+
* World Registration And Routing Hooks
|
|
223
|
+
* -------------------------------------------------------------------------
|
|
224
|
+
* Public internals called by World, terms, and System subclasses to register,
|
|
225
|
+
* destroy, and route membership/update events through the query.
|
|
226
|
+
*/
|
|
227
|
+
build() {
|
|
228
|
+
if (this.built) {
|
|
229
|
+
return this;
|
|
230
|
+
}
|
|
231
|
+
if (this.world.deferred) {
|
|
232
|
+
this.world._addUnbuiltQuery(this);
|
|
233
|
+
return this;
|
|
234
|
+
}
|
|
235
|
+
return this._build();
|
|
33
236
|
}
|
|
34
|
-
}
|
|
35
|
-
const EMPTY_GROUPS = new Map();
|
|
36
|
-
/**
|
|
37
|
-
* A {@link Query} that has been partitioned by {@link Query.groupBy}. Adds the
|
|
38
|
-
* typed group-accessor surface ({@link group}, {@link groups}, etc.) on top of
|
|
39
|
-
* the query's usual reactive membership.
|
|
40
|
-
*
|
|
41
|
-
* `GroupedQuery` lives in the query module alongside `Query`. Instances are
|
|
42
|
-
* created lazily by {@link Query.groupBy} via `Object.setPrototypeOf`.
|
|
43
|
-
*
|
|
44
|
-
* @typeParam K - The grouping key type produced by the key function (or the
|
|
45
|
-
* relationship target entity, for the relationship form).
|
|
46
|
-
* @typeParam R - Component classes guaranteed present on every matched entity.
|
|
47
|
-
*/
|
|
48
|
-
export class GroupedQuery extends Query {
|
|
49
237
|
/** @internal */
|
|
50
|
-
|
|
51
|
-
if (this.
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
let keyOf;
|
|
55
|
-
let watchEids;
|
|
56
|
-
if (typeof arg1 === "function") {
|
|
57
|
-
const components = arg0;
|
|
58
|
-
const inject = mapInject(this.world, components);
|
|
59
|
-
const arity = injectArity(inject);
|
|
60
|
-
const resolved = new Array(arity);
|
|
61
|
-
keyOf = (e) => {
|
|
62
|
-
getInjected(e, inject, false, resolved);
|
|
63
|
-
return arg1(e, resolved);
|
|
64
|
-
};
|
|
65
|
-
watchEids = directInjectEids(inject);
|
|
66
|
-
this._composeGroupMembership(components);
|
|
238
|
+
_build() {
|
|
239
|
+
if (this.built) {
|
|
240
|
+
return this;
|
|
67
241
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
watchEids = [relEid];
|
|
72
|
-
this._composeGroupMembership([arg0]);
|
|
242
|
+
if (!this._isBuildable()) {
|
|
243
|
+
this.destroy();
|
|
244
|
+
return this;
|
|
73
245
|
}
|
|
74
|
-
|
|
75
|
-
|
|
246
|
+
this.world._removeUnbuiltQuery(this);
|
|
247
|
+
if (this._dsl !== undefined) {
|
|
248
|
+
if (this._tracking && containsDownTerm(this._dsl)) {
|
|
249
|
+
this.destroy();
|
|
250
|
+
throw new Error(SOURCE_TRACKED_QUERY_ERROR);
|
|
251
|
+
}
|
|
252
|
+
this.rootTerm = this.world.getTerm(this._dsl);
|
|
253
|
+
this._unsubscribeTerm = this.rootTerm.subscribe(this);
|
|
76
254
|
}
|
|
77
|
-
this.
|
|
78
|
-
this.
|
|
255
|
+
this.world._addQuery(this);
|
|
256
|
+
this._built = true;
|
|
257
|
+
this._backfill();
|
|
79
258
|
return this;
|
|
80
259
|
}
|
|
81
260
|
/** @internal */
|
|
261
|
+
_clearSilence() {
|
|
262
|
+
this._silenceQuery = undefined;
|
|
263
|
+
}
|
|
264
|
+
destroy() {
|
|
265
|
+
if (this._destroyed) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
this._destroyed = true;
|
|
269
|
+
this.world._removeQuery(this);
|
|
270
|
+
this._entities?.clear();
|
|
271
|
+
this._entities = undefined;
|
|
272
|
+
this._tracking = false;
|
|
273
|
+
if (!this.entity._destroyed && this.entity.get(this._queryComponentClass) !== undefined) {
|
|
274
|
+
this.entity.destroy();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/** @internal */
|
|
82
278
|
_enter(e) {
|
|
83
|
-
this.
|
|
84
|
-
|
|
279
|
+
this.changed = true;
|
|
280
|
+
this._entities?.add(e);
|
|
281
|
+
e._addQueryMembership(this);
|
|
282
|
+
this._enterCallback?.(e);
|
|
283
|
+
e.components.forEach((c, ceid) => {
|
|
284
|
+
if (!this._watchlistBitmask.has(ceid)) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
this._notifyModified(e, ceid, c);
|
|
288
|
+
});
|
|
85
289
|
}
|
|
86
290
|
/** @internal */
|
|
87
291
|
_exit(e) {
|
|
88
|
-
|
|
89
|
-
this.
|
|
292
|
+
this.changed = true;
|
|
293
|
+
this._exitCallback?.(e);
|
|
294
|
+
this._entities?.delete(e);
|
|
295
|
+
e._removeQueryMembership(this);
|
|
296
|
+
}
|
|
297
|
+
/** @internal */
|
|
298
|
+
_notifyModified(e, ceid, c) {
|
|
299
|
+
if (!this._watchlistBitmask.has(ceid)) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
if (this._isSourceSilenced()) {
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
this.changed = true;
|
|
306
|
+
const callback = this._componentUpdateCallbacks.get(ceid);
|
|
307
|
+
if (callback) {
|
|
308
|
+
callback(e, c);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
onTermEvent(kind, entity) {
|
|
312
|
+
if (kind === 0 /* TermEventKind.Enter */) {
|
|
313
|
+
this._enter(entity);
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
this._exit(entity);
|
|
317
|
+
}
|
|
90
318
|
}
|
|
91
319
|
/** @internal */
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
this.
|
|
320
|
+
_unsubscribeRootTerm() {
|
|
321
|
+
this._unsubscribeTerm?.();
|
|
322
|
+
this._unsubscribeTerm = undefined;
|
|
323
|
+
this.rootTerm = undefined;
|
|
95
324
|
}
|
|
96
325
|
/** @internal */
|
|
97
326
|
_watchesUpdates() {
|
|
98
|
-
return
|
|
327
|
+
return this._componentUpdateCallbacks.size > 0;
|
|
99
328
|
}
|
|
100
|
-
|
|
101
|
-
|
|
329
|
+
/** @internal Throw when a builder method is called after registration. */
|
|
330
|
+
_assertConfigurable() {
|
|
331
|
+
if (this.built) {
|
|
332
|
+
throw new Error(`query '${this.name}' has already been built`);
|
|
333
|
+
}
|
|
102
334
|
}
|
|
103
|
-
|
|
104
|
-
|
|
335
|
+
/** @internal */
|
|
336
|
+
_backfill() {
|
|
337
|
+
if (!this.rootTerm || !this._needsBackfill()) {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
this.world.defer(() => {
|
|
341
|
+
for (const e of this.rootTerm ?? EMPTY_ENTITIES) {
|
|
342
|
+
this._enter(e);
|
|
343
|
+
}
|
|
344
|
+
});
|
|
105
345
|
}
|
|
106
|
-
|
|
107
|
-
|
|
346
|
+
/** @internal Whether this object has enough configuration to enter the world. */
|
|
347
|
+
_isBuildable() {
|
|
348
|
+
return this._dsl !== undefined;
|
|
108
349
|
}
|
|
109
|
-
|
|
110
|
-
|
|
350
|
+
/** @internal Whether build-time matches are observable and need routing. */
|
|
351
|
+
_needsBackfill() {
|
|
352
|
+
return (this._tracking ||
|
|
353
|
+
this._enterCallback !== undefined ||
|
|
354
|
+
this._exitCallback !== undefined ||
|
|
355
|
+
this._watchesUpdates());
|
|
111
356
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
this.
|
|
115
|
-
return this;
|
|
116
|
-
}
|
|
117
|
-
onGroupExit(callback) {
|
|
118
|
-
this._assertConfigurable();
|
|
119
|
-
this._grouping?.setOnGroupExit(callback);
|
|
120
|
-
return this;
|
|
357
|
+
/** @internal */
|
|
358
|
+
_isSourceSilenced() {
|
|
359
|
+
const source = this.entity.world._routingSource;
|
|
360
|
+
return source !== undefined && this._silenceQuery?.has(source) === true;
|
|
121
361
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
if (
|
|
125
|
-
return;
|
|
362
|
+
/** @internal */
|
|
363
|
+
_matchedEntities() {
|
|
364
|
+
if (!this._tracking) {
|
|
365
|
+
return EMPTY_ENTITIES;
|
|
126
366
|
}
|
|
127
|
-
|
|
128
|
-
this._dsl = { all: [existing, ...componentRefs] };
|
|
129
|
-
this._hasExplicitQuery = true;
|
|
367
|
+
return this._entities ?? this.rootTerm ?? EMPTY_ENTITIES;
|
|
130
368
|
}
|
|
131
|
-
|
|
132
|
-
this.
|
|
133
|
-
this.
|
|
134
|
-
|
|
369
|
+
_buildSilenceQuery(dsl) {
|
|
370
|
+
const q = this.world.query(`${this.name}:silence`).with(dsl);
|
|
371
|
+
q.entity.childOf(this.entity);
|
|
372
|
+
return q;
|
|
373
|
+
}
|
|
374
|
+
_reSortCascade(entity, relEid) {
|
|
375
|
+
const entities = this._entities;
|
|
376
|
+
if (entities instanceof OrderedSet) {
|
|
377
|
+
entities.reSort(entity);
|
|
378
|
+
}
|
|
379
|
+
for (const child of entity._childrenByEid(relEid) ?? []) {
|
|
380
|
+
this._reSortCascade(child, relEid);
|
|
381
|
+
}
|
|
135
382
|
}
|
|
136
383
|
}
|
|
137
|
-
_setGroupedQueryCtor(GroupedQuery);
|
|
138
384
|
//# sourceMappingURL=query.js.map
|
package/dist/query/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/query/query.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/query/query.ts"],"names":[],"mappings":"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"}
|