@pothos/plugin-drizzle 0.18.0 → 0.19.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/CHANGELOG.md +351 -0
- package/README.md +784 -221
- package/dts/connection-helpers.d.ts +18 -8
- package/dts/connection-helpers.d.ts.map +1 -1
- package/dts/drizzle-field-builder.d.ts +4 -11
- package/dts/drizzle-field-builder.d.ts.map +1 -1
- package/dts/global-types.d.ts.map +1 -1
- package/dts/index.d.ts.map +1 -1
- package/dts/model-loader.d.ts +18 -17
- package/dts/model-loader.d.ts.map +1 -1
- package/dts/types.d.ts +81 -20
- package/dts/types.d.ts.map +1 -1
- package/dts/utils/adapter.d.ts +39 -0
- package/dts/utils/adapter.d.ts.map +1 -0
- package/dts/utils/await-selections.d.ts +12 -0
- package/dts/utils/await-selections.d.ts.map +1 -0
- package/dts/utils/config.d.ts +23 -3
- package/dts/utils/config.d.ts.map +1 -1
- package/dts/utils/cursors.d.ts +6 -6
- package/dts/utils/cursors.d.ts.map +1 -1
- package/dts/utils/map-query.d.ts +22 -21
- package/dts/utils/map-query.d.ts.map +1 -1
- package/dts/utils/path-info.d.ts +13 -0
- package/dts/utils/path-info.d.ts.map +1 -0
- package/dts/utils/relation-filter.d.ts +48 -0
- package/dts/utils/relation-filter.d.ts.map +1 -0
- package/dts/utils/selections.d.ts +2 -21
- package/dts/utils/selections.d.ts.map +1 -1
- package/esm/connection-helpers.d.ts +18 -8
- package/esm/connection-helpers.d.ts.map +1 -1
- package/esm/connection-helpers.js +52 -19
- package/esm/connection-helpers.js.map +1 -1
- package/esm/drizzle-field-builder.d.ts +4 -11
- package/esm/drizzle-field-builder.d.ts.map +1 -1
- package/esm/drizzle-field-builder.js +138 -96
- package/esm/drizzle-field-builder.js.map +1 -1
- package/esm/field-builder.js +61 -47
- package/esm/field-builder.js.map +1 -1
- package/esm/global-types.d.ts.map +1 -1
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +37 -61
- package/esm/index.js.map +1 -1
- package/esm/model-loader.d.ts +18 -17
- package/esm/model-loader.d.ts.map +1 -1
- package/esm/model-loader.js +76 -45
- package/esm/model-loader.js.map +1 -1
- package/esm/schema-builder.js +40 -149
- package/esm/schema-builder.js.map +1 -1
- package/esm/types.d.ts +81 -20
- package/esm/types.d.ts.map +1 -1
- package/esm/types.js +1 -0
- package/esm/types.js.map +1 -1
- package/esm/utils/adapter.d.ts +39 -0
- package/esm/utils/adapter.d.ts.map +1 -0
- package/esm/utils/adapter.js +137 -0
- package/esm/utils/adapter.js.map +1 -0
- package/esm/utils/await-selections.d.ts +12 -0
- package/esm/utils/await-selections.d.ts.map +1 -0
- package/esm/utils/await-selections.js +19 -0
- package/esm/utils/await-selections.js.map +1 -0
- package/esm/utils/config.d.ts +23 -3
- package/esm/utils/config.d.ts.map +1 -1
- package/esm/utils/config.js +1 -4
- package/esm/utils/config.js.map +1 -1
- package/esm/utils/cursors.d.ts +6 -6
- package/esm/utils/cursors.d.ts.map +1 -1
- package/esm/utils/cursors.js +55 -90
- package/esm/utils/cursors.js.map +1 -1
- package/esm/utils/map-query.d.ts +22 -21
- package/esm/utils/map-query.d.ts.map +1 -1
- package/esm/utils/map-query.js +40 -336
- package/esm/utils/map-query.js.map +1 -1
- package/esm/utils/path-info.d.ts +13 -0
- package/esm/utils/path-info.d.ts.map +1 -0
- package/esm/utils/path-info.js +37 -0
- package/esm/utils/path-info.js.map +1 -0
- package/esm/utils/relation-filter.d.ts +48 -0
- package/esm/utils/relation-filter.d.ts.map +1 -0
- package/esm/utils/relation-filter.js +92 -0
- package/esm/utils/relation-filter.js.map +1 -0
- package/esm/utils/selections.d.ts +2 -21
- package/esm/utils/selections.d.ts.map +1 -1
- package/esm/utils/selections.js +1 -133
- package/esm/utils/selections.js.map +1 -1
- package/lib/connection-helpers.js +51 -18
- package/lib/connection-helpers.js.map +1 -1
- package/lib/drizzle-field-builder.js +136 -94
- package/lib/drizzle-field-builder.js.map +1 -1
- package/lib/field-builder.js +58 -44
- package/lib/field-builder.js.map +1 -1
- package/lib/index.js +36 -60
- package/lib/index.js.map +1 -1
- package/lib/model-loader.js +76 -45
- package/lib/model-loader.js.map +1 -1
- package/lib/schema-builder.js +40 -149
- package/lib/schema-builder.js.map +1 -1
- package/lib/types.js +4 -0
- package/lib/types.js.map +1 -1
- package/lib/utils/adapter.js +147 -0
- package/lib/utils/adapter.js.map +1 -0
- package/lib/utils/await-selections.js +20 -0
- package/lib/utils/await-selections.js.map +1 -0
- package/lib/utils/config.js +1 -4
- package/lib/utils/config.js.map +1 -1
- package/lib/utils/cursors.js +47 -88
- package/lib/utils/cursors.js.map +1 -1
- package/lib/utils/map-query.js +28 -341
- package/lib/utils/map-query.js.map +1 -1
- package/lib/utils/path-info.js +39 -0
- package/lib/utils/path-info.js.map +1 -0
- package/lib/utils/relation-filter.js +91 -0
- package/lib/utils/relation-filter.js.map +1 -0
- package/lib/utils/selections.js +3 -158
- package/lib/utils/selections.js.map +1 -1
- package/package.json +8 -6
- package/src/connection-helpers.ts +167 -53
- package/src/drizzle-field-builder.ts +296 -176
- package/src/field-builder.ts +110 -77
- package/src/global-types.ts +0 -32
- package/src/index.ts +42 -68
- package/src/model-loader.ts +110 -71
- package/src/schema-builder.ts +76 -169
- package/src/types.ts +176 -44
- package/src/utils/adapter.ts +197 -0
- package/src/utils/await-selections.ts +31 -0
- package/src/utils/config.ts +1 -5
- package/src/utils/cursors.ts +53 -81
- package/src/utils/map-query.ts +51 -708
- package/src/utils/path-info.ts +40 -0
- package/src/utils/relation-filter.ts +185 -0
- package/src/utils/selections.ts +2 -207
- package/dts/utils/deep-equal.d.ts +0 -2
- package/dts/utils/deep-equal.d.ts.map +0 -1
- package/dts/utils/drizzle-graphql.d.ts +0 -2
- package/dts/utils/drizzle-graphql.d.ts.map +0 -1
- package/dts/utils/loader-map.d.ts +0 -11
- package/dts/utils/loader-map.d.ts.map +0 -1
- package/dts/utils/usage.d.ts +0 -5
- package/dts/utils/usage.d.ts.map +0 -1
- package/esm/utils/deep-equal.d.ts +0 -2
- package/esm/utils/deep-equal.d.ts.map +0 -1
- package/esm/utils/deep-equal.js +0 -45
- package/esm/utils/deep-equal.js.map +0 -1
- package/esm/utils/drizzle-graphql.d.ts +0 -2
- package/esm/utils/drizzle-graphql.d.ts.map +0 -1
- package/esm/utils/drizzle-graphql.js +0 -232
- package/esm/utils/drizzle-graphql.js.map +0 -1
- package/esm/utils/loader-map.d.ts +0 -11
- package/esm/utils/loader-map.d.ts.map +0 -1
- package/esm/utils/loader-map.js +0 -35
- package/esm/utils/loader-map.js.map +0 -1
- package/esm/utils/usage.d.ts +0 -5
- package/esm/utils/usage.d.ts.map +0 -1
- package/esm/utils/usage.js +0 -59
- package/esm/utils/usage.js.map +0 -1
- package/lib/utils/deep-equal.js +0 -55
- package/lib/utils/deep-equal.js.map +0 -1
- package/lib/utils/drizzle-graphql.js +0 -236
- package/lib/utils/drizzle-graphql.js.map +0 -1
- package/lib/utils/loader-map.js +0 -56
- package/lib/utils/loader-map.js.map +0 -1
- package/lib/utils/usage.js +0 -83
- package/lib/utils/usage.js.map +0 -1
- package/src/utils/deep-equal.ts +0 -57
- package/src/utils/drizzle-graphql.ts +0 -274
- package/src/utils/loader-map.ts +0 -49
- package/src/utils/usage.ts +0 -62
package/esm/utils/map-query.js
CHANGED
|
@@ -1,341 +1,45 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
...includePath
|
|
41
|
-
], path, resolve, deferred);
|
|
42
|
-
} else {
|
|
43
|
-
resolveIndirectInclude(type, info, selection, includePath, path, resolve, deferred);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
function resolveIndirectInclude(type, info, selection, includePath, path, resolve, deferred = false) {
|
|
48
|
-
if (includePath.length === 0) {
|
|
49
|
-
resolve(type, selection, path, deferred);
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
const [include, ...rest] = includePath;
|
|
53
|
-
if (!selection.selectionSet || !include) {
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
for (const sel of selection.selectionSet.selections){
|
|
57
|
-
switch(sel.kind){
|
|
58
|
-
case Kind.FIELD:
|
|
59
|
-
if (!fieldSkipped(info, sel) && sel.name.value === include.name && (isObjectType(type) || isInterfaceType(type))) {
|
|
60
|
-
var _ref;
|
|
61
|
-
var _sel_alias;
|
|
62
|
-
const returnType = getNamedType(type.getFields()[sel.name.value].type);
|
|
63
|
-
resolveIndirectInclude(returnType, info, sel, rest, [
|
|
64
|
-
...path,
|
|
65
|
-
(_ref = (_sel_alias = sel.alias) === null || _sel_alias === void 0 ? void 0 : _sel_alias.value) !== null && _ref !== void 0 ? _ref : sel.name.value
|
|
66
|
-
], resolve, deferred);
|
|
67
|
-
}
|
|
68
|
-
continue;
|
|
69
|
-
case Kind.FRAGMENT_SPREAD:
|
|
70
|
-
if (!include.type || info.fragments[sel.name.value].typeCondition.name.value === include.type) {
|
|
71
|
-
resolveIndirectInclude(include.type ? info.schema.getType(include.type) : type, info, info.fragments[sel.name.value], includePath, path, resolve, deferred || isDeferredFragment(sel, info));
|
|
72
|
-
}
|
|
73
|
-
continue;
|
|
74
|
-
case Kind.INLINE_FRAGMENT:
|
|
75
|
-
if (!sel.typeCondition || !include.type || sel.typeCondition.name.value === include.type) {
|
|
76
|
-
resolveIndirectInclude(sel.typeCondition ? info.schema.getType(sel.typeCondition.name.value) : type, info, sel, includePath, path, resolve, deferred || isDeferredFragment(sel, info));
|
|
77
|
-
}
|
|
78
|
-
continue;
|
|
79
|
-
default:
|
|
80
|
-
throw new PothosValidationError(`Unsupported selection kind ${selection.kind}`);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
function addNestedSelections(config, type, context, info, state, selections, indirectPath, segments = []) {
|
|
85
|
-
let parentType = type;
|
|
86
|
-
for (const selection of selections.selections){
|
|
87
|
-
switch(selection.kind){
|
|
88
|
-
case Kind.FIELD:
|
|
89
|
-
addFieldSelection(config, type, context, info, state, selection, indirectPath, segments);
|
|
90
|
-
continue;
|
|
91
|
-
case Kind.FRAGMENT_SPREAD:
|
|
92
|
-
var _parentType_extensions;
|
|
93
|
-
if (state.skipDeferredFragments && isDeferredFragment(selection, info)) {
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
|
-
parentType = info.schema.getType(info.fragments[selection.name.value].typeCondition.name.value);
|
|
97
|
-
if (isObjectType(type) ? parentType.name !== type.name : ((_parentType_extensions = parentType.extensions) === null || _parentType_extensions === void 0 ? void 0 : _parentType_extensions.pothosDrizzleModel) !== type.extensions.pothosDrizzleModel) {
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
addNestedSelections(config, parentType, context, info, state, info.fragments[selection.name.value].selectionSet, indirectPath, segments);
|
|
101
|
-
continue;
|
|
102
|
-
case Kind.INLINE_FRAGMENT:
|
|
103
|
-
var _parentType_extensions1;
|
|
104
|
-
if (state.skipDeferredFragments && isDeferredFragment(selection, info)) {
|
|
105
|
-
continue;
|
|
106
|
-
}
|
|
107
|
-
parentType = selection.typeCondition ? info.schema.getType(selection.typeCondition.name.value) : type;
|
|
108
|
-
if (isObjectType(type) ? parentType.name !== type.name : ((_parentType_extensions1 = parentType.extensions) === null || _parentType_extensions1 === void 0 ? void 0 : _parentType_extensions1.pothosDrizzleModel) !== type.extensions.pothosDrizzleModel) {
|
|
109
|
-
continue;
|
|
110
|
-
}
|
|
111
|
-
addNestedSelections(config, parentType, context, info, state, selection.selectionSet, indirectPath, segments);
|
|
112
|
-
continue;
|
|
113
|
-
default:
|
|
114
|
-
throw new PothosValidationError(`Unsupported selection kind ${selection.kind}`);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
function addFieldSelection(config, type, context, info, state, selection, indirectPath, segments = []) {
|
|
119
|
-
var _ref;
|
|
120
|
-
var _selection_alias, _field_extensions;
|
|
121
|
-
if (selection.name.value.startsWith('__') || fieldSkipped(info, selection)) {
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
const field = type.getFields()[selection.name.value];
|
|
125
|
-
if (!field) {
|
|
126
|
-
throw new PothosValidationError(`Unknown field ${selection.name.value} on ${type.name}`);
|
|
127
|
-
}
|
|
128
|
-
const allSegments = [
|
|
129
|
-
...segments,
|
|
130
|
-
{
|
|
131
|
-
field: selection.name.value,
|
|
132
|
-
alias: (_ref = (_selection_alias = selection.alias) === null || _selection_alias === void 0 ? void 0 : _selection_alias.value) !== null && _ref !== void 0 ? _ref : selection.name.value,
|
|
133
|
-
parentType: type.name,
|
|
134
|
-
isList: isListType(field.type) || isListType(getNamedType(field.type))
|
|
135
|
-
}
|
|
136
|
-
];
|
|
137
|
-
const fieldSelect = (_field_extensions = field.extensions) === null || _field_extensions === void 0 ? void 0 : _field_extensions.pothosDrizzleSelect;
|
|
138
|
-
let fieldSelectionMap;
|
|
139
|
-
let mappings = {};
|
|
140
|
-
if (typeof fieldSelect === 'function') {
|
|
141
|
-
const pathInfo = {
|
|
142
|
-
path: allSegments.map((s)=>`${s.parentType}.${s.field}`),
|
|
143
|
-
segments: allSegments
|
|
144
|
-
};
|
|
145
|
-
const args = getMappedArgumentValues(field, selection, context, info);
|
|
146
|
-
fieldSelectionMap = fieldSelect(args, context, (rawQuery, indirectInclude, expectedType)=>{
|
|
147
|
-
const returnType = getNamedType(field.type);
|
|
148
|
-
const query = typeof rawQuery === 'function' ? rawQuery(args, context) : rawQuery;
|
|
149
|
-
const normalizedIndirectInclude = Array.isArray(indirectInclude) ? normalizeInclude(indirectInclude, getIndirectType(returnType, info), expectedType ? getNamedType(info.schema.getType(expectedType)) : undefined) : indirectInclude;
|
|
150
|
-
const fieldState = createStateForSelection(config, info, normalizedIndirectInclude ? info.schema.getType(normalizedIndirectInclude.getType()) : returnType, state);
|
|
151
|
-
if (typeof query === 'object' && Object.keys(query).length > 0) {
|
|
152
|
-
mergeSelection(config, fieldState, {
|
|
153
|
-
columns: {},
|
|
154
|
-
...query
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
if (!!(normalizedIndirectInclude === null || normalizedIndirectInclude === void 0 ? void 0 : normalizedIndirectInclude.path) && normalizedIndirectInclude.path.length > 0 || !!(normalizedIndirectInclude === null || normalizedIndirectInclude === void 0 ? void 0 : normalizedIndirectInclude.paths) && normalizedIndirectInclude.paths.length > 0) {
|
|
158
|
-
var _ref, _normalizedIndirectInclude_paths;
|
|
159
|
-
var _returnType_extensions_pothosIndirectInclude, _returnType_extensions;
|
|
160
|
-
resolveIndirectIncludePaths(returnType, info, selection, (_ref = (_returnType_extensions = returnType.extensions) === null || _returnType_extensions === void 0 ? void 0 : (_returnType_extensions_pothosIndirectInclude = _returnType_extensions.pothosIndirectInclude) === null || _returnType_extensions_pothosIndirectInclude === void 0 ? void 0 : _returnType_extensions_pothosIndirectInclude.path) !== null && _ref !== void 0 ? _ref : [], (_normalizedIndirectInclude_paths = normalizedIndirectInclude.paths) !== null && _normalizedIndirectInclude_paths !== void 0 ? _normalizedIndirectInclude_paths : [
|
|
161
|
-
normalizedIndirectInclude.path
|
|
162
|
-
], [], (resolvedType, resolvedField, path, deferred)=>{
|
|
163
|
-
addTypeSelectionsForField(config, resolvedType, context, info, fieldState, resolvedField, path, deferred, allSegments);
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
addTypeSelectionsForField(config, returnType, context, info, fieldState, selection, [], undefined, allSegments);
|
|
167
|
-
mappings = fieldState.mappings;
|
|
168
|
-
return selectionToQuery(config, fieldState);
|
|
169
|
-
}, (path)=>{
|
|
170
|
-
const returnType = getNamedType(field.type);
|
|
171
|
-
let node = null;
|
|
172
|
-
resolveIndirectInclude(returnType, info, selection, path.map((name)=>({
|
|
173
|
-
name
|
|
174
|
-
})), [], (_, resolvedField)=>{
|
|
175
|
-
node = resolvedField;
|
|
176
|
-
});
|
|
177
|
-
return node;
|
|
178
|
-
}, pathInfo);
|
|
179
|
-
} else {
|
|
180
|
-
fieldSelectionMap = fieldSelect;
|
|
181
|
-
}
|
|
182
|
-
if (fieldSelect && selectionCompatible(state, fieldSelectionMap, true)) {
|
|
183
|
-
var _ref1;
|
|
184
|
-
var _selection_alias1;
|
|
185
|
-
mergeSelection(config, state, fieldSelectionMap);
|
|
186
|
-
state.mappings = mergeMappings(state.mappings, {
|
|
187
|
-
[(_ref1 = (_selection_alias1 = selection.alias) === null || _selection_alias1 === void 0 ? void 0 : _selection_alias1.value) !== null && _ref1 !== void 0 ? _ref1 : selection.name.value]: {
|
|
188
|
-
field: selection.name.value,
|
|
189
|
-
type: type.name,
|
|
190
|
-
mappings,
|
|
191
|
-
indirectPath
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
function mergeMappings(existing, incoming) {
|
|
197
|
-
const result = {
|
|
198
|
-
...existing
|
|
199
|
-
};
|
|
200
|
-
for (const [key, value] of Object.entries(incoming)){
|
|
201
|
-
if (result[key]) {
|
|
202
|
-
result[key] = {
|
|
203
|
-
...result[key],
|
|
204
|
-
mappings: mergeMappings(result[key].mappings, value.mappings)
|
|
205
|
-
};
|
|
206
|
-
} else {
|
|
207
|
-
result[key] = value;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
return result;
|
|
211
|
-
}
|
|
212
|
-
export function queryFromInfo({ withUsageCheck, ...options }) {
|
|
213
|
-
const state = stateFromInfo(options);
|
|
214
|
-
setLoaderMappings(options.context, options.info, state.mappings);
|
|
215
|
-
const query = selectionToQuery(options.config, state);
|
|
216
|
-
return withUsageCheck ? wrapWithUsageCheck(query) : query;
|
|
217
|
-
}
|
|
218
|
-
export function stateFromInfo({ config, context, info, typeName, select, path = [], paths = [] }) {
|
|
219
|
-
const returnType = getNamedType(info.returnType);
|
|
220
|
-
const type = typeName ? info.schema.getTypeMap()[typeName] : returnType;
|
|
221
|
-
const initialSelection = select ? {
|
|
1
|
+
import { isThenable } from '@pothos/core';
|
|
2
|
+
import { Plan } from '@pothos/selection-mapper';
|
|
3
|
+
import { drizzleAdapter } from './adapter.js';
|
|
4
|
+
export function queryFromInfo({ config, select, ...options }) {
|
|
5
|
+
const plan = Plan.fromInfo(drizzleAdapter(config), {
|
|
6
|
+
...options,
|
|
7
|
+
// A `select` without `columns` merges as "no columns yet", not "every column".
|
|
8
|
+
initial: select ? {
|
|
9
|
+
columns: {},
|
|
10
|
+
...select
|
|
11
|
+
} : undefined
|
|
12
|
+
});
|
|
13
|
+
if (!plan) {
|
|
14
|
+
// Nothing is planned under the paths: the caller gets its own selection back untouched.
|
|
15
|
+
return select !== null && select !== void 0 ? select : {};
|
|
16
|
+
}
|
|
17
|
+
return isThenable(plan) ? plan.then((settled)=>settled.query()) : plan.query();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The plan for the field `info` resolves (or `typeName`), nothing recorded: a promise while a
|
|
21
|
+
* select beneath the field is async, undefined when `paths` are given and nothing is selected
|
|
22
|
+
* under them. The model loader's, and the first step of a `drizzleField` resolve, whose
|
|
23
|
+
* merges are recorded so the resolver's `query()` selection can come first.
|
|
24
|
+
*/ export function planFromInfo({ config, ...options }) {
|
|
25
|
+
return Plan.fromInfo(drizzleAdapter(config), options);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The query for a plan `planFromInfo` returned, settled: the caller's `select` first, the walked
|
|
29
|
+
* plan after it, the mappings recorded, and the query serialized. This is how the `query()`
|
|
30
|
+
* builder handed to a `drizzleField` or `drizzleConnection` resolver stays synchronous once a
|
|
31
|
+
* selection beneath the field is async, with the precedence of `queryFromInfo`: a relation the
|
|
32
|
+
* document also plans with other arguments loads on its own.
|
|
33
|
+
*/ export function queryFromPlan(plan, select) {
|
|
34
|
+
if (!plan) {
|
|
35
|
+
// Nothing is selected under the paths: the caller gets its own selection back.
|
|
36
|
+
return select !== null && select !== void 0 ? select : {};
|
|
37
|
+
}
|
|
38
|
+
// A `select` without `columns` merges as "no columns yet", not "every column".
|
|
39
|
+
return plan.query(select ? {
|
|
222
40
|
columns: {},
|
|
223
41
|
...select
|
|
224
|
-
} : undefined;
|
|
225
|
-
let state;
|
|
226
|
-
if (path.length > 0 || paths.length > 0) {
|
|
227
|
-
var _returnType_extensions, _ref;
|
|
228
|
-
const { pothosIndirectInclude } = (_returnType_extensions = returnType.extensions) !== null && _returnType_extensions !== void 0 ? _returnType_extensions : {};
|
|
229
|
-
resolveIndirectInclude(returnType, info, info.fieldNodes[0], (_ref = pothosIndirectInclude === null || pothosIndirectInclude === void 0 ? void 0 : pothosIndirectInclude.path) !== null && _ref !== void 0 ? _ref : [], [], (indirectType, indirectField, subPath, deferred)=>{
|
|
230
|
-
resolveIndirectIncludePaths(indirectType, info, indirectField, [], paths.length > 0 ? paths.map((p)=>p.map((n)=>typeof n === 'string' ? {
|
|
231
|
-
name: n
|
|
232
|
-
} : n)) : [
|
|
233
|
-
path.map((n)=>typeof n === 'string' ? {
|
|
234
|
-
name: n
|
|
235
|
-
} : n)
|
|
236
|
-
], subPath, (resolvedType, resolvedField, nested, deferred)=>{
|
|
237
|
-
state = createStateForSelection(config, info, resolvedType, undefined, initialSelection);
|
|
238
|
-
addTypeSelectionsForField(config, typeName ? type : resolvedType, context, info, state, resolvedField, nested, deferred);
|
|
239
|
-
}, deferred);
|
|
240
|
-
});
|
|
241
|
-
} else {
|
|
242
|
-
var _ref1;
|
|
243
|
-
var _rootFieldNode_alias;
|
|
244
|
-
state = createStateForSelection(config, info, type, undefined, initialSelection);
|
|
245
|
-
// Create initial segment for the root query field
|
|
246
|
-
const rootFieldNode = info.fieldNodes[0];
|
|
247
|
-
const rootField = info.parentType.getFields()[rootFieldNode.name.value];
|
|
248
|
-
const initialSegments = rootField ? [
|
|
249
|
-
{
|
|
250
|
-
field: rootFieldNode.name.value,
|
|
251
|
-
alias: (_ref1 = (_rootFieldNode_alias = rootFieldNode.alias) === null || _rootFieldNode_alias === void 0 ? void 0 : _rootFieldNode_alias.value) !== null && _ref1 !== void 0 ? _ref1 : rootFieldNode.name.value,
|
|
252
|
-
parentType: info.parentType.name,
|
|
253
|
-
isList: isListType(rootField.type) || isListType(getNamedType(rootField.type))
|
|
254
|
-
}
|
|
255
|
-
] : [];
|
|
256
|
-
addTypeSelectionsForField(config, type, context, info, state, info.fieldNodes[0], [], undefined, initialSegments);
|
|
257
|
-
}
|
|
258
|
-
if (!state) {
|
|
259
|
-
state = createStateForSelection(config, info, type, undefined, initialSelection);
|
|
260
|
-
}
|
|
261
|
-
return state;
|
|
262
|
-
}
|
|
263
|
-
export function selectionStateFromInfo(config, context, info, typeName) {
|
|
264
|
-
const type = typeName ? info.schema.getTypeMap()[typeName] : info.parentType;
|
|
265
|
-
const state = createStateForSelection(config, info, type);
|
|
266
|
-
if (!(isObjectType(type) || isInterfaceType(type))) {
|
|
267
|
-
throw new PothosValidationError('Drizzle plugin can only resolve selections for object and interface types');
|
|
268
|
-
}
|
|
269
|
-
addFieldSelection(config, type, context, info, state, info.fieldNodes[0], []);
|
|
270
|
-
return state;
|
|
271
|
-
}
|
|
272
|
-
function createStateForSelection(config, info, type, parent, initialSelections) {
|
|
273
|
-
var _targetType_extensions, _ref;
|
|
274
|
-
const targetType = getIndirectType(type, info);
|
|
275
|
-
const { pothosDrizzleTable } = (_targetType_extensions = targetType.extensions) !== null && _targetType_extensions !== void 0 ? _targetType_extensions : {};
|
|
276
|
-
if (!pothosDrizzleTable) {
|
|
277
|
-
throw new PothosValidationError(`Expected ${targetType.name} to have a table config`);
|
|
278
|
-
}
|
|
279
|
-
const state = createState(pothosDrizzleTable, (_ref = parent === null || parent === void 0 ? void 0 : parent.skipDeferredFragments) !== null && _ref !== void 0 ? _ref : config.skipDeferredFragments, parent);
|
|
280
|
-
if (initialSelections) {
|
|
281
|
-
mergeSelection(config, state, initialSelections);
|
|
282
|
-
}
|
|
283
|
-
return state;
|
|
284
|
-
}
|
|
285
|
-
export function getIndirectType(type, info) {
|
|
286
|
-
var _targetType_extensions;
|
|
287
|
-
let targetType = type;
|
|
288
|
-
while((_targetType_extensions = targetType.extensions) === null || _targetType_extensions === void 0 ? void 0 : _targetType_extensions.pothosIndirectInclude){
|
|
289
|
-
targetType = info.schema.getType(targetType.extensions.pothosIndirectInclude.getType());
|
|
290
|
-
}
|
|
291
|
-
return targetType;
|
|
292
|
-
}
|
|
293
|
-
export function normalizeInclude(path, type, expectedType) {
|
|
294
|
-
let currentType = path.length > 0 ? type : expectedType !== null && expectedType !== void 0 ? expectedType : type;
|
|
295
|
-
const normalized = [];
|
|
296
|
-
if (!(isObjectType(currentType) || isInterfaceType(currentType))) {
|
|
297
|
-
throw new PothosValidationError(`Expected ${currentType} to be an Object type`);
|
|
298
|
-
}
|
|
299
|
-
for (const fieldName of path){
|
|
300
|
-
const field = currentType.getFields()[fieldName];
|
|
301
|
-
if (!field) {
|
|
302
|
-
throw new PothosValidationError(`Expected ${currentType} to have a field ${fieldName}`);
|
|
303
|
-
}
|
|
304
|
-
currentType = getNamedType(field.type);
|
|
305
|
-
if (!(isObjectType(currentType) || isInterfaceType(currentType))) {
|
|
306
|
-
throw new PothosValidationError(`Expected ${currentType} to be an Object or Interface type`);
|
|
307
|
-
}
|
|
308
|
-
normalized.push({
|
|
309
|
-
name: fieldName,
|
|
310
|
-
type: currentType.name
|
|
311
|
-
});
|
|
312
|
-
}
|
|
313
|
-
return {
|
|
314
|
-
getType: ()=>{
|
|
315
|
-
var _ref;
|
|
316
|
-
return (_ref = expectedType === null || expectedType === void 0 ? void 0 : expectedType.name) !== null && _ref !== void 0 ? _ref : normalized.length > 0 ? normalized[normalized.length - 1].type : type.name;
|
|
317
|
-
},
|
|
318
|
-
path: normalized
|
|
319
|
-
};
|
|
320
|
-
}
|
|
321
|
-
function fieldSkipped(info, selection) {
|
|
322
|
-
const skip = getDirectiveValues(GraphQLSkipDirective, selection, info.variableValues);
|
|
323
|
-
if ((skip === null || skip === void 0 ? void 0 : skip.if) === true) {
|
|
324
|
-
return true;
|
|
325
|
-
}
|
|
326
|
-
const include = getDirectiveValues(GraphQLIncludeDirective, selection, info.variableValues);
|
|
327
|
-
if ((include === null || include === void 0 ? void 0 : include.if) === false) {
|
|
328
|
-
return true;
|
|
329
|
-
}
|
|
330
|
-
return false;
|
|
331
|
-
}
|
|
332
|
-
function isDeferredFragment(node, info) {
|
|
333
|
-
const deferDirective = info.schema.getDirective('defer');
|
|
334
|
-
if (!deferDirective) {
|
|
335
|
-
return false;
|
|
336
|
-
}
|
|
337
|
-
const defer = getDirectiveValues(deferDirective, node, info.variableValues);
|
|
338
|
-
return !!defer && defer.if !== false;
|
|
42
|
+
} : undefined);
|
|
339
43
|
}
|
|
340
44
|
|
|
341
45
|
//# sourceMappingURL=map-query.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/map-query.ts"],"names":["getMappedArgumentValues","PothosValidationError","GraphQLIncludeDirective","GraphQLSkipDirective","getDirectiveValues","getNamedType","isInterfaceType","isListType","isObjectType","Kind","setLoaderMappings","createState","mergeSelection","selectionCompatible","selectionToQuery","wrapWithUsageCheck","addTypeSelectionsForField","config","type","context","info","state","selection","indirectPath","deferred","segments","name","value","startsWith","pothosDrizzleSelect","pothosIndirectInclude","extensions","path","length","paths","resolveIndirectIncludePaths","resolvedType","field","schema","getType","selectionSet","skipDeferredFragments","addNestedSelections","pathPrefix","includePaths","resolve","includePath","resolveIndirectInclude","include","rest","sel","selections","kind","FIELD","fieldSkipped","returnType","getFields","alias","FRAGMENT_SPREAD","fragments","typeCondition","isDeferredFragment","INLINE_FRAGMENT","parentType","addFieldSelection","pothosDrizzleModel","allSegments","isList","fieldSelect","fieldSelectionMap","mappings","pathInfo","map","s","args","rawQuery","indirectInclude","expectedType","query","normalizedIndirectInclude","Array","isArray","normalizeInclude","getIndirectType","undefined","fieldState","createStateForSelection","Object","keys","columns","resolvedField","node","_","mergeMappings","existing","incoming","result","key","entries","queryFromInfo","withUsageCheck","options","stateFromInfo","typeName","select","getTypeMap","initialSelection","fieldNodes","indirectType","indirectField","subPath","p","n","nested","rootFieldNode","rootField","initialSegments","selectionStateFromInfo","parent","initialSelections","targetType","pothosDrizzleTable","currentType","normalized","fieldName","push","skip","variableValues","if","deferDirective","getDirective","defer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/map-query.ts"],"names":["isThenable","Plan","drizzleAdapter","queryFromInfo","config","select","options","plan","fromInfo","initial","columns","undefined","then","settled","query","planFromInfo","queryFromPlan"],"mappings":"AAAA,SAASA,UAAU,QAAQ,eAAe;AAC1C,SAA2BC,IAAI,QAAQ,2BAA2B;AAElE,SAA2BC,cAAc,QAAQ,eAAe;AAchE,OAAO,SAASC,cAAsC,EACpDC,MAAM,EACNC,MAAM,EACN,GAAGC,SACqB;IACxB,MAAMC,OAAON,KAAKO,QAAQ,CAACN,eAAeE,SAAS;QACjD,GAAGE,OAAO;QACV,+EAA+E;QAC/EG,SAASJ,SAAS;YAAEK,SAAS,CAAC;YAAG,GAAGL,MAAM;QAAC,IAAIM;IACjD;IAEA,IAAI,CAACJ,MAAM;QACT,wFAAwF;QACxF,OAAQF,mBAAAA,oBAAAA,SAAU,CAAC;IACrB;IAEA,OACEL,WAAWO,QAAQA,KAAKK,IAAI,CAAC,CAACC,UAAY,AAACA,QAAwBC,KAAK,MAAMP,KAAKO,KAAK;AAE5F;AAEA;;;;;CAKC,GACD,OAAO,SAASC,aAAa,EAC3BX,MAAM,EACN,GAAGE,SACgD;IACnD,OAAOL,KAAKO,QAAQ,CAACN,eAAeE,SAASE;AAC/C;AAEA;;;;;;CAMC,GACD,OAAO,SAASU,cACdT,IAA6B,EAC7BF,MAAU;IAEV,IAAI,CAACE,MAAM;QACT,+EAA+E;QAC/E,OAAQF,mBAAAA,oBAAAA,SAAU,CAAC;IACrB;IAEA,+EAA+E;IAC/E,OAAOE,KAAKO,KAAK,CAACT,SAAS;QAAEK,SAAS,CAAC;QAAG,GAAGL,MAAM;IAAC,IAAIM;AAC1D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Position } from '@pothos/selection-mapper';
|
|
2
|
+
import type { PathInfo } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* The public `PathInfo` of a position: `path` as `Type.field` from the field the query was
|
|
5
|
+
* planned for down to the field being planned, and one segment per step with the alias the
|
|
6
|
+
* document used and whether the field is a list.
|
|
7
|
+
*
|
|
8
|
+
* The walker hands out positions, which are links rather than paths; this is the only place the
|
|
9
|
+
* chain is walked, and it is walked only when a `query` callback or a `select` function actually
|
|
10
|
+
* wants one. A field whose query is a plain object never builds either array.
|
|
11
|
+
*/
|
|
12
|
+
export declare function pathInfoFor(position: Position | undefined): PathInfo | undefined;
|
|
13
|
+
//# sourceMappingURL=path-info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-info.d.ts","sourceRoot":"","sources":["../../src/utils/path-info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE3D;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAqBhF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { isListType, isNonNullType } from 'graphql';
|
|
2
|
+
/**
|
|
3
|
+
* The public `PathInfo` of a position: `path` as `Type.field` from the field the query was
|
|
4
|
+
* planned for down to the field being planned, and one segment per step with the alias the
|
|
5
|
+
* document used and whether the field is a list.
|
|
6
|
+
*
|
|
7
|
+
* The walker hands out positions, which are links rather than paths; this is the only place the
|
|
8
|
+
* chain is walked, and it is walked only when a `query` callback or a `select` function actually
|
|
9
|
+
* wants one. A field whose query is a plain object never builds either array.
|
|
10
|
+
*/ export function pathInfoFor(position) {
|
|
11
|
+
if (!position) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
const path = [];
|
|
15
|
+
const segments = [];
|
|
16
|
+
for(let at = position; at; at = at.parent){
|
|
17
|
+
var _ref;
|
|
18
|
+
var _at_node_alias;
|
|
19
|
+
const field = at.node.name.value;
|
|
20
|
+
path.push(`${at.type.name}.${field}`);
|
|
21
|
+
segments.push({
|
|
22
|
+
field,
|
|
23
|
+
alias: (_ref = (_at_node_alias = at.node.alias) === null || _at_node_alias === void 0 ? void 0 : _at_node_alias.value) !== null && _ref !== void 0 ? _ref : field,
|
|
24
|
+
parentType: at.type.name,
|
|
25
|
+
isList: isListField(at.field.type)
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
path: path.reverse(),
|
|
30
|
+
segments: segments.reverse()
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** A list field, whether or not the list itself is non-null (`[Post!]!`). */ function isListField(type) {
|
|
34
|
+
return isListType(type) || isNonNullType(type) && isListType(type.ofType);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=path-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/path-info.ts"],"names":["isListType","isNonNullType","pathInfoFor","position","undefined","path","segments","at","parent","field","node","name","value","push","type","alias","parentType","isList","isListField","reverse","ofType"],"mappings":"AACA,SAAiCA,UAAU,EAAEC,aAAa,QAAQ,UAAU;AAG5E;;;;;;;;CAQC,GACD,OAAO,SAASC,YAAYC,QAA8B;IACxD,IAAI,CAACA,UAAU;QACb,OAAOC;IACT;IAEA,MAAMC,OAAiB,EAAE;IACzB,MAAMC,WAA4B,EAAE;IAEpC,IAAK,IAAIC,KAA2BJ,UAAUI,IAAIA,KAAKA,GAAGC,MAAM,CAAE;;YAMvDD;QALT,MAAME,QAAQF,GAAGG,IAAI,CAACC,IAAI,CAACC,KAAK;QAEhCP,KAAKQ,IAAI,CAAC,GAAGN,GAAGO,IAAI,CAACH,IAAI,CAAC,CAAC,EAAEF,OAAO;QACpCH,SAASO,IAAI,CAAC;YACZJ;YACAM,KAAK,WAAER,iBAAAA,GAAGG,IAAI,CAACK,KAAK,cAAbR,qCAAAA,eAAeK,KAAK,uCAAIH;YAC/BO,YAAYT,GAAGO,IAAI,CAACH,IAAI;YACxBM,QAAQC,YAAYX,GAAGE,KAAK,CAACK,IAAI;QACnC;IACF;IAEA,OAAO;QAAET,MAAMA,KAAKc,OAAO;QAAIb,UAAUA,SAASa,OAAO;IAAG;AAC9D;AAEA,2EAA2E,GAC3E,SAASD,YAAYJ,IAAuB;IAC1C,OAAOd,WAAWc,SAAUb,cAAca,SAASd,WAAWc,KAAKM,MAAM;AAC3E"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type Column, type Relation, type SQL, type Table } from 'drizzle-orm';
|
|
2
|
+
import type { DrizzleClient } from '../types.js';
|
|
3
|
+
/** The public client's SQL construction capability. */
|
|
4
|
+
export type RelationQueryBuilder = Pick<DrizzleClient, 'select'>;
|
|
5
|
+
export interface RelationFilter {
|
|
6
|
+
/**
|
|
7
|
+
* A predicate over the target table alone, for the places where only the target table is in
|
|
8
|
+
* scope: a `where` handed to a user `select`, or a count that selects from the target table.
|
|
9
|
+
* SQLite many-to-many relations with a non-null unique target key project identities through
|
|
10
|
+
* Drizzle's join. Other cases use an `exists` over the junction.
|
|
11
|
+
*/
|
|
12
|
+
filter: SQL;
|
|
13
|
+
/**
|
|
14
|
+
* Counts the rows the relation yields, as an expression for the surrounding query to select.
|
|
15
|
+
* A many-to-many relation joins the junction table in, so the count matches the rows the
|
|
16
|
+
* relational query builder returns for the same relation, junction duplicates included.
|
|
17
|
+
*
|
|
18
|
+
* `where` is the predicate the page query was given, and it goes ahead of the relation's own
|
|
19
|
+
* predicate because that is the order the relational query builder combines the two in. The
|
|
20
|
+
* count then repeats the page query's `where` verbatim, minus the limit and keyset clauses.
|
|
21
|
+
*/
|
|
22
|
+
countRows: (where?: SQL) => SQL<number>;
|
|
23
|
+
/**
|
|
24
|
+
* Counts the distinct target rows the relation reaches, for the callers that count a related
|
|
25
|
+
* row once however many junction rows lead to it. `key` identifies a target row, so it has to
|
|
26
|
+
* be a single column the database guarantees is unique and non-null.
|
|
27
|
+
*
|
|
28
|
+
* This counts off the junction rather than counting the target table filtered by `filter`,
|
|
29
|
+
* which says the same thing the long way round: the join reads the junction rows the parent
|
|
30
|
+
* reaches and stops, where the filter reads the same rows and then looks every key it found
|
|
31
|
+
* back up in the target table.
|
|
32
|
+
*/
|
|
33
|
+
countDistinctRows: (key: Column, where?: SQL) => SQL<number>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The parent-to-child SQL for one relation, built by drizzle so the plugin agrees with the
|
|
37
|
+
* relational query builder on what "related" means: `through` (many-to-many), the relation's own
|
|
38
|
+
* `where`, and a reversed relation's inherited `where` all come from drizzle rather than from a
|
|
39
|
+
* join reassembled here out of source and target columns.
|
|
40
|
+
*
|
|
41
|
+
* Both the join and its restrictions come from `relationToSQL`, including when the target is
|
|
42
|
+
* aliased for the identity lookup. No junction columns or comparisons are reconstructed here.
|
|
43
|
+
*
|
|
44
|
+
* `parentTable` is the parent as it appears in the surrounding query, so the aliased table when
|
|
45
|
+
* the query builder aliased it.
|
|
46
|
+
*/
|
|
47
|
+
export declare function buildRelationFilter(client: RelationQueryBuilder, relation: Relation, parentTable: Table, targetKey?: Column[]): RelationFilter;
|
|
48
|
+
//# sourceMappingURL=relation-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-filter.d.ts","sourceRoot":"","sources":["../../src/utils/relation-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,MAAM,EAOX,KAAK,QAAQ,EAEb,KAAK,GAAG,EAGR,KAAK,KAAK,EACX,MAAM,aAAa,CAAC;AAGrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,uDAAuD;AACvD,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,MAAM,EAAE,GAAG,CAAC;IACZ;;;;;;;;OAQG;IACH,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC;;;;;;;;;OASG;IACH,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;CAC9D;AAKD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,KAAK,EAClB,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,cAAc,CA+ChB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { aliasedTable, aliasedTableColumn, and, count, countDistinct, exists, getTableName, inArray, is, relationToSQL, sql } from 'drizzle-orm';
|
|
2
|
+
import { SQLiteTable } from 'drizzle-orm/sqlite-core';
|
|
3
|
+
// `select 1`, for an `exists` that only has to find a row.
|
|
4
|
+
const one = {
|
|
5
|
+
one: sql`1`
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* The parent-to-child SQL for one relation, built by drizzle so the plugin agrees with the
|
|
9
|
+
* relational query builder on what "related" means: `through` (many-to-many), the relation's own
|
|
10
|
+
* `where`, and a reversed relation's inherited `where` all come from drizzle rather than from a
|
|
11
|
+
* join reassembled here out of source and target columns.
|
|
12
|
+
*
|
|
13
|
+
* Both the join and its restrictions come from `relationToSQL`, including when the target is
|
|
14
|
+
* aliased for the identity lookup. No junction columns or comparisons are reconstructed here.
|
|
15
|
+
*
|
|
16
|
+
* `parentTable` is the parent as it appears in the surrounding query, so the aliased table when
|
|
17
|
+
* the query builder aliased it.
|
|
18
|
+
*/ export function buildRelationFilter(client, relation, parentTable, targetKey) {
|
|
19
|
+
const targetTable = relation.targetTable;
|
|
20
|
+
const throughTable = relation.throughTable;
|
|
21
|
+
// `filter` correlates the parent to the target, or to the junction table when there is one, in
|
|
22
|
+
// which case `joinCondition` is what carries the junction the rest of the way to the target.
|
|
23
|
+
const { filter, joinCondition } = relationToSQL(relation, parentTable, targetTable, throughTable);
|
|
24
|
+
if (!throughTable || !joinCondition) {
|
|
25
|
+
// Without a junction table every related row is a distinct target row, so the two counts are
|
|
26
|
+
// the same query.
|
|
27
|
+
const countRows = (where)=>countOf(client.select(countStar()).from(targetTable).where(and(where, filter)));
|
|
28
|
+
return {
|
|
29
|
+
filter,
|
|
30
|
+
countRows,
|
|
31
|
+
countDistinctRows: (_key, where)=>countRows(where)
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const relatedRows = (aggregate, where)=>countOf(client.select(aggregate).from(targetTable).innerJoin(throughTable, joinCondition).where(and(where, filter)));
|
|
35
|
+
return {
|
|
36
|
+
// SQLite needs the identity lookup to avoid target scans. PostgreSQL can plan EXISTS as
|
|
37
|
+
// a semijoin; projecting identities adds a target join its planner may not eliminate.
|
|
38
|
+
filter: (targetKey === null || targetKey === void 0 ? void 0 : targetKey.length) && is(targetTable, SQLiteTable) ? targetIdentityInRelation(client, relation, parentTable, targetTable, throughTable, targetKey) : exists(client.select(one).from(throughTable).where(and(filter, joinCondition))),
|
|
39
|
+
countRows: (where)=>relatedRows(countStar(), where),
|
|
40
|
+
countDistinctRows: (key, where)=>relatedRows({
|
|
41
|
+
count: countDistinct(key)
|
|
42
|
+
}, where)
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Project a non-null unique target key through the original relation join, then compare that
|
|
47
|
+
* key with itself. Comparing the target key directly with a junction column would change
|
|
48
|
+
* SQLite's collation precedence. Keeping the join also handles composite relation keys and
|
|
49
|
+
* excludes null junction keys without special truth-table guards.
|
|
50
|
+
*
|
|
51
|
+
* `key` must be a database-enforced unique constraint whose columns are all NOT NULL. That
|
|
52
|
+
* makes membership identify exactly one target row and keeps negation two-valued. SQLite can
|
|
53
|
+
* allow nulls even in primary keys, so callers must check notNull, not just primary.
|
|
54
|
+
*
|
|
55
|
+
* Build object restrictions and RAW callbacks against the inner target alias. Static RAW SQL
|
|
56
|
+
* is passed through by Drizzle: references to the outer target can still force a target scan.
|
|
57
|
+
* A RAW callback must use its supplied table to benefit from the identity lookup.
|
|
58
|
+
*/ function targetIdentityInRelation(client, relation, parentTable, targetTable, throughTable, key) {
|
|
59
|
+
const names = new Set([
|
|
60
|
+
parentTable,
|
|
61
|
+
targetTable,
|
|
62
|
+
throughTable
|
|
63
|
+
].map(getTableName));
|
|
64
|
+
let alias = '_pothos_related';
|
|
65
|
+
while(names.has(alias)){
|
|
66
|
+
alias += '_';
|
|
67
|
+
}
|
|
68
|
+
const matchedTable = aliasedTable(targetTable, alias);
|
|
69
|
+
const { filter, joinCondition } = relationToSQL(relation, parentTable, matchedTable, throughTable);
|
|
70
|
+
const fields = Object.fromEntries(key.map((column, i)=>[
|
|
71
|
+
String(i),
|
|
72
|
+
sql`${aliasedTableColumn(column, alias)}`
|
|
73
|
+
]));
|
|
74
|
+
const columns = key.map((column)=>sql`${column}`);
|
|
75
|
+
const identity = columns.length === 1 ? columns[0] : sql`(${sql.join(columns, sql`, `)})`;
|
|
76
|
+
return inArray(identity, client.select(fields).from(throughTable).innerJoin(matchedTable, joinCondition).where(filter));
|
|
77
|
+
}
|
|
78
|
+
// A fresh `count(*)` each time: `mapWith` mutates the `SQL` it is called on, so a shared one
|
|
79
|
+
// would be re-decoded by every query that selected it.
|
|
80
|
+
function countStar() {
|
|
81
|
+
return {
|
|
82
|
+
count: count()
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// The count as a value the surrounding query can select. `count()` carries drizzle's `Number`
|
|
86
|
+
// decoder, but a `select` built around it decodes as the row it returns, so the mapping is
|
|
87
|
+
// restored here and the count comes back as a number on every dialect.
|
|
88
|
+
function countOf(rows) {
|
|
89
|
+
return sql`${rows.getSQL()}`.mapWith(Number);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
//# sourceMappingURL=relation-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/relation-filter.ts"],"names":["aliasedTable","aliasedTableColumn","and","count","countDistinct","exists","getTableName","inArray","is","relationToSQL","sql","SQLiteTable","one","buildRelationFilter","client","relation","parentTable","targetKey","targetTable","throughTable","filter","joinCondition","countRows","where","countOf","select","countStar","from","countDistinctRows","_key","relatedRows","aggregate","innerJoin","length","targetIdentityInRelation","key","names","Set","map","alias","has","matchedTable","fields","Object","fromEntries","column","i","String","columns","identity","join","rows","getSQL","mapWith","Number"],"mappings":"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"}
|