@query-graph/core 1.1.3 → 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.
@@ -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>