@spine-event-engine/client-node 2.0.0-snapshot.2
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/LICENSE +201 -0
- package/README.md +110 -0
- package/REFERENCE.md +22 -0
- package/codegen/entity-field-classification.d.mts +25 -0
- package/codegen/entity-field-classification.mjs +68 -0
- package/codegen/generate-entity-columns.mjs +180 -0
- package/dist/client/node-client.d.ts +24 -0
- package/dist/client/node-client.d.ts.map +1 -0
- package/dist/client/node-client.js +56 -0
- package/dist/client/node-client.js.map +1 -0
- package/dist/codegen/index.d.ts +6 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +18 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/entity/entity-column.d.ts +158 -0
- package/dist/entity/entity-column.d.ts.map +1 -0
- package/dist/entity/entity-column.js +303 -0
- package/dist/entity/entity-column.js.map +1 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/query/entity-query.d.ts +180 -0
- package/dist/query/entity-query.d.ts.map +1 -0
- package/dist/query/entity-query.js +435 -0
- package/dist/query/entity-query.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,mBAAmB,IAAI,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAE/F;;GAEG;AACH,MAAM,mBAAmB,GAAkC,sBAAsB,CAAC;AAElF,OAAO,EACL,YAAY,GAUb,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,WAAW,EACX,kBAAkB,GAInB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { type Message, type MessageShape } from "@bufbuild/protobuf";
|
|
2
|
+
import type { GenMessage } from "@bufbuild/protobuf/codegenv2";
|
|
3
|
+
import { type ActorContext } from "@spine-event-engine/proto";
|
|
4
|
+
import { type Query } from "@spine-event-engine/proto/client";
|
|
5
|
+
import { EntityColumn, type EntityColumnOperator, type EntityColumnValue } from "../entity/entity-column.js";
|
|
6
|
+
type EntityColumnCollection<Schema extends GenMessage<Message>> = Readonly<Record<string, EntityColumn<Schema>>>;
|
|
7
|
+
type PredicateColumn<Predicate> = Predicate extends EntityPredicate<infer Column> ? Column : never;
|
|
8
|
+
type ColumnSchema<Column> = Column extends EntityColumn<infer Schema> ? Schema : never;
|
|
9
|
+
type ColumnName<Column> = Column extends EntityColumn<GenMessage<Message>, infer Name> ? Name : never;
|
|
10
|
+
type StateName<Schema extends GenMessage<Message>> = Exclude<keyof MessageShape<Schema>, "$typeName" | "$unknown"> & string;
|
|
11
|
+
/**
|
|
12
|
+
* Represents one typed leaf comparison in an Entity query predicate.
|
|
13
|
+
*/
|
|
14
|
+
export interface EntityComparisonPredicate<Column extends EntityColumn = EntityColumn> {
|
|
15
|
+
/**
|
|
16
|
+
* Identifies this predicate as a leaf comparison.
|
|
17
|
+
*/
|
|
18
|
+
readonly kind: "comparison";
|
|
19
|
+
/**
|
|
20
|
+
* Identifies the column compared by this predicate.
|
|
21
|
+
*/
|
|
22
|
+
readonly column: Column;
|
|
23
|
+
/**
|
|
24
|
+
* Identifies the comparison operator applied to the column.
|
|
25
|
+
*/
|
|
26
|
+
readonly operator: EntityColumnOperator<Column>;
|
|
27
|
+
/**
|
|
28
|
+
* Stores the value compared with the column.
|
|
29
|
+
*/
|
|
30
|
+
readonly value: Exclude<EntityColumnValue<Column>, undefined>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Represents a nested conjunction or disjunction in an Entity query predicate.
|
|
34
|
+
*/
|
|
35
|
+
export interface EntityGroup<Column extends EntityColumn = EntityColumn> {
|
|
36
|
+
/**
|
|
37
|
+
* Identifies the logical operation that combines the predicates.
|
|
38
|
+
*/
|
|
39
|
+
readonly kind: "all" | "either";
|
|
40
|
+
/**
|
|
41
|
+
* Lists the predicates combined by this group.
|
|
42
|
+
*/
|
|
43
|
+
readonly predicates: readonly EntityPredicate<Column>[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Represents a typed predicate accepted by the Entity query builder.
|
|
47
|
+
*/
|
|
48
|
+
export type EntityPredicate<Column extends EntityColumn = EntityColumn> = EntityComparisonPredicate<Column> | EntityGroup<Column>;
|
|
49
|
+
/**
|
|
50
|
+
* Builds a typed Entity query for the frozen Spine wire contract.
|
|
51
|
+
*/
|
|
52
|
+
export declare class EntityQueryBuilder<Schema extends GenMessage<Message>, Columns extends EntityColumnCollection<Schema>> {
|
|
53
|
+
#private;
|
|
54
|
+
/**
|
|
55
|
+
* Creates a builder for one Entity query.
|
|
56
|
+
*
|
|
57
|
+
* @param input Schema, registered columns, and actor context for the query.
|
|
58
|
+
*/
|
|
59
|
+
constructor(input: {
|
|
60
|
+
readonly schema: Schema;
|
|
61
|
+
readonly columns: Columns;
|
|
62
|
+
readonly context: ActorContext;
|
|
63
|
+
});
|
|
64
|
+
/**
|
|
65
|
+
* Adds Entity IDs to the query target.
|
|
66
|
+
*
|
|
67
|
+
* @param ids Entity IDs to include.
|
|
68
|
+
* @returns This builder.
|
|
69
|
+
*/
|
|
70
|
+
byId(...ids: readonly unknown[]): this;
|
|
71
|
+
/**
|
|
72
|
+
* Adds a typed predicate. Repeated calls are combined with `ALL`.
|
|
73
|
+
*
|
|
74
|
+
* @param predicate Predicate owned by this builder's registered columns.
|
|
75
|
+
* @returns This builder.
|
|
76
|
+
*/
|
|
77
|
+
where<Predicate extends EntityPredicate>(predicate: ColumnSchema<PredicateColumn<Predicate>> extends Schema ? ColumnName<PredicateColumn<Predicate>> extends keyof Columns ? Predicate : never : never): this;
|
|
78
|
+
/**
|
|
79
|
+
* Adds top-level state fields returned by the server.
|
|
80
|
+
*
|
|
81
|
+
* @param paths Generated property names of state fields.
|
|
82
|
+
* @returns This builder.
|
|
83
|
+
*/
|
|
84
|
+
mask(...paths: readonly StateName<Schema>[]): this;
|
|
85
|
+
/**
|
|
86
|
+
* Adds one ordering clause in caller order.
|
|
87
|
+
*
|
|
88
|
+
* @param column Ordered column owned by this builder's Entity schema.
|
|
89
|
+
* @param direction Sort direction, ascending by default.
|
|
90
|
+
* @returns This builder.
|
|
91
|
+
*/
|
|
92
|
+
orderBy<Column extends EntityColumn<Schema>>(column: "greaterThan" extends EntityColumnOperator<Column> ? Column : never, direction?: "asc" | "desc"): this;
|
|
93
|
+
/**
|
|
94
|
+
* Sets a positive result limit that requires ordering.
|
|
95
|
+
*
|
|
96
|
+
* @param value Positive maximum number of returned entities.
|
|
97
|
+
* @returns This builder.
|
|
98
|
+
*/
|
|
99
|
+
limit(value: number): this;
|
|
100
|
+
/**
|
|
101
|
+
* Builds the `spine.client.Query` message.
|
|
102
|
+
*
|
|
103
|
+
* @returns The wire query message.
|
|
104
|
+
*/
|
|
105
|
+
build(): Query;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Creates typed predicates and builders for Entity queries.
|
|
109
|
+
*/
|
|
110
|
+
export declare const EntityQuery: Readonly<{
|
|
111
|
+
/**
|
|
112
|
+
* Creates an equality predicate for a descriptor-backed Entity column.
|
|
113
|
+
*
|
|
114
|
+
* @param column Column to compare.
|
|
115
|
+
* @param value Value to match.
|
|
116
|
+
* @returns Immutable equality predicate.
|
|
117
|
+
*/
|
|
118
|
+
eq<Column extends EntityColumn>(column: Column, value: Exclude<EntityColumnValue<Column>, undefined>): EntityComparisonPredicate<Column>;
|
|
119
|
+
/**
|
|
120
|
+
* Creates a greater-than predicate for an ordered Entity column.
|
|
121
|
+
*
|
|
122
|
+
* @param column Ordered column to compare.
|
|
123
|
+
* @param value Lower exclusive bound.
|
|
124
|
+
* @returns Immutable greater-than predicate.
|
|
125
|
+
*/
|
|
126
|
+
gt<Column extends EntityColumn>(column: "greaterThan" extends EntityColumnOperator<Column> ? Column : never, value: Exclude<EntityColumnValue<Column>, undefined>): EntityComparisonPredicate<Column>;
|
|
127
|
+
/**
|
|
128
|
+
* Creates a less-than predicate for an ordered Entity column.
|
|
129
|
+
*
|
|
130
|
+
* @param column Ordered column to compare.
|
|
131
|
+
* @param value Upper exclusive bound.
|
|
132
|
+
* @returns Immutable less-than predicate.
|
|
133
|
+
*/
|
|
134
|
+
lt<Column extends EntityColumn>(column: "lessThan" extends EntityColumnOperator<Column> ? Column : never, value: Exclude<EntityColumnValue<Column>, undefined>): EntityComparisonPredicate<Column>;
|
|
135
|
+
/**
|
|
136
|
+
* Creates a greater-than-or-equal predicate for an ordered Entity column.
|
|
137
|
+
*
|
|
138
|
+
* @param column Ordered column to compare.
|
|
139
|
+
* @param value Lower inclusive bound.
|
|
140
|
+
* @returns Immutable inclusive lower-bound predicate.
|
|
141
|
+
*/
|
|
142
|
+
ge<Column extends EntityColumn>(column: "greaterOrEqual" extends EntityColumnOperator<Column> ? Column : never, value: Exclude<EntityColumnValue<Column>, undefined>): EntityComparisonPredicate<Column>;
|
|
143
|
+
/**
|
|
144
|
+
* Creates a less-than-or-equal predicate for an ordered Entity column.
|
|
145
|
+
*
|
|
146
|
+
* @param column Ordered column to compare.
|
|
147
|
+
* @param value Upper inclusive bound.
|
|
148
|
+
* @returns Immutable inclusive upper-bound predicate.
|
|
149
|
+
*/
|
|
150
|
+
le<Column extends EntityColumn>(column: "lessOrEqual" extends EntityColumnOperator<Column> ? Column : never, value: Exclude<EntityColumnValue<Column>, undefined>): EntityComparisonPredicate<Column>;
|
|
151
|
+
/**
|
|
152
|
+
* Combines predicates conjunctively.
|
|
153
|
+
*
|
|
154
|
+
* @param first First predicate in the group.
|
|
155
|
+
* @param rest Remaining predicates in the group.
|
|
156
|
+
* @returns Immutable conjunction predicate.
|
|
157
|
+
*/
|
|
158
|
+
all<First extends EntityPredicate, Rest extends readonly EntityPredicate[]>(first: First, ...rest: Rest): EntityGroup<PredicateColumn<First | Rest[number]>>;
|
|
159
|
+
/**
|
|
160
|
+
* Combines predicates disjunctively.
|
|
161
|
+
*
|
|
162
|
+
* @param first First predicate in the group.
|
|
163
|
+
* @param rest Remaining predicates in the group.
|
|
164
|
+
* @returns Immutable disjunction predicate.
|
|
165
|
+
*/
|
|
166
|
+
either<First extends EntityPredicate, Rest extends readonly EntityPredicate[]>(first: First, ...rest: Rest): EntityGroup<PredicateColumn<First | Rest[number]>>;
|
|
167
|
+
/**
|
|
168
|
+
* Creates a builder for one Entity schema.
|
|
169
|
+
*
|
|
170
|
+
* @param input Schema, registered columns, and actor context for the query.
|
|
171
|
+
* @returns A mutable query builder.
|
|
172
|
+
*/
|
|
173
|
+
select<Schema extends GenMessage<Message>, Columns extends EntityColumnCollection<Schema>>(input: {
|
|
174
|
+
readonly schema: Schema;
|
|
175
|
+
readonly columns: Columns;
|
|
176
|
+
readonly context: ActorContext;
|
|
177
|
+
}): EntityQueryBuilder<Schema, Columns>;
|
|
178
|
+
}>;
|
|
179
|
+
export {};
|
|
180
|
+
//# sourceMappingURL=entity-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-query.d.ts","sourceRoot":"","sources":["../../src/query/entity-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026, CodeMatters. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
|
5
|
+
* in compliance with the License. You may obtain a copy of the License at
|
|
6
|
+
*
|
|
7
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
*
|
|
9
|
+
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
|
10
|
+
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
|
11
|
+
* or implied. See the License for the specific language governing permissions and limitations under
|
|
12
|
+
* the License.
|
|
13
|
+
*/
|
|
14
|
+
import { clone, create, getOption, hasOption, ScalarType, toBinary, } from "@bufbuild/protobuf";
|
|
15
|
+
import { BoolValueSchema, AnySchema, BytesValueSchema, DoubleValueSchema, FloatValueSchema, Int32ValueSchema, Int64ValueSchema, StringValueSchema, UInt32ValueSchema, UInt64ValueSchema, } from "@bufbuild/protobuf/wkt";
|
|
16
|
+
import { ActorContextSchema, VersionSchema, type_url_prefix, } from "@spine-event-engine/proto";
|
|
17
|
+
import { CompositeFilterSchema, CompositeFilter_CompositeOperator, FilterSchema, Filter_Operator, IdFilterSchema, OrderBySchema, OrderBy_Direction, QueryIdSchema, QuerySchema, ResponseFormatSchema, TargetFiltersSchema, TargetSchema, } from "@spine-event-engine/proto/client";
|
|
18
|
+
import { EntityColumn, } from "../entity/entity-column.js";
|
|
19
|
+
const maximumPredicateDepth = 64;
|
|
20
|
+
const maximumPredicateNodes = 10_000;
|
|
21
|
+
/**
|
|
22
|
+
* Builds a typed Entity query for the frozen Spine wire contract.
|
|
23
|
+
*/
|
|
24
|
+
export class EntityQueryBuilder {
|
|
25
|
+
#schema;
|
|
26
|
+
#context;
|
|
27
|
+
#columns;
|
|
28
|
+
#ids = [];
|
|
29
|
+
#predicates = [];
|
|
30
|
+
#mask = [];
|
|
31
|
+
#order = [];
|
|
32
|
+
#limit;
|
|
33
|
+
/**
|
|
34
|
+
* Creates a builder for one Entity query.
|
|
35
|
+
*
|
|
36
|
+
* @param input Schema, registered columns, and actor context for the query.
|
|
37
|
+
*/
|
|
38
|
+
constructor(input) {
|
|
39
|
+
this.#schema = input.schema;
|
|
40
|
+
this.#columns = input.columns;
|
|
41
|
+
this.#context = clone(ActorContextSchema, input.context);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Adds Entity IDs to the query target.
|
|
45
|
+
*
|
|
46
|
+
* @param ids Entity IDs to include.
|
|
47
|
+
* @returns This builder.
|
|
48
|
+
*/
|
|
49
|
+
byId(...ids) {
|
|
50
|
+
if (ids.length === 0 || ids.some((id) => id === undefined)) {
|
|
51
|
+
throw new TypeError("Entity query ID filter must not be empty.");
|
|
52
|
+
}
|
|
53
|
+
this.#ids.push(...ids);
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Adds a typed predicate. Repeated calls are combined with `ALL`.
|
|
58
|
+
*
|
|
59
|
+
* @param predicate Predicate owned by this builder's registered columns.
|
|
60
|
+
* @returns This builder.
|
|
61
|
+
*/
|
|
62
|
+
where(predicate) {
|
|
63
|
+
if (this.#predicates.length >= maximumPredicateNodes) {
|
|
64
|
+
throw new TypeError(`Entity query predicate exceeds maximum node count ${String(maximumPredicateNodes)}.`);
|
|
65
|
+
}
|
|
66
|
+
this.#predicates.push(predicate);
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Adds top-level state fields returned by the server.
|
|
71
|
+
*
|
|
72
|
+
* @param paths Generated property names of state fields.
|
|
73
|
+
* @returns This builder.
|
|
74
|
+
*/
|
|
75
|
+
mask(...paths) {
|
|
76
|
+
for (const path of paths) {
|
|
77
|
+
const field = EntityQueryWire.findField(this.#schema, path);
|
|
78
|
+
if (field === undefined) {
|
|
79
|
+
throw new TypeError(`Entity query mask path "${path}" is not a state field.`);
|
|
80
|
+
}
|
|
81
|
+
this.#mask.push(field.name);
|
|
82
|
+
}
|
|
83
|
+
return this;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Adds one ordering clause in caller order.
|
|
87
|
+
*
|
|
88
|
+
* @param column Ordered column owned by this builder's Entity schema.
|
|
89
|
+
* @param direction Sort direction, ascending by default.
|
|
90
|
+
* @returns This builder.
|
|
91
|
+
*/
|
|
92
|
+
orderBy(column, direction = "asc") {
|
|
93
|
+
EntityQueryWire.requireOwnedColumn(this.#schema, this.#columns, column);
|
|
94
|
+
this.#order.push({ column, direction });
|
|
95
|
+
return this;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Sets a positive result limit that requires ordering.
|
|
99
|
+
*
|
|
100
|
+
* @param value Positive maximum number of returned entities.
|
|
101
|
+
* @returns This builder.
|
|
102
|
+
*/
|
|
103
|
+
limit(value) {
|
|
104
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
105
|
+
throw new TypeError("Entity query limit must be a positive integer.");
|
|
106
|
+
}
|
|
107
|
+
this.#limit = value;
|
|
108
|
+
return this;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Builds the `spine.client.Query` message.
|
|
112
|
+
*
|
|
113
|
+
* @returns The wire query message.
|
|
114
|
+
*/
|
|
115
|
+
build() {
|
|
116
|
+
if (this.#limit !== undefined && this.#order.length === 0) {
|
|
117
|
+
throw new TypeError("Entity query limit requires ordering.");
|
|
118
|
+
}
|
|
119
|
+
const filters = this.#filters();
|
|
120
|
+
const format = this.#format();
|
|
121
|
+
return create(QuerySchema, {
|
|
122
|
+
id: create(QueryIdSchema, { value: EntityQueryWire.nextId() }),
|
|
123
|
+
target: create(TargetSchema, {
|
|
124
|
+
type: EntityQueryWire.typeUrl(this.#schema),
|
|
125
|
+
criterion: filters === undefined
|
|
126
|
+
? { case: "includeAll", value: true }
|
|
127
|
+
: { case: "filters", value: filters },
|
|
128
|
+
}),
|
|
129
|
+
context: clone(ActorContextSchema, this.#context),
|
|
130
|
+
...(format === undefined ? {} : { format }),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
#filters() {
|
|
134
|
+
const idField = this.#schema.fields[0];
|
|
135
|
+
if (this.#ids.length > 0 && idField === undefined) {
|
|
136
|
+
throw new TypeError("Entity query target has no ID field.");
|
|
137
|
+
}
|
|
138
|
+
const predicates = EntityQueryCompiler.compileGroups(this.#predicates, this.#schema, this.#columns);
|
|
139
|
+
if (this.#ids.length === 0 && predicates.length === 0)
|
|
140
|
+
return undefined;
|
|
141
|
+
return create(TargetFiltersSchema, {
|
|
142
|
+
...(this.#ids.length === 0
|
|
143
|
+
? {}
|
|
144
|
+
: {
|
|
145
|
+
idFilter: create(IdFilterSchema, {
|
|
146
|
+
id: this.#ids.map((id) => EntityQueryWire.packField(idField, id)),
|
|
147
|
+
}),
|
|
148
|
+
}),
|
|
149
|
+
filter: [...predicates],
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
#format() {
|
|
153
|
+
if (this.#mask.length === 0 && this.#order.length === 0 && this.#limit === undefined) {
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
return create(ResponseFormatSchema, {
|
|
157
|
+
...(this.#mask.length === 0 ? {} : { fieldMask: { paths: [...this.#mask] } }),
|
|
158
|
+
orderBy: this.#order.map(({ column, direction }) => create(OrderBySchema, {
|
|
159
|
+
column: column.name,
|
|
160
|
+
direction: direction === "desc" ? OrderBy_Direction.DESCENDING : OrderBy_Direction.ASCENDING,
|
|
161
|
+
})),
|
|
162
|
+
limit: this.#limit ?? 0,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Creates typed predicates and builders for Entity queries.
|
|
168
|
+
*/
|
|
169
|
+
export const EntityQuery = Object.freeze({
|
|
170
|
+
eq(column, value) {
|
|
171
|
+
return EntityQueryCompiler.comparison(column, "equal", value);
|
|
172
|
+
},
|
|
173
|
+
gt(column, value) {
|
|
174
|
+
return EntityQueryCompiler.comparison(column, "greaterThan", value);
|
|
175
|
+
},
|
|
176
|
+
lt(column, value) {
|
|
177
|
+
return EntityQueryCompiler.comparison(column, "lessThan", value);
|
|
178
|
+
},
|
|
179
|
+
ge(column, value) {
|
|
180
|
+
return EntityQueryCompiler.comparison(column, "greaterOrEqual", value);
|
|
181
|
+
},
|
|
182
|
+
le(column, value) {
|
|
183
|
+
return EntityQueryCompiler.comparison(column, "lessOrEqual", value);
|
|
184
|
+
},
|
|
185
|
+
all(first, ...rest) {
|
|
186
|
+
return EntityQueryCompiler.group("all", first, rest);
|
|
187
|
+
},
|
|
188
|
+
either(first, ...rest) {
|
|
189
|
+
return EntityQueryCompiler.group("either", first, rest);
|
|
190
|
+
},
|
|
191
|
+
select(input) {
|
|
192
|
+
return new EntityQueryBuilder(input);
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
/**
|
|
196
|
+
* Internal compiler for predicates, descriptors, and wire query messages.
|
|
197
|
+
*/
|
|
198
|
+
const EntityQueryCompiler = Object.freeze({
|
|
199
|
+
comparison(column, operator, value) {
|
|
200
|
+
if (!column.operators.includes(operator)) {
|
|
201
|
+
throw new TypeError(`Entity column "${column.name}" does not support ${operator}.`);
|
|
202
|
+
}
|
|
203
|
+
EntityQueryWire.requireValue(column, value);
|
|
204
|
+
return Object.freeze({ kind: "comparison", column, operator, value });
|
|
205
|
+
},
|
|
206
|
+
group(kind, first, rest) {
|
|
207
|
+
return Object.freeze({
|
|
208
|
+
kind,
|
|
209
|
+
predicates: Object.freeze([first, ...rest]),
|
|
210
|
+
});
|
|
211
|
+
},
|
|
212
|
+
compileGroups(roots, schema, columns) {
|
|
213
|
+
const compiled = new WeakMap();
|
|
214
|
+
const seen = new WeakSet();
|
|
215
|
+
const pending = [];
|
|
216
|
+
let scheduled = 0;
|
|
217
|
+
for (let index = roots.length - 1; index >= 0; index -= 1) {
|
|
218
|
+
pending.push({ predicate: roots[index], depth: 0, expanded: false });
|
|
219
|
+
scheduled += 1;
|
|
220
|
+
}
|
|
221
|
+
while (pending.length > 0) {
|
|
222
|
+
const current = pending.pop();
|
|
223
|
+
if (current === undefined)
|
|
224
|
+
break;
|
|
225
|
+
const predicate = EntityQueryWire.requirePredicate(current.predicate);
|
|
226
|
+
if (current.expanded) {
|
|
227
|
+
if (predicate.kind === "comparison") {
|
|
228
|
+
throw new TypeError("Entity query predicate compilation state is invalid.");
|
|
229
|
+
}
|
|
230
|
+
const simple = [];
|
|
231
|
+
const nested = [];
|
|
232
|
+
for (const child of predicate.predicates) {
|
|
233
|
+
const childResult = compiled.get(child);
|
|
234
|
+
if (childResult === undefined)
|
|
235
|
+
throw new TypeError("Entity query predicate is incomplete.");
|
|
236
|
+
if (childResult.kind === "comparison")
|
|
237
|
+
simple.push(childResult.filter);
|
|
238
|
+
else
|
|
239
|
+
nested.push(childResult.filter);
|
|
240
|
+
}
|
|
241
|
+
compiled.set(predicate, {
|
|
242
|
+
kind: "group",
|
|
243
|
+
filter: create(CompositeFilterSchema, {
|
|
244
|
+
operator: predicate.kind === "either"
|
|
245
|
+
? CompositeFilter_CompositeOperator.EITHER
|
|
246
|
+
: CompositeFilter_CompositeOperator.ALL,
|
|
247
|
+
filter: simple,
|
|
248
|
+
compositeFilter: nested,
|
|
249
|
+
}),
|
|
250
|
+
});
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
if (seen.has(predicate))
|
|
254
|
+
throw new TypeError("Entity query predicate must not contain cycles.");
|
|
255
|
+
seen.add(predicate);
|
|
256
|
+
if (current.depth > maximumPredicateDepth) {
|
|
257
|
+
throw new TypeError(`Entity query predicate exceeds maximum depth ${String(maximumPredicateDepth)}.`);
|
|
258
|
+
}
|
|
259
|
+
if (predicate.kind === "comparison") {
|
|
260
|
+
EntityQueryWire.requireOwnedColumn(schema, columns, predicate.column);
|
|
261
|
+
compiled.set(predicate, {
|
|
262
|
+
kind: "comparison",
|
|
263
|
+
filter: EntityQueryWire.compileComparison(predicate),
|
|
264
|
+
});
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
if (predicate.predicates.length === 0) {
|
|
268
|
+
throw new TypeError(`${predicate.kind.toUpperCase()} predicate must not be empty.`);
|
|
269
|
+
}
|
|
270
|
+
if (scheduled + predicate.predicates.length > maximumPredicateNodes) {
|
|
271
|
+
throw new TypeError(`Entity query predicate exceeds maximum node count ${String(maximumPredicateNodes)}.`);
|
|
272
|
+
}
|
|
273
|
+
scheduled += predicate.predicates.length;
|
|
274
|
+
pending.push({ ...current, expanded: true });
|
|
275
|
+
for (let index = predicate.predicates.length - 1; index >= 0; index -= 1) {
|
|
276
|
+
if (!Object.hasOwn(predicate.predicates, index)) {
|
|
277
|
+
throw new TypeError("Entity query predicate entries must be defined.");
|
|
278
|
+
}
|
|
279
|
+
pending.push({
|
|
280
|
+
predicate: predicate.predicates[index],
|
|
281
|
+
depth: current.depth + 1,
|
|
282
|
+
expanded: false,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return roots.map((root) => {
|
|
287
|
+
const result = compiled.get(root);
|
|
288
|
+
if (result === undefined)
|
|
289
|
+
throw new TypeError("Entity query predicate is incomplete.");
|
|
290
|
+
return result.kind === "group"
|
|
291
|
+
? result.filter
|
|
292
|
+
: create(CompositeFilterSchema, {
|
|
293
|
+
operator: CompositeFilter_CompositeOperator.ALL,
|
|
294
|
+
filter: [result.filter],
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
},
|
|
298
|
+
});
|
|
299
|
+
/**
|
|
300
|
+
* Validates and compiles Entity query details.
|
|
301
|
+
*/
|
|
302
|
+
const EntityQueryWire = Object.freeze({
|
|
303
|
+
requirePredicate(value) {
|
|
304
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
305
|
+
throw new TypeError("Entity query predicate must be an object.");
|
|
306
|
+
}
|
|
307
|
+
const predicate = value;
|
|
308
|
+
if (predicate.kind === "comparison") {
|
|
309
|
+
if (!(predicate.column instanceof EntityColumn)) {
|
|
310
|
+
throw new TypeError("Entity query comparison column is required.");
|
|
311
|
+
}
|
|
312
|
+
return predicate;
|
|
313
|
+
}
|
|
314
|
+
if (predicate.kind !== "all" && predicate.kind !== "either") {
|
|
315
|
+
throw new TypeError("Entity query predicate kind must be recognized.");
|
|
316
|
+
}
|
|
317
|
+
if (!Array.isArray(predicate.predicates)) {
|
|
318
|
+
throw new TypeError(`${predicate.kind.toUpperCase()} predicate predicates must be an array.`);
|
|
319
|
+
}
|
|
320
|
+
return predicate;
|
|
321
|
+
},
|
|
322
|
+
compileComparison(predicate) {
|
|
323
|
+
return create(FilterSchema, {
|
|
324
|
+
fieldPath: { fieldName: [predicate.column.name] },
|
|
325
|
+
value: EntityQueryWire.packColumn(predicate.column, predicate.value),
|
|
326
|
+
operator: EntityQueryWire.wireOperator(predicate.operator),
|
|
327
|
+
});
|
|
328
|
+
},
|
|
329
|
+
wireOperator(operator) {
|
|
330
|
+
switch (operator) {
|
|
331
|
+
case "equal":
|
|
332
|
+
return Filter_Operator.EQUAL;
|
|
333
|
+
case "greaterThan":
|
|
334
|
+
return Filter_Operator.GREATER_THAN;
|
|
335
|
+
case "lessThan":
|
|
336
|
+
return Filter_Operator.LESS_THAN;
|
|
337
|
+
case "greaterOrEqual":
|
|
338
|
+
return Filter_Operator.GREATER_OR_EQUAL;
|
|
339
|
+
case "lessOrEqual":
|
|
340
|
+
return Filter_Operator.LESS_OR_EQUAL;
|
|
341
|
+
default:
|
|
342
|
+
throw new TypeError("Entity query comparison operator is not recognized.");
|
|
343
|
+
}
|
|
344
|
+
},
|
|
345
|
+
packColumn(column, value) {
|
|
346
|
+
if (column.source === "system") {
|
|
347
|
+
if (column.name === "version")
|
|
348
|
+
return EntityQueryWire.packMessage(VersionSchema, value);
|
|
349
|
+
return EntityQueryWire.packMessage(BoolValueSchema, create(BoolValueSchema, { value: value }));
|
|
350
|
+
}
|
|
351
|
+
if (column.descriptor === undefined) {
|
|
352
|
+
throw new TypeError("Entity query application column descriptor is required.");
|
|
353
|
+
}
|
|
354
|
+
return EntityQueryWire.packField(column.descriptor, value);
|
|
355
|
+
},
|
|
356
|
+
packField(field, value) {
|
|
357
|
+
if (field === undefined)
|
|
358
|
+
throw new TypeError("Entity query field descriptor is required.");
|
|
359
|
+
if (field.fieldKind === "message") {
|
|
360
|
+
return EntityQueryWire.packMessage(field.message, value);
|
|
361
|
+
}
|
|
362
|
+
if (field.fieldKind === "enum") {
|
|
363
|
+
return EntityQueryWire.packMessage(Int32ValueSchema, create(Int32ValueSchema, { value: value }));
|
|
364
|
+
}
|
|
365
|
+
if (field.fieldKind !== "scalar")
|
|
366
|
+
throw new TypeError("Entity query field kind is unsupported.");
|
|
367
|
+
const schema = EntityQueryWire.scalarSchema(field.scalar);
|
|
368
|
+
return EntityQueryWire.packMessage(schema, create(schema, { value }));
|
|
369
|
+
},
|
|
370
|
+
scalarSchema(scalar) {
|
|
371
|
+
switch (scalar) {
|
|
372
|
+
case ScalarType.BOOL:
|
|
373
|
+
return BoolValueSchema;
|
|
374
|
+
case ScalarType.BYTES:
|
|
375
|
+
return BytesValueSchema;
|
|
376
|
+
case ScalarType.DOUBLE:
|
|
377
|
+
return DoubleValueSchema;
|
|
378
|
+
case ScalarType.FLOAT:
|
|
379
|
+
return FloatValueSchema;
|
|
380
|
+
case ScalarType.INT64:
|
|
381
|
+
case ScalarType.SFIXED64:
|
|
382
|
+
case ScalarType.SINT64:
|
|
383
|
+
return Int64ValueSchema;
|
|
384
|
+
case ScalarType.UINT64:
|
|
385
|
+
case ScalarType.FIXED64:
|
|
386
|
+
return UInt64ValueSchema;
|
|
387
|
+
case ScalarType.UINT32:
|
|
388
|
+
case ScalarType.FIXED32:
|
|
389
|
+
return UInt32ValueSchema;
|
|
390
|
+
case ScalarType.STRING:
|
|
391
|
+
return StringValueSchema;
|
|
392
|
+
default:
|
|
393
|
+
return Int32ValueSchema;
|
|
394
|
+
}
|
|
395
|
+
},
|
|
396
|
+
requireOwnedColumn(schema, columns, column) {
|
|
397
|
+
if (column.schema !== schema ||
|
|
398
|
+
!Object.values(columns).some((candidate) => candidate === column)) {
|
|
399
|
+
throw new TypeError("Entity query column does not belong to the selected target.");
|
|
400
|
+
}
|
|
401
|
+
},
|
|
402
|
+
requireValue(column, value) {
|
|
403
|
+
const valid = value !== undefined &&
|
|
404
|
+
(column.valueKind === "message"
|
|
405
|
+
? typeof value === "object" &&
|
|
406
|
+
value !== null &&
|
|
407
|
+
Reflect.get(value, "$typeName") === column.messageType
|
|
408
|
+
: column.valueKind === "bytes"
|
|
409
|
+
? value instanceof Uint8Array
|
|
410
|
+
: column.valueKind === "enum" || column.valueKind === "number"
|
|
411
|
+
? typeof value === "number" && Number.isFinite(value)
|
|
412
|
+
: typeof value === column.valueKind);
|
|
413
|
+
if (!valid)
|
|
414
|
+
throw new TypeError(`Entity query value for "${column.name}" has the wrong type.`);
|
|
415
|
+
},
|
|
416
|
+
findField(schema, name) {
|
|
417
|
+
return schema.fields.find((field) => field.name === name || field.localName === name);
|
|
418
|
+
},
|
|
419
|
+
nextId() {
|
|
420
|
+
return `query-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
|
|
421
|
+
},
|
|
422
|
+
typeUrl(schema) {
|
|
423
|
+
const prefix = hasOption(schema.file, type_url_prefix)
|
|
424
|
+
? getOption(schema.file, type_url_prefix)
|
|
425
|
+
: "type.googleapis.com";
|
|
426
|
+
return `${prefix.replace(/\/+$/u, "")}/${schema.typeName}`;
|
|
427
|
+
},
|
|
428
|
+
packMessage(schema, value) {
|
|
429
|
+
return create(AnySchema, {
|
|
430
|
+
typeUrl: EntityQueryWire.typeUrl(schema),
|
|
431
|
+
value: toBinary(schema, value, { writeUnknownFields: false }),
|
|
432
|
+
});
|
|
433
|
+
},
|
|
434
|
+
});
|
|
435
|
+
//# sourceMappingURL=entity-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-query.js","sourceRoot":"","sources":["../../src/query/entity-query.ts"],"names":[],"mappings":"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"}
|