@query-graph/core 1.1.4 → 1.1.5
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 +95 -969
- package/definition.d.ts +11 -0
- package/definition.js +1 -2
- package/docs/authoring.md +161 -0
- package/docs/composition.md +100 -0
- package/docs/diagnostics.md +52 -0
- package/docs/sql.md +68 -0
- package/docs/type-system.md +86 -0
- package/dsl.d.ts +182 -1839
- package/dsl.js +57 -763
- package/index.d.ts +8 -100
- package/index.js +13 -568
- package/lib/authoring/definition.js +425 -0
- package/lib/authoring/primitives.js +433 -0
- package/lib/authoring/symbols.js +4 -0
- package/{composition.js → lib/composition.js} +9 -35
- package/lib/configuration.js +66 -0
- package/native.d.ts +98 -0
- package/native.js +714 -0
- package/package.json +16 -11
- package/types/authoring.d.ts +667 -0
- package/types/composition.d.ts +327 -0
- package/types/model.d.ts +425 -0
- package/types/result.d.ts +394 -0
- package/types/runtime.d.ts +168 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
GraphDefinitionInput,
|
|
3
|
+
ParameterDefinition,
|
|
4
|
+
ProjectionFieldDefinition,
|
|
5
|
+
ProjectionTypeMetadata,
|
|
6
|
+
RelationCardinality,
|
|
7
|
+
ScalarParameterValue,
|
|
8
|
+
} from './model.js'
|
|
9
|
+
import type {
|
|
10
|
+
DefinitionOf,
|
|
11
|
+
DefinitionOrderingName,
|
|
12
|
+
DefinitionParameter,
|
|
13
|
+
DefinitionProjectionField,
|
|
14
|
+
DefinitionProjectionPath,
|
|
15
|
+
OperationParameters,
|
|
16
|
+
OracleCompileOptions,
|
|
17
|
+
ParameterValue,
|
|
18
|
+
QueryOperationBase,
|
|
19
|
+
RelationalQueryGraph,
|
|
20
|
+
SqlServerCompileOptions,
|
|
21
|
+
} from './runtime.js'
|
|
22
|
+
import type { ListParameterRef } from './authoring.js'
|
|
23
|
+
|
|
24
|
+
type RequiredParameter<Parameter extends ParameterDefinition> = Parameter extends unknown
|
|
25
|
+
? Parameter extends { required?: true }
|
|
26
|
+
? Parameter
|
|
27
|
+
: never
|
|
28
|
+
: never
|
|
29
|
+
|
|
30
|
+
type OptionalParameter<Parameter extends ParameterDefinition> = Parameter extends unknown
|
|
31
|
+
? Parameter extends { required?: true }
|
|
32
|
+
? never
|
|
33
|
+
: Parameter
|
|
34
|
+
: never
|
|
35
|
+
|
|
36
|
+
type OperationParameterInput<Definition extends GraphDefinitionInput> = [DefinitionParameter<Definition>] extends [
|
|
37
|
+
never,
|
|
38
|
+
]
|
|
39
|
+
? { parameters?: never }
|
|
40
|
+
: [RequiredParameter<DefinitionParameter<Definition>>] extends [never]
|
|
41
|
+
? { parameters?: OperationParameters<Definition> }
|
|
42
|
+
: { parameters: OperationParameters<Definition> }
|
|
43
|
+
|
|
44
|
+
type ProjectionFieldPath<Field> =
|
|
45
|
+
Field extends ProjectionTypeMetadata<infer Path, infer _Type, infer _Nullability, infer _SelectedByDefault>
|
|
46
|
+
? Path
|
|
47
|
+
: Field extends ProjectionFieldDefinition<infer Path>
|
|
48
|
+
? Path
|
|
49
|
+
: never
|
|
50
|
+
|
|
51
|
+
type ProjectionFieldByPath<Field, Path extends string> = Field extends ProjectionFieldDefinition
|
|
52
|
+
? ProjectionFieldPath<Field> extends Path
|
|
53
|
+
? Field
|
|
54
|
+
: never
|
|
55
|
+
: never
|
|
56
|
+
|
|
57
|
+
export type BatchCardinality = RelationCardinality
|
|
58
|
+
|
|
59
|
+
export interface BatchRelationWire {
|
|
60
|
+
name: string
|
|
61
|
+
from: string
|
|
62
|
+
to: string
|
|
63
|
+
parameter: string
|
|
64
|
+
cardinality: BatchCardinality
|
|
65
|
+
parameters?: Record<string, unknown>
|
|
66
|
+
ordering?: string
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
type ListDefinitionParameter<Definition extends GraphDefinitionInput> =
|
|
70
|
+
DefinitionParameter<Definition> extends infer Parameter extends ParameterDefinition
|
|
71
|
+
? Parameter extends { shape: 'list' }
|
|
72
|
+
? Parameter
|
|
73
|
+
: never
|
|
74
|
+
: never
|
|
75
|
+
|
|
76
|
+
type ListParameterReference<Definition extends GraphDefinitionInput> =
|
|
77
|
+
| ListDefinitionParameter<Definition>
|
|
78
|
+
| ListDefinitionParameter<Definition>['name']
|
|
79
|
+
|
|
80
|
+
type ParameterReferenceName<Reference> = Reference extends { name: infer Name extends string }
|
|
81
|
+
? Name
|
|
82
|
+
: Reference extends string
|
|
83
|
+
? Reference
|
|
84
|
+
: never
|
|
85
|
+
|
|
86
|
+
type ResolveListParameter<Definition extends GraphDefinitionInput, Reference> = Extract<
|
|
87
|
+
ListDefinitionParameter<Definition>,
|
|
88
|
+
{ name: ParameterReferenceName<Reference> }
|
|
89
|
+
>
|
|
90
|
+
|
|
91
|
+
type BatchStaticParameterCandidate<
|
|
92
|
+
Parameter extends ParameterDefinition,
|
|
93
|
+
KeyName extends string,
|
|
94
|
+
> = Parameter extends ParameterDefinition ? (Parameter['name'] extends KeyName ? never : Parameter) : never
|
|
95
|
+
|
|
96
|
+
type BatchStaticParameter<
|
|
97
|
+
Definition extends GraphDefinitionInput,
|
|
98
|
+
KeyName extends string,
|
|
99
|
+
> = BatchStaticParameterCandidate<DefinitionParameter<Definition>, KeyName>
|
|
100
|
+
|
|
101
|
+
type BatchStaticParameters<Definition extends GraphDefinitionInput, KeyName extends string> = {
|
|
102
|
+
[Parameter in RequiredParameter<
|
|
103
|
+
BatchStaticParameter<Definition, KeyName>
|
|
104
|
+
> as Parameter['name']]-?: ParameterValue<Parameter>
|
|
105
|
+
} & {
|
|
106
|
+
[Parameter in OptionalParameter<
|
|
107
|
+
BatchStaticParameter<Definition, KeyName>
|
|
108
|
+
> as Parameter['name']]?: ParameterValue<Parameter>
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
type BatchStaticParameterInput<Definition extends GraphDefinitionInput, KeyName extends string> = [
|
|
112
|
+
BatchStaticParameter<Definition, KeyName>,
|
|
113
|
+
] extends [never]
|
|
114
|
+
? { parameters?: never }
|
|
115
|
+
: [RequiredParameter<BatchStaticParameter<Definition, KeyName>>] extends [never]
|
|
116
|
+
? { parameters?: BatchStaticParameters<Definition, KeyName> }
|
|
117
|
+
: { parameters: BatchStaticParameters<Definition, KeyName> }
|
|
118
|
+
|
|
119
|
+
declare const batchQueryType: unique symbol
|
|
120
|
+
|
|
121
|
+
export interface BatchQuery<
|
|
122
|
+
Child extends RelationalQueryGraph = RelationalQueryGraph,
|
|
123
|
+
KeyPath extends string = string,
|
|
124
|
+
KeyParameter extends ParameterDefinition & { shape: 'list' } = ListParameterRef,
|
|
125
|
+
> {
|
|
126
|
+
readonly graph: Child
|
|
127
|
+
readonly key: {
|
|
128
|
+
readonly path: KeyPath
|
|
129
|
+
readonly parameter: KeyParameter['name']
|
|
130
|
+
}
|
|
131
|
+
readonly [batchQueryType]?: KeyParameter
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export type BatchQueryConfiguration<
|
|
135
|
+
Child extends RelationalQueryGraph,
|
|
136
|
+
KeyPath extends DefinitionProjectionPath<DefinitionOf<Child>>,
|
|
137
|
+
ParameterReference extends ListParameterReference<DefinitionOf<Child>>,
|
|
138
|
+
> = {
|
|
139
|
+
graph: Child
|
|
140
|
+
key: {
|
|
141
|
+
path: KeyPath
|
|
142
|
+
parameter: ParameterReference
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
type CompatibleBatchQueryConfiguration<
|
|
147
|
+
Child extends RelationalQueryGraph,
|
|
148
|
+
KeyPath extends DefinitionProjectionPath<DefinitionOf<Child>>,
|
|
149
|
+
KeyParameter extends ParameterDefinition & { shape: 'list' },
|
|
150
|
+
> =
|
|
151
|
+
EqualScalarType<ProjectionScalarTypeAtPath<DefinitionOf<Child>, KeyPath>, KeyParameter['scalarType']> extends true
|
|
152
|
+
? unknown
|
|
153
|
+
: never
|
|
154
|
+
|
|
155
|
+
export function batchQuery<
|
|
156
|
+
const Child extends RelationalQueryGraph,
|
|
157
|
+
const KeyPath extends DefinitionProjectionPath<DefinitionOf<Child>>,
|
|
158
|
+
const ParameterReference extends ListParameterReference<DefinitionOf<Child>>,
|
|
159
|
+
>(
|
|
160
|
+
configuration: BatchQueryConfiguration<Child, KeyPath, ParameterReference> &
|
|
161
|
+
CompatibleBatchQueryConfiguration<
|
|
162
|
+
Child,
|
|
163
|
+
KeyPath,
|
|
164
|
+
ResolveListParameter<DefinitionOf<Child>, NoInfer<ParameterReference>>
|
|
165
|
+
>,
|
|
166
|
+
): BatchQuery<Child, KeyPath, ResolveListParameter<DefinitionOf<Child>, ParameterReference>>
|
|
167
|
+
|
|
168
|
+
type BatchQueryGraph<Query extends BatchQuery> =
|
|
169
|
+
Query extends BatchQuery<infer Child, infer _KeyPath, infer _KeyParameter> ? Child : never
|
|
170
|
+
|
|
171
|
+
type BatchQueryKeyPath<Query extends BatchQuery> =
|
|
172
|
+
Query extends BatchQuery<infer _Child, infer KeyPath, infer _KeyParameter> ? KeyPath : never
|
|
173
|
+
|
|
174
|
+
type BatchQueryKeyParameter<Query extends BatchQuery> =
|
|
175
|
+
Query extends BatchQuery<infer _Child, infer _KeyPath, infer KeyParameter> ? KeyParameter : never
|
|
176
|
+
|
|
177
|
+
declare const batchRelationType: unique symbol
|
|
178
|
+
|
|
179
|
+
export interface BatchRelation<
|
|
180
|
+
Name extends string = string,
|
|
181
|
+
Query extends BatchQuery = BatchQuery,
|
|
182
|
+
From extends string = string,
|
|
183
|
+
Cardinality extends BatchCardinality = BatchCardinality,
|
|
184
|
+
> {
|
|
185
|
+
readonly name: Name
|
|
186
|
+
readonly from: From
|
|
187
|
+
readonly query: Query
|
|
188
|
+
readonly cardinality: Cardinality
|
|
189
|
+
readonly parameters: BatchStaticParameters<
|
|
190
|
+
DefinitionOf<BatchQueryGraph<Query>>,
|
|
191
|
+
BatchQueryKeyParameter<Query>['name']
|
|
192
|
+
>
|
|
193
|
+
readonly ordering?: DefinitionOrderingName<DefinitionOf<BatchQueryGraph<Query>>>
|
|
194
|
+
readonly [batchRelationType]?: Query
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export type BatchRelationConfiguration<
|
|
198
|
+
Name extends string,
|
|
199
|
+
Query extends BatchQuery,
|
|
200
|
+
From extends string,
|
|
201
|
+
Cardinality extends BatchCardinality,
|
|
202
|
+
> = {
|
|
203
|
+
name: Name
|
|
204
|
+
from: From
|
|
205
|
+
query: Query
|
|
206
|
+
cardinality: Cardinality
|
|
207
|
+
ordering?: DefinitionOrderingName<DefinitionOf<BatchQueryGraph<Query>>>
|
|
208
|
+
} & BatchStaticParameterInput<DefinitionOf<BatchQueryGraph<Query>>, BatchQueryKeyParameter<Query>['name']>
|
|
209
|
+
|
|
210
|
+
export function batchRelation<
|
|
211
|
+
const Name extends string,
|
|
212
|
+
const Query extends BatchQuery,
|
|
213
|
+
const From extends string,
|
|
214
|
+
const Cardinality extends BatchCardinality,
|
|
215
|
+
>(
|
|
216
|
+
configuration: BatchRelationConfiguration<Name, Query, From, Cardinality>,
|
|
217
|
+
): BatchRelation<Name, Query, From, Cardinality>
|
|
218
|
+
|
|
219
|
+
type ProjectionScalarTypeAtPath<Definition extends GraphDefinitionInput, Path extends string> =
|
|
220
|
+
ProjectionFieldByPath<DefinitionProjectionField<Definition>, Path> extends infer Field
|
|
221
|
+
? Field extends ProjectionTypeMetadata<infer _Path, infer Type, infer _Nullability, infer _SelectedByDefault>
|
|
222
|
+
? Type
|
|
223
|
+
: Field extends ProjectionFieldDefinition<infer _Path, infer Type>
|
|
224
|
+
? Type
|
|
225
|
+
: never
|
|
226
|
+
: never
|
|
227
|
+
|
|
228
|
+
type EqualScalarType<Left, Right> = [Left] extends [Right] ? ([Right] extends [Left] ? true : false) : false
|
|
229
|
+
|
|
230
|
+
type CompatibleBatchRelation<Root extends RelationalQueryGraph, Relation extends BatchRelation> =
|
|
231
|
+
Relation extends BatchRelation<infer Name, infer Query, infer From, infer _Cardinality>
|
|
232
|
+
? From extends DefinitionProjectionPath<DefinitionOf<Root>>
|
|
233
|
+
? Extract<DefinitionProjectionPath<DefinitionOf<Root>>, Name | `${Name}.${string}`> extends never
|
|
234
|
+
? EqualScalarType<
|
|
235
|
+
ProjectionScalarTypeAtPath<DefinitionOf<Root>, From>,
|
|
236
|
+
ProjectionScalarTypeAtPath<DefinitionOf<BatchQueryGraph<Query>>, BatchQueryKeyPath<Query>>
|
|
237
|
+
> extends true
|
|
238
|
+
? EqualScalarType<
|
|
239
|
+
ProjectionScalarTypeAtPath<DefinitionOf<BatchQueryGraph<Query>>, BatchQueryKeyPath<Query>>,
|
|
240
|
+
BatchQueryKeyParameter<Query>['scalarType']
|
|
241
|
+
> extends true
|
|
242
|
+
? Relation
|
|
243
|
+
: never
|
|
244
|
+
: never
|
|
245
|
+
: never
|
|
246
|
+
: never
|
|
247
|
+
: never
|
|
248
|
+
|
|
249
|
+
type CompatibleBatchRelations<Root extends RelationalQueryGraph, Relations extends readonly BatchRelation[]> = {
|
|
250
|
+
readonly [Index in keyof Relations]: Relations[Index] extends BatchRelation
|
|
251
|
+
? CompatibleBatchRelation<Root, Relations[Index]>
|
|
252
|
+
: never
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
type RelationName<Relations extends readonly BatchRelation[]> = Relations[number]['name']
|
|
256
|
+
type ChildPathsForRelation<Relation extends BatchRelation> = Relation extends BatchRelation
|
|
257
|
+
? `${Relation['name']}.${DefinitionProjectionPath<DefinitionOf<BatchQueryGraph<Relation['query']>>>}`
|
|
258
|
+
: never
|
|
259
|
+
type ChildPaths<Relations extends readonly BatchRelation[]> = ChildPathsForRelation<Relations[number]>
|
|
260
|
+
|
|
261
|
+
export type ComposedSelection<Root extends RelationalQueryGraph, Relations extends readonly BatchRelation[]> =
|
|
262
|
+
| DefinitionProjectionPath<DefinitionOf<Root>>
|
|
263
|
+
| ChildPaths<Relations>
|
|
264
|
+
|
|
265
|
+
export interface BatchPlanMetadata<Relation extends BatchRelation = BatchRelation> {
|
|
266
|
+
name: Relation['name']
|
|
267
|
+
parentKey: Relation['from']
|
|
268
|
+
childKey: BatchQueryKeyPath<Relation['query']>
|
|
269
|
+
keyParameter: BatchQueryKeyParameter<Relation['query']>['name']
|
|
270
|
+
parameters: Readonly<Relation['parameters']>
|
|
271
|
+
cardinality: Relation['cardinality']
|
|
272
|
+
parentKeyInjected: boolean
|
|
273
|
+
childKeyInjected: boolean
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
type BatchRelationNamed<Relation extends BatchRelation, Name extends string> = Relation extends BatchRelation
|
|
277
|
+
? Relation['name'] extends Name
|
|
278
|
+
? Relation
|
|
279
|
+
: never
|
|
280
|
+
: never
|
|
281
|
+
|
|
282
|
+
type BatchRelationByName<Relations extends readonly BatchRelation[], Name extends string> = BatchRelationNamed<
|
|
283
|
+
Relations[number],
|
|
284
|
+
Name
|
|
285
|
+
>
|
|
286
|
+
|
|
287
|
+
type BatchKeyValue<Relation extends BatchRelation> = ScalarParameterValue<
|
|
288
|
+
BatchQueryKeyParameter<Relation['query']>['scalarType']
|
|
289
|
+
>
|
|
290
|
+
|
|
291
|
+
export interface CompiledQueryPlan<Relations extends readonly BatchRelation[] = readonly BatchRelation[]> {
|
|
292
|
+
readonly root: import('../native.js').CompiledSqlStatement
|
|
293
|
+
readonly batches: readonly BatchPlanMetadata<Relations[number]>[]
|
|
294
|
+
compileBatch<const Name extends RelationName<Relations>>(
|
|
295
|
+
name: Name,
|
|
296
|
+
keys: readonly BatchKeyValue<BatchRelationByName<Relations, Name>>[],
|
|
297
|
+
): import('../native.js').CompiledSqlStatement
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
export type ComposedQueryOperation<
|
|
301
|
+
Root extends RelationalQueryGraph,
|
|
302
|
+
Relations extends readonly BatchRelation[],
|
|
303
|
+
> = QueryOperationBase<ComposedSelection<Root, Relations>, DefinitionOrderingName<DefinitionOf<Root>>> &
|
|
304
|
+
OperationParameterInput<DefinitionOf<Root>>
|
|
305
|
+
|
|
306
|
+
export interface ComposedQueryGraph<
|
|
307
|
+
Root extends RelationalQueryGraph = RelationalQueryGraph,
|
|
308
|
+
Relations extends readonly BatchRelation[] = readonly BatchRelation[],
|
|
309
|
+
> {
|
|
310
|
+
readonly name: string
|
|
311
|
+
compileOraclePlan(
|
|
312
|
+
operation: ComposedQueryOperation<Root, Relations>,
|
|
313
|
+
options?: OracleCompileOptions,
|
|
314
|
+
): CompiledQueryPlan<Relations>
|
|
315
|
+
compileSqlServerPlan(
|
|
316
|
+
operation: ComposedQueryOperation<Root, Relations>,
|
|
317
|
+
options?: SqlServerCompileOptions,
|
|
318
|
+
): CompiledQueryPlan<Relations>
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
export function composeGraph<
|
|
322
|
+
const Root extends RelationalQueryGraph,
|
|
323
|
+
const Relations extends readonly BatchRelation[],
|
|
324
|
+
>(configuration: {
|
|
325
|
+
root: Root
|
|
326
|
+
relations: Relations & CompatibleBatchRelations<Root, Relations>
|
|
327
|
+
}): ComposedQueryGraph<Root, Relations>
|