@prisma/orm-family-sql 8.0.0-rc.17-dev.30 → 8.0.0-rc.17-dev.32
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/dist/{authoring-type-constructors-0Iv2zdwS-D-AoEcR1.mjs → authoring-type-constructors-0Iv2zdwS-DjC0oxBn.mjs} +2 -2
- package/dist/{authoring-type-constructors-0Iv2zdwS-D-AoEcR1.mjs.map → authoring-type-constructors-0Iv2zdwS-DjC0oxBn.mjs.map} +1 -1
- package/dist/{config-types-DabYoGbo.mjs → config-types-GKGrPAno.mjs} +2 -2
- package/dist/{config-types-DabYoGbo.mjs.map → config-types-GKGrPAno.mjs.map} +1 -1
- package/dist/{contract-builder-C5n9DeDD.mjs → contract-builder-uPgNqtxM.mjs} +3 -3
- package/dist/{contract-builder-C5n9DeDD.mjs.map → contract-builder-uPgNqtxM.mjs.map} +1 -1
- package/dist/contract-prisma7__provider.mjs +15 -4
- package/dist/contract-prisma7__provider.mjs.map +1 -1
- package/dist/contract-psl.mjs +1 -1
- package/dist/contract-psl__attribute-specs.mjs +1 -1
- package/dist/contract-psl__provider.mjs +2 -2
- package/dist/contract-psl__provider.mjs.map +1 -1
- package/dist/contract-ts.mjs +3 -3
- package/dist/contract-ts__config-types.mjs +1 -1
- package/dist/contract-ts__contract-builder.mjs +2 -2
- package/dist/contract.mjs +1 -1
- package/dist/contract__validators.mjs +1 -1
- package/dist/{control-BfdONYDV.mjs → control-DoMJbS3w.mjs} +5 -5
- package/dist/{control-BfdONYDV.mjs.map → control-DoMJbS3w.mjs.map} +1 -1
- package/dist/{derived-checks-DSMOrZN--C03ao8_m.mjs → derived-checks-DSMOrZN--D4sGB1Rt.mjs} +2 -2
- package/dist/{derived-checks-DSMOrZN--C03ao8_m.mjs.map → derived-checks-DSMOrZN--D4sGB1Rt.mjs.map} +1 -1
- package/dist/family.mjs +3 -3
- package/dist/family__control.mjs +2 -2
- package/dist/family__ir.mjs +1 -1
- package/dist/family__pack.mjs +2 -2
- package/dist/{interpreter-C5YVAt4b-jHakayS-.mjs → interpreter-0z4AxG0I-DO_n08hz.mjs} +26 -12
- package/dist/interpreter-0z4AxG0I-DO_n08hz.mjs.map +1 -0
- package/dist/orm-client.d.mts +56 -56
- package/dist/orm-client.d.mts.map +1 -1
- package/dist/orm-client.mjs +190 -177
- package/dist/orm-client.mjs.map +1 -1
- package/dist/{psl-field-resolution-D2bsZV-3-BDdrceuQ.mjs → psl-field-resolution-D4jnVVTd-Drt-tbfu.mjs} +8 -6
- package/dist/psl-field-resolution-D4jnVVTd-Drt-tbfu.mjs.map +1 -0
- package/dist/{sql-contract-serializer-DDaAVCQr-CK2KUyq0.mjs → sql-contract-serializer-DDaAVCQr-BAb4jKvV.mjs} +2 -2
- package/dist/{sql-contract-serializer-DDaAVCQr-CK2KUyq0.mjs.map → sql-contract-serializer-DDaAVCQr-BAb4jKvV.mjs.map} +1 -1
- package/dist/{validators-B9prRmOP.mjs → validators-BMWQ7-5D.mjs} +3 -3
- package/dist/validators-BMWQ7-5D.mjs.map +1 -0
- package/package.json +18 -18
- package/dist/interpreter-C5YVAt4b-jHakayS-.mjs.map +0 -1
- package/dist/psl-field-resolution-D2bsZV-3-BDdrceuQ.mjs.map +0 -1
- package/dist/validators-B9prRmOP.mjs.map +0 -1
package/dist/orm-client.mjs
CHANGED
|
@@ -102,8 +102,7 @@ function resolvePolymorphismInfo(contract, namespaceId, modelName) {
|
|
|
102
102
|
}
|
|
103
103
|
const cacheKey = metadataCacheKey(namespaceId, modelName);
|
|
104
104
|
if (perContract.has(cacheKey)) return perContract.get(cacheKey);
|
|
105
|
-
const
|
|
106
|
-
const model = models[modelName];
|
|
105
|
+
const model = modelsOf(contract, namespaceId)[modelName];
|
|
107
106
|
if (!model?.discriminator || !model.variants) {
|
|
108
107
|
perContract.set(cacheKey, void 0);
|
|
109
108
|
return;
|
|
@@ -116,21 +115,21 @@ function resolvePolymorphismInfo(contract, namespaceId, modelName) {
|
|
|
116
115
|
const discriminatorField = model.discriminator.field;
|
|
117
116
|
const discriminatorColumn = columnOfContractField(contract, namespaceId, modelName, discriminatorField);
|
|
118
117
|
const variants = /* @__PURE__ */ new Map();
|
|
119
|
-
const variantsByValue = /* @__PURE__ */ new Map();
|
|
120
118
|
const mtiVariants = [];
|
|
121
|
-
for (const [
|
|
122
|
-
const
|
|
119
|
+
for (const [value, variantRef] of Object.entries(model.variants)) {
|
|
120
|
+
const variantModelName = variantRef.model;
|
|
121
|
+
const variantModel = modelOf(contract, variantRef.namespace, variantModelName);
|
|
123
122
|
if (!variantModel) throw new InternalError(`Model "${modelName}" declares variant "${variantModelName}", but that model is missing from the contract`);
|
|
124
123
|
const variantTable = variantModel.storage?.table ?? baseTable;
|
|
125
|
-
const strategy = variantTable === baseTable ? "sti" : "mti";
|
|
124
|
+
const strategy = variantRef.namespace === namespaceId && variantTable === baseTable ? "sti" : "mti";
|
|
126
125
|
const info = {
|
|
127
126
|
modelName: variantModelName,
|
|
128
|
-
|
|
127
|
+
namespaceId: variantRef.namespace,
|
|
128
|
+
value,
|
|
129
129
|
table: variantTable,
|
|
130
130
|
strategy
|
|
131
131
|
};
|
|
132
|
-
variants.set(
|
|
133
|
-
variantsByValue.set(variantEntry.value, info);
|
|
132
|
+
variants.set(value, info);
|
|
134
133
|
if (strategy === "mti") mtiVariants.push(info);
|
|
135
134
|
}
|
|
136
135
|
const result = {
|
|
@@ -138,7 +137,6 @@ function resolvePolymorphismInfo(contract, namespaceId, modelName) {
|
|
|
138
137
|
discriminatorColumn,
|
|
139
138
|
baseTable,
|
|
140
139
|
variants,
|
|
141
|
-
variantsByValue,
|
|
142
140
|
mtiVariants
|
|
143
141
|
};
|
|
144
142
|
perContract.set(cacheKey, result);
|
|
@@ -169,6 +167,7 @@ function getModelFields(contract, namespaceId, modelName) {
|
|
|
169
167
|
const model = modelOf(contract, namespaceId, modelName);
|
|
170
168
|
const table = model?.storage?.table;
|
|
171
169
|
const own = table === void 0 ? {} : Object.fromEntries(Object.entries(getOwnFieldColumns(contract, namespaceId, modelName)).map(([field, column]) => [field, {
|
|
170
|
+
namespaceId,
|
|
172
171
|
table,
|
|
173
172
|
column
|
|
174
173
|
}]));
|
|
@@ -188,18 +187,18 @@ function getModelFieldColumns(contract, namespaceId, modelName) {
|
|
|
188
187
|
], () => Object.fromEntries(Object.entries(getModelFields(contract, namespaceId, modelName)).map(([field, { column }]) => [field, column])));
|
|
189
188
|
}
|
|
190
189
|
/**
|
|
191
|
-
* The column each field of the model and of the variant `
|
|
190
|
+
* The column each field of the model and of the variant `variantValue` maps, keyed by field name. Without a variant, the model's fields alone.
|
|
192
191
|
*
|
|
193
192
|
* A surface accepts a variant's field only when it can place that field's column on the variant's table. A collection narrowed to a variant reads that variant's table, so `select`, the `where` and `orderBy` accessor and a variant create accept the narrowed variant's fields. A collection that is not narrowed reads the base table only, so only `select`, whose polymorphic projection joins each variant's table, accepts variant fields there (`getModelAndEveryVariantFieldColumns`).
|
|
194
193
|
*/
|
|
195
|
-
function getModelAndVariantFieldColumns(contract, namespaceId, modelName,
|
|
194
|
+
function getModelAndVariantFieldColumns(contract, namespaceId, modelName, variantValue) {
|
|
196
195
|
return cachedFor(contract, [
|
|
197
196
|
"modelAndVariantFieldColumns",
|
|
198
197
|
namespaceId,
|
|
199
198
|
modelName,
|
|
200
|
-
|
|
199
|
+
variantValue ?? null
|
|
201
200
|
], () => ({
|
|
202
|
-
...
|
|
201
|
+
...variantValue === void 0 ? {} : getOwnFieldColumns(contract, ...addressedModel(contract, namespaceId, modelName, variantValue)),
|
|
203
202
|
...getModelFieldColumns(contract, namespaceId, modelName)
|
|
204
203
|
}));
|
|
205
204
|
}
|
|
@@ -222,7 +221,7 @@ function getModelAndEveryVariantFieldColumns(contract, namespaceId, modelName) {
|
|
|
222
221
|
};
|
|
223
222
|
add(getModelFieldColumns(contract, namespaceId, modelName));
|
|
224
223
|
const modelFields = new Set(Object.keys(columns));
|
|
225
|
-
for (const variant of resolvePolymorphismInfo(contract, namespaceId, modelName)?.variants.
|
|
224
|
+
for (const variant of resolvePolymorphismInfo(contract, namespaceId, modelName)?.variants.values() ?? []) add(Object.fromEntries(Object.entries(getOwnFieldColumns(contract, variant.namespaceId, variant.modelName)).filter(([field]) => !modelFields.has(field))));
|
|
226
225
|
return columns;
|
|
227
226
|
});
|
|
228
227
|
}
|
|
@@ -277,22 +276,28 @@ function getUnmappedColumns(contract, namespaceId, modelName) {
|
|
|
277
276
|
namespaceId,
|
|
278
277
|
modelName
|
|
279
278
|
], () => {
|
|
280
|
-
const root =
|
|
281
|
-
const rootTable = domainModelTableInNamespace(contract, namespaceId, root);
|
|
279
|
+
const root = hierarchyRoot(contract, namespaceId, modelName);
|
|
280
|
+
const rootTable = domainModelTableInNamespace(contract, root.namespaceId, root.modelName);
|
|
282
281
|
if (rootTable === void 0) return [];
|
|
283
|
-
const
|
|
284
|
-
return [
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
282
|
+
const polymorphism = resolvePolymorphismInfo(contract, root.namespaceId, root.modelName);
|
|
283
|
+
return [{
|
|
284
|
+
...root,
|
|
285
|
+
table: rootTable
|
|
286
|
+
}, ...polymorphism?.mtiVariants ?? []].flatMap((model) => {
|
|
287
|
+
const read = new Set(getColumnsReadOnTable(contract, model.namespaceId, model.modelName, model.table));
|
|
288
|
+
return getAllTableColumns(contract, model.namespaceId, model.table).filter((column) => !read.has(column)).map((column) => ({
|
|
289
|
+
table: model.table,
|
|
288
290
|
column
|
|
289
291
|
}));
|
|
290
292
|
});
|
|
291
293
|
});
|
|
292
294
|
}
|
|
293
|
-
function
|
|
295
|
+
function hierarchyRoot(contract, namespaceId, modelName) {
|
|
294
296
|
const base = modelOf(contract, namespaceId, modelName)?.base;
|
|
295
|
-
return base === void 0
|
|
297
|
+
return base === void 0 ? {
|
|
298
|
+
namespaceId,
|
|
299
|
+
modelName
|
|
300
|
+
} : hierarchyRoot(contract, base.namespace, base.model);
|
|
296
301
|
}
|
|
297
302
|
/**
|
|
298
303
|
* The column a field name the contract itself gives maps among the model's own and inherited fields, such as a relation's join field or a discriminator. The contract was validated, so a name that is not a field is an internal error.
|
|
@@ -321,10 +326,10 @@ function resolveRelationTargetColumns(contract, relation) {
|
|
|
321
326
|
/**
|
|
322
327
|
* The fields a multi-table variant declares, with the table and column each maps, which is the variant's own table the read path joins. A single-table variant's columns are on the base table, and inherited fields are on the base model's table, so neither appears here.
|
|
323
328
|
*/
|
|
324
|
-
function resolveVariantFieldColumns(contract, namespaceId, baseModelName,
|
|
325
|
-
const variant = resolvePolymorphismInfo(contract, namespaceId, baseModelName)?.variants.get(
|
|
329
|
+
function resolveVariantFieldColumns(contract, namespaceId, baseModelName, variantValue) {
|
|
330
|
+
const variant = resolvePolymorphismInfo(contract, namespaceId, baseModelName)?.variants.get(variantValue);
|
|
326
331
|
if (variant?.strategy !== "mti") return {};
|
|
327
|
-
return Object.fromEntries(Object.entries(getModelFields(contract, namespaceId, variant.modelName)).filter(([, field]) => field.table === variant.table));
|
|
332
|
+
return Object.fromEntries(Object.entries(getModelFields(contract, variant.namespaceId, variant.modelName)).filter(([, field]) => field.namespaceId === variant.namespaceId && field.table === variant.table));
|
|
328
333
|
}
|
|
329
334
|
/** Every column of a table, in table order. */
|
|
330
335
|
function getAllTableColumns(contract, namespaceId, tableName) {
|
|
@@ -338,55 +343,59 @@ function getAllTableColumns(contract, namespaceId, tableName) {
|
|
|
338
343
|
} });
|
|
339
344
|
}
|
|
340
345
|
}
|
|
341
|
-
function isMultiTableVariantTable(contract, namespaceId, modelName, tableName) {
|
|
346
|
+
function isMultiTableVariantTable(contract, namespaceId, modelName, tableNamespaceId, tableName) {
|
|
342
347
|
const base = modelOf(contract, namespaceId, modelName)?.base;
|
|
343
|
-
return base !== void 0 && domainModelTableInNamespace(contract, namespaceId, modelName) === tableName && domainModelTableInNamespace(contract, base.namespace, base.model) !== tableName;
|
|
348
|
+
return base !== void 0 && namespaceId === tableNamespaceId && domainModelTableInNamespace(contract, namespaceId, modelName) === tableName && (base.namespace !== tableNamespaceId || domainModelTableInNamespace(contract, base.namespace, base.model) !== tableName);
|
|
344
349
|
}
|
|
345
350
|
/**
|
|
346
351
|
* The columns of `tableName` a query on `modelName` reads, in table order: the columns on that table of the model's own and inherited fields and of its variants' fields, and, on a multi-table variant's table, the key the variant inherits. Any other column of the table is storage the model does not map, and the ORM never reads it into a row.
|
|
347
352
|
*/
|
|
348
|
-
function getColumnsReadOnTable(contract, namespaceId, modelName, tableName) {
|
|
353
|
+
function getColumnsReadOnTable(contract, namespaceId, modelName, tableName, tableNamespaceId = namespaceId) {
|
|
349
354
|
return cachedFor(contract, [
|
|
350
355
|
"columnsReadOnTable",
|
|
351
356
|
namespaceId,
|
|
352
357
|
modelName,
|
|
358
|
+
tableNamespaceId,
|
|
353
359
|
tableName
|
|
354
360
|
], () => {
|
|
355
361
|
const read = /* @__PURE__ */ new Set();
|
|
356
|
-
const addFieldsOnTable = (name) => {
|
|
357
|
-
for (const field of Object.values(getModelFields(contract,
|
|
362
|
+
const addFieldsOnTable = (modelNamespaceId, name) => {
|
|
363
|
+
for (const field of Object.values(getModelFields(contract, modelNamespaceId, name))) if (field.namespaceId === tableNamespaceId && field.table === tableName) read.add(field.column);
|
|
358
364
|
};
|
|
359
365
|
const addInheritedKey = () => {
|
|
360
|
-
for (const column of resolvePrimaryKeyColumns(contract,
|
|
366
|
+
for (const column of resolvePrimaryKeyColumns(contract, tableNamespaceId, tableName)) read.add(column);
|
|
361
367
|
};
|
|
362
|
-
addFieldsOnTable(modelName);
|
|
363
|
-
if (isMultiTableVariantTable(contract, namespaceId, modelName, tableName)) addInheritedKey();
|
|
368
|
+
addFieldsOnTable(namespaceId, modelName);
|
|
369
|
+
if (isMultiTableVariantTable(contract, namespaceId, modelName, tableNamespaceId, tableName)) addInheritedKey();
|
|
364
370
|
const variants = resolvePolymorphismInfo(contract, namespaceId, modelName)?.variants.values();
|
|
365
371
|
for (const variant of variants ?? []) {
|
|
366
|
-
if (variant.table !== tableName) continue;
|
|
367
|
-
addFieldsOnTable(variant.modelName);
|
|
372
|
+
if (variant.namespaceId !== tableNamespaceId || variant.table !== tableName) continue;
|
|
373
|
+
addFieldsOnTable(variant.namespaceId, variant.modelName);
|
|
368
374
|
if (variant.strategy === "mti") addInheritedKey();
|
|
369
375
|
}
|
|
370
|
-
return getAllTableColumns(contract,
|
|
376
|
+
return getAllTableColumns(contract, tableNamespaceId, tableName).filter((column) => read.has(column));
|
|
371
377
|
});
|
|
372
378
|
}
|
|
373
|
-
/** The model a query or write addresses: the variant it is narrowed to, otherwise the collection's model. */
|
|
374
|
-
function
|
|
375
|
-
|
|
379
|
+
/** The namespace and name of the model a query or write addresses: the variant it is narrowed to, otherwise the collection's model. */
|
|
380
|
+
function addressedModel(contract, namespaceId, modelName, variantValue) {
|
|
381
|
+
const variant = variantValue === void 0 ? void 0 : resolvePolymorphismInfo(contract, namespaceId, modelName)?.variants.get(variantValue);
|
|
382
|
+
return variant === void 0 ? [namespaceId, modelName] : [variant.namespaceId, variant.modelName];
|
|
376
383
|
}
|
|
377
|
-
function resolveIncludeRelation(contract, namespaceId, baseModelName, relationName,
|
|
384
|
+
function resolveIncludeRelation(contract, namespaceId, baseModelName, relationName, variantValue) {
|
|
378
385
|
const polymorphism = resolvePolymorphismInfo(contract, namespaceId, baseModelName);
|
|
379
|
-
const variant =
|
|
386
|
+
const variant = variantValue === void 0 ? void 0 : polymorphism?.variants.get(variantValue);
|
|
387
|
+
let declaringNamespaceId = namespaceId;
|
|
380
388
|
let declaringModelName = baseModelName;
|
|
381
|
-
let
|
|
389
|
+
let localVariantValue;
|
|
382
390
|
let relation;
|
|
383
391
|
if (variant !== void 0) {
|
|
384
|
-
const variantRelations = resolveModelRelations(contract, namespaceId, variant.modelName);
|
|
392
|
+
const variantRelations = resolveModelRelations(contract, variant.namespaceId, variant.modelName);
|
|
385
393
|
const candidate = Object.hasOwn(variantRelations, relationName) ? variantRelations[relationName] : void 0;
|
|
386
394
|
if (candidate !== void 0) {
|
|
387
395
|
relation = candidate;
|
|
396
|
+
declaringNamespaceId = variant.namespaceId;
|
|
388
397
|
declaringModelName = variant.modelName;
|
|
389
|
-
|
|
398
|
+
localVariantValue = variant.strategy === "mti" ? variant.value : void 0;
|
|
390
399
|
}
|
|
391
400
|
}
|
|
392
401
|
const baseRelations = resolveModelRelations(contract, namespaceId, baseModelName);
|
|
@@ -397,7 +406,7 @@ function resolveIncludeRelation(contract, namespaceId, baseModelName, relationNa
|
|
|
397
406
|
} });
|
|
398
407
|
const { localFields, targetFields } = relation.on;
|
|
399
408
|
if (localFields.length === 0 || localFields.length !== targetFields.length) throw new InternalError(`Relation '${relationName}' on model '${declaringModelName}' has incomplete join metadata: ${localFields.length} local field(s), ${targetFields.length} target field(s)`);
|
|
400
|
-
const localColumns = localFields.map((field) => columnOfContractField(contract,
|
|
409
|
+
const localColumns = localFields.map((field) => columnOfContractField(contract, declaringNamespaceId, declaringModelName, field));
|
|
401
410
|
const targetColumns = resolveRelationTargetColumns(contract, relation);
|
|
402
411
|
const relatedTableName = resolveModelTableName(contract, relation.toNamespace, relation.to);
|
|
403
412
|
let through;
|
|
@@ -413,7 +422,7 @@ function resolveIncludeRelation(contract, namespaceId, baseModelName, relationNa
|
|
|
413
422
|
relatedModelName: relation.to,
|
|
414
423
|
relatedNamespaceId: relation.toNamespace,
|
|
415
424
|
relatedTableName,
|
|
416
|
-
...ifDefined("
|
|
425
|
+
...ifDefined("localVariantValue", localVariantValue),
|
|
417
426
|
targetColumns,
|
|
418
427
|
localColumns,
|
|
419
428
|
cardinality: relation.cardinality,
|
|
@@ -519,7 +528,8 @@ function hasCompleteUniqueKey(contract, namespaceId, modelName, criterion) {
|
|
|
519
528
|
for (const [fieldName, value] of Object.entries(criterion)) {
|
|
520
529
|
if (value === void 0) continue;
|
|
521
530
|
const column = columnOfCallerField(contract, namespaceId, fieldColumns, modelName, fieldName);
|
|
522
|
-
|
|
531
|
+
const field = fields[fieldName];
|
|
532
|
+
if (value !== null && !isExpression(value) && field?.namespaceId === namespaceId && field.table === tableName) columnsWithValue.add(column);
|
|
523
533
|
}
|
|
524
534
|
return resolveUniqueKeyColumnSets(contract, namespaceId, tableName).some((columns) => columns.every((column) => columnsWithValue.has(column)));
|
|
525
535
|
}
|
|
@@ -673,11 +683,11 @@ function mapFieldsToColumns(contract, namespaceId, modelName, fieldNames) {
|
|
|
673
683
|
return fieldNames.map((fieldName) => columnOfCallerField(contract, namespaceId, fieldColumns, modelName, fieldName));
|
|
674
684
|
}
|
|
675
685
|
/** The columns a `select` names: the narrowed variant's fields too, or, when the collection is not narrowed, every variant's fields, each name reading every column a variant maps it to. See `getModelAndVariantFieldColumns` for why `select` accepts more than other surfaces. */
|
|
676
|
-
function mapSelectedFieldsToColumns(contract, namespaceId, modelName,
|
|
677
|
-
const addressed =
|
|
678
|
-
if (
|
|
679
|
-
const fieldColumns = getModelAndVariantFieldColumns(contract, namespaceId, modelName,
|
|
680
|
-
return fieldNames.map((fieldName) => columnOfCallerField(contract,
|
|
686
|
+
function mapSelectedFieldsToColumns(contract, namespaceId, modelName, variantValue, fieldNames) {
|
|
687
|
+
const [addressedNamespaceId, addressed] = addressedModel(contract, namespaceId, modelName, variantValue);
|
|
688
|
+
if (variantValue !== void 0) {
|
|
689
|
+
const fieldColumns = getModelAndVariantFieldColumns(contract, namespaceId, modelName, variantValue);
|
|
690
|
+
return fieldNames.map((fieldName) => columnOfCallerField(contract, addressedNamespaceId, fieldColumns, addressed, fieldName));
|
|
681
691
|
}
|
|
682
692
|
const fieldColumns = getModelAndEveryVariantFieldColumns(contract, namespaceId, modelName);
|
|
683
693
|
return fieldNames.flatMap((fieldName) => {
|
|
@@ -746,8 +756,8 @@ function createModelTables(contract, scope, namespaceId, modelName, tableName) {
|
|
|
746
756
|
});
|
|
747
757
|
const variants = /* @__PURE__ */ new Map();
|
|
748
758
|
const mtiVariants = resolvePolymorphismInfo(contract, namespaceId, modelName)?.mtiVariants ?? [];
|
|
749
|
-
for (const variant of mtiVariants) variants.set(variant.
|
|
750
|
-
namespaceId,
|
|
759
|
+
for (const variant of mtiVariants) variants.set(variant.value, scope.aliasTable({
|
|
760
|
+
namespaceId: variant.namespaceId,
|
|
751
761
|
tableName: variant.table
|
|
752
762
|
}));
|
|
753
763
|
return {
|
|
@@ -783,9 +793,9 @@ function withScopeCopy(tables) {
|
|
|
783
793
|
scope: tables.scope.copy()
|
|
784
794
|
};
|
|
785
795
|
}
|
|
786
|
-
function requireVariantTable(tables,
|
|
787
|
-
const variantTable = tables.variants.get(
|
|
788
|
-
if (variantTable === void 0) throw new InternalError(`Collection state has no aliased table for variant "${
|
|
796
|
+
function requireVariantTable(tables, variantValue) {
|
|
797
|
+
const variantTable = tables.variants.get(variantValue);
|
|
798
|
+
if (variantTable === void 0) throw new InternalError(`Collection state has no aliased table for variant "${variantValue}"`);
|
|
789
799
|
return variantTable;
|
|
790
800
|
}
|
|
791
801
|
function tableAliases(tables) {
|
|
@@ -813,8 +823,8 @@ function createStorageRowMapper(contract, namespaceId, modelName) {
|
|
|
813
823
|
return (row) => mapKnownColumnNames(row, columnToField);
|
|
814
824
|
}
|
|
815
825
|
const mergedColumnToFieldCache = /* @__PURE__ */ new WeakMap();
|
|
816
|
-
function getMergedColumnToFieldMap(contract, namespaceId, baseModelName,
|
|
817
|
-
const cacheKey = `${namespaceId}:${baseModelName}:${
|
|
826
|
+
function getMergedColumnToFieldMap(contract, namespaceId, baseModelName, variant, variantTable) {
|
|
827
|
+
const cacheKey = `${namespaceId}:${baseModelName}:${variant.value}:${variantTable?.alias ?? ""}`;
|
|
818
828
|
let perContract = mergedColumnToFieldCache.get(contract);
|
|
819
829
|
if (!perContract) {
|
|
820
830
|
perContract = /* @__PURE__ */ new Map();
|
|
@@ -823,7 +833,7 @@ function getMergedColumnToFieldMap(contract, namespaceId, baseModelName, variant
|
|
|
823
833
|
const cached = perContract.get(cacheKey);
|
|
824
834
|
if (cached) return cached;
|
|
825
835
|
const baseMap = getModelColumnFields(contract, namespaceId, baseModelName);
|
|
826
|
-
const variantMap = getOwnColumnFields(contract, namespaceId,
|
|
836
|
+
const variantMap = getOwnColumnFields(contract, variant.namespaceId, variant.modelName);
|
|
827
837
|
const merged = { ...baseMap };
|
|
828
838
|
for (const [col, field] of Object.entries(variantMap)) if (variantTable) merged[variantColumnLabel(variantTable, col)] = field;
|
|
829
839
|
else merged[col] = field;
|
|
@@ -831,28 +841,29 @@ function getMergedColumnToFieldMap(contract, namespaceId, baseModelName, variant
|
|
|
831
841
|
return merged;
|
|
832
842
|
}
|
|
833
843
|
function variantTableOf(tables, variant) {
|
|
834
|
-
return variant.strategy === "mti" ? requireVariantTable(tables, variant.
|
|
844
|
+
return variant.strategy === "mti" ? requireVariantTable(tables, variant.value) : void 0;
|
|
835
845
|
}
|
|
836
|
-
function mapPolymorphicRow(contract, namespaceId, baseModelName, polyInfo, tables, row,
|
|
846
|
+
function mapPolymorphicRow(contract, namespaceId, baseModelName, polyInfo, tables, row, variantValue) {
|
|
837
847
|
const discriminatorValue = row[polyInfo.discriminatorColumn] ?? row["__prisma_polymorphic_discriminator"];
|
|
838
|
-
const
|
|
848
|
+
const selectedValue = variantValue ?? discriminatorValue;
|
|
849
|
+
const variant = typeof selectedValue === "string" ? polyInfo.variants.get(selectedValue) : void 0;
|
|
839
850
|
if (!variant) return mapKnownColumnNames(row, getModelColumnFields(contract, namespaceId, baseModelName));
|
|
840
|
-
return mapKnownColumnNames(row, getMergedColumnToFieldMap(contract, namespaceId, baseModelName, variant
|
|
851
|
+
return mapKnownColumnNames(row, getMergedColumnToFieldMap(contract, namespaceId, baseModelName, variant, variantTableOf(tables, variant)));
|
|
841
852
|
}
|
|
842
|
-
function createPolymorphicRowMapper(contract, namespaceId, baseModelName, polyInfo, tables,
|
|
853
|
+
function createPolymorphicRowMapper(contract, namespaceId, baseModelName, polyInfo, tables, variantValue) {
|
|
843
854
|
const baseMapper = captureColumnMapper(() => getModelColumnFields(contract, namespaceId, baseModelName));
|
|
844
855
|
const mappersByValue = /* @__PURE__ */ new Map();
|
|
845
856
|
let pinnedMapper = baseMapper;
|
|
846
|
-
for (const [
|
|
847
|
-
if (
|
|
848
|
-
const mapper = captureColumnMapper(() => getMergedColumnToFieldMap(contract, namespaceId, baseModelName, variant
|
|
849
|
-
if (
|
|
850
|
-
|
|
857
|
+
for (const [value, variant] of polyInfo.variants) {
|
|
858
|
+
if (variantValue && value !== variantValue) continue;
|
|
859
|
+
const mapper = captureColumnMapper(() => getMergedColumnToFieldMap(contract, namespaceId, baseModelName, variant, variantTableOf(tables, variant)));
|
|
860
|
+
if (variantValue) pinnedMapper = mapper;
|
|
861
|
+
mappersByValue.set(value, mapper);
|
|
851
862
|
}
|
|
852
863
|
const discriminatorColumn = polyInfo.discriminatorColumn;
|
|
853
864
|
return (row) => {
|
|
854
865
|
const value = row[discriminatorColumn] ?? row["__prisma_polymorphic_discriminator"];
|
|
855
|
-
return (
|
|
866
|
+
return (variantValue ? pinnedMapper : typeof value === "string" ? mappersByValue.get(value) ?? baseMapper : baseMapper)(row);
|
|
856
867
|
};
|
|
857
868
|
}
|
|
858
869
|
function captureColumnMapper(resolve) {
|
|
@@ -1241,10 +1252,10 @@ function buildPrimaryKeyJoinOn(left, right, primaryKeyColumns) {
|
|
|
1241
1252
|
if (primaryKeyColumns.length === 1 && firstColumn !== void 0) return EqColJoinOn.of(left.column(firstColumn), right.column(firstColumn));
|
|
1242
1253
|
return AndExpr.of(primaryKeyColumns.map((column) => BinaryExpr.eq(left.column(column), right.column(column))));
|
|
1243
1254
|
}
|
|
1244
|
-
function buildMtiJoins(contract, tables, polyInfo,
|
|
1255
|
+
function buildMtiJoins(contract, tables, polyInfo, variantValue, selectedColumnsByVariant) {
|
|
1245
1256
|
const joins = [];
|
|
1246
1257
|
const projection = [];
|
|
1247
|
-
const variantsToJoin =
|
|
1258
|
+
const variantsToJoin = variantValue ? polyInfo.mtiVariants.filter((v) => v.value === variantValue) : polyInfo.mtiVariants;
|
|
1248
1259
|
if (variantsToJoin.length === 0) return {
|
|
1249
1260
|
joins,
|
|
1250
1261
|
projection
|
|
@@ -1252,12 +1263,12 @@ function buildMtiJoins(contract, tables, polyInfo, variantName, selectedColumnsB
|
|
|
1252
1263
|
const { root } = tables;
|
|
1253
1264
|
const pkColumns = resolvePrimaryKeyColumns(contract, root.storage.namespaceId, root.storage.tableName);
|
|
1254
1265
|
for (const variant of variantsToJoin) {
|
|
1255
|
-
const variantTable = requireVariantTable(tables, variant.
|
|
1266
|
+
const variantTable = requireVariantTable(tables, variant.value);
|
|
1256
1267
|
const joinOn = buildPrimaryKeyJoinOn(root, variantTable, pkColumns);
|
|
1257
|
-
joins.push(
|
|
1268
|
+
joins.push(variantValue ? JoinAst.inner(variantTable.tableSource(contract), joinOn) : JoinAst.left(variantTable.tableSource(contract), joinOn));
|
|
1258
1269
|
const { namespaceId, tableName } = variantTable.storage;
|
|
1259
1270
|
const variantColumns = getColumnsReadOnTable(contract, namespaceId, variant.modelName, tableName);
|
|
1260
|
-
const selectedVariantColumns = selectedColumnsByVariant?.get(variant.
|
|
1271
|
+
const selectedVariantColumns = selectedColumnsByVariant?.get(variant.value);
|
|
1261
1272
|
for (const col of variantColumns) {
|
|
1262
1273
|
if (pkColumns.includes(col)) continue;
|
|
1263
1274
|
if (selectedColumnsByVariant !== void 0 && selectedVariantColumns?.has(col) !== true) continue;
|
|
@@ -1280,7 +1291,7 @@ function hasEntries(value) {
|
|
|
1280
1291
|
function buildAggregateInput(contract, state, modelName, projection) {
|
|
1281
1292
|
const { root } = state.tables;
|
|
1282
1293
|
const polyInfo = modelName ? resolvePolymorphismInfo(contract, root.storage.namespaceId, modelName) : void 0;
|
|
1283
|
-
const variantJoins = polyInfo && polyInfo.mtiVariants.length > 0 ? buildMtiJoins(contract, state.tables, polyInfo, state.
|
|
1294
|
+
const variantJoins = polyInfo && polyInfo.mtiVariants.length > 0 ? buildMtiJoins(contract, state.tables, polyInfo, state.variantValue, void 0).joins : [];
|
|
1284
1295
|
const where = buildStateWhere(contract, state);
|
|
1285
1296
|
const hiddenOrders = hasEntries(state.distinct) ? projectExpressionOrders(root, state.orderBy) : void 0;
|
|
1286
1297
|
const { source, where: effectiveWhere } = buildDedupedTableSource(contract, state, where, [...projection, ...hiddenOrders?.projection ?? []], variantJoins);
|
|
@@ -1330,7 +1341,7 @@ function emptyState(tables) {
|
|
|
1330
1341
|
selectedFields: void 0,
|
|
1331
1342
|
limit: void 0,
|
|
1332
1343
|
offset: void 0,
|
|
1333
|
-
|
|
1344
|
+
variantValue: void 0,
|
|
1334
1345
|
locking: void 0,
|
|
1335
1346
|
annotations: /* @__PURE__ */ new Map()
|
|
1336
1347
|
};
|
|
@@ -1537,7 +1548,7 @@ function compileAggregate(contract, aggregates, state, aggregateSpec, modelName)
|
|
|
1537
1548
|
return buildOrmQueryPlan(contract, ast, params);
|
|
1538
1549
|
}
|
|
1539
1550
|
const polyInfo = modelName ? resolvePolymorphismInfo(contract, namespaceId, modelName) : void 0;
|
|
1540
|
-
const variantJoins = polyInfo && polyInfo.mtiVariants.length > 0 ? buildMtiJoins(contract, state.tables, polyInfo, state.
|
|
1551
|
+
const variantJoins = polyInfo && polyInfo.mtiVariants.length > 0 ? buildMtiJoins(contract, state.tables, polyInfo, state.variantValue, void 0).joins : [];
|
|
1541
1552
|
const where = buildStateWhere(contract, state);
|
|
1542
1553
|
const projection = entries.map(([alias, selector]) => {
|
|
1543
1554
|
const { expr, codec } = toAggregateProjection(contract, aggregates, root, selector);
|
|
@@ -1579,8 +1590,8 @@ function compileGroupedAggregate(contract, aggregates, preGroupState, groupByCol
|
|
|
1579
1590
|
ast = SelectAst.from(source).withProjection(projection).withGroupBy(groupByColumns.map((column) => root.column(column)));
|
|
1580
1591
|
} else {
|
|
1581
1592
|
const polyInfo = modelName ? resolvePolymorphismInfo(contract, namespaceId, modelName) : void 0;
|
|
1582
|
-
const { tables,
|
|
1583
|
-
const variantJoins = polyInfo && polyInfo.mtiVariants.length > 0 ? buildMtiJoins(contract, tables, polyInfo,
|
|
1593
|
+
const { tables, variantValue } = preGroupState;
|
|
1594
|
+
const variantJoins = polyInfo && polyInfo.mtiVariants.length > 0 ? buildMtiJoins(contract, tables, polyInfo, variantValue, void 0).joins : [];
|
|
1584
1595
|
ast = SelectAst.from(root.tableSource(contract)).withProjection(projection).withGroupBy(groupByColumns.map((column) => root.column(column)));
|
|
1585
1596
|
if (variantJoins.length > 0) ast = ast.withJoins(variantJoins);
|
|
1586
1597
|
const where = buildStateWhere(contract, preGroupState);
|
|
@@ -1676,8 +1687,8 @@ function stripUndefinedValues(row) {
|
|
|
1676
1687
|
for (const [key, value] of Object.entries(row)) if (value !== void 0) result[key] = value;
|
|
1677
1688
|
return result;
|
|
1678
1689
|
}
|
|
1679
|
-
function buildCountMutationWhere(contract, tables, filters,
|
|
1680
|
-
const variantTable =
|
|
1690
|
+
function buildCountMutationWhere(contract, tables, filters, variantValue) {
|
|
1691
|
+
const variantTable = variantValue === void 0 ? void 0 : tables.variants.get(variantValue);
|
|
1681
1692
|
if (variantTable === void 0) return combineWhereExprs(filters);
|
|
1682
1693
|
const { root } = tables;
|
|
1683
1694
|
const pkColumns = resolvePrimaryKeyColumns(contract, root.storage.namespaceId, root.storage.tableName);
|
|
@@ -1739,10 +1750,10 @@ function compileUpdateReturning(contract, modelName, tables, setValues, filters,
|
|
|
1739
1750
|
const { params } = deriveParamsFromAst(ast);
|
|
1740
1751
|
return buildOrmQueryPlan(contract, ast, params);
|
|
1741
1752
|
}
|
|
1742
|
-
function compileUpdateCount(contract, tables, setValues, filters,
|
|
1753
|
+
function compileUpdateCount(contract, tables, setValues, filters, variantValue) {
|
|
1743
1754
|
const { root } = tables;
|
|
1744
1755
|
const { namespaceId, tableName } = root.storage;
|
|
1745
|
-
const where = buildCountMutationWhere(contract, tables, filters,
|
|
1756
|
+
const where = buildCountMutationWhere(contract, tables, filters, variantValue);
|
|
1746
1757
|
const { assignments } = toParamAssignments(contract, namespaceId, tableName, setValues);
|
|
1747
1758
|
let ast = UpdateAst.table(root.tableSource(contract)).withSet(assignments);
|
|
1748
1759
|
if (where) ast = ast.withWhere(where);
|
|
@@ -1757,8 +1768,8 @@ function compileDeleteReturning(contract, modelName, tables, filters, returningC
|
|
|
1757
1768
|
const { params } = deriveParamsFromAst(ast);
|
|
1758
1769
|
return buildOrmQueryPlan(contract, ast, params);
|
|
1759
1770
|
}
|
|
1760
|
-
function compileDeleteCount(contract, tables, filters,
|
|
1761
|
-
const where = buildCountMutationWhere(contract, tables, filters,
|
|
1771
|
+
function compileDeleteCount(contract, tables, filters, variantValue) {
|
|
1772
|
+
const where = buildCountMutationWhere(contract, tables, filters, variantValue);
|
|
1762
1773
|
let ast = DeleteAst.from(tables.root.tableSource(contract));
|
|
1763
1774
|
if (where) ast = ast.withWhere(where);
|
|
1764
1775
|
const { params } = deriveParamsFromAst(ast);
|
|
@@ -1833,9 +1844,9 @@ function jsonEntryProjection(value, identity) {
|
|
|
1833
1844
|
if (identity.document === true) return new JsonDocumentProjection(value);
|
|
1834
1845
|
return new NativeJsonValueProjection(value);
|
|
1835
1846
|
}
|
|
1836
|
-
function buildProjection(contract,
|
|
1847
|
+
function buildProjection(contract, model, table, selectedFields, projectedThrough) {
|
|
1837
1848
|
const { namespaceId, tableName } = table.storage;
|
|
1838
|
-
return (selectedFields !== void 0 ? [...selectedFields] : getColumnsReadOnTable(contract,
|
|
1849
|
+
return (selectedFields !== void 0 ? [...selectedFields] : getColumnsReadOnTable(contract, ...model, tableName, namespaceId)).map((column) => ProjectionItem.of(column, projectedThrough === void 0 ? table.column(column) : ColumnRef.of(projectedThrough, column), codecRefForStorageColumn(contract.storage, namespaceId, tableName, column)));
|
|
1839
1850
|
}
|
|
1840
1851
|
function appendUnique(values, value) {
|
|
1841
1852
|
if (!values.includes(value)) values.push(value);
|
|
@@ -1849,7 +1860,7 @@ function resolvePolymorphicProjectionSelection(contract, namespaceId, modelName,
|
|
|
1849
1860
|
const baseColumnToField = getModelColumnFields(contract, namespaceId, modelName);
|
|
1850
1861
|
const variantColumnMaps = Array.from(polyInfo.variants.values(), (variant) => ({
|
|
1851
1862
|
variant,
|
|
1852
|
-
columnToField: getOwnColumnFields(contract, namespaceId, variant.modelName)
|
|
1863
|
+
columnToField: getOwnColumnFields(contract, variant.namespaceId, variant.modelName)
|
|
1853
1864
|
}));
|
|
1854
1865
|
const baseSelectedFields = [];
|
|
1855
1866
|
const selectedMtiColumnsByVariant = /* @__PURE__ */ new Map();
|
|
@@ -1866,10 +1877,10 @@ function resolvePolymorphicProjectionSelection(contract, namespaceId, modelName,
|
|
|
1866
1877
|
appendUnique(baseSelectedFields, column);
|
|
1867
1878
|
continue;
|
|
1868
1879
|
}
|
|
1869
|
-
let selectedColumns = selectedMtiColumnsByVariant.get(variant.
|
|
1880
|
+
let selectedColumns = selectedMtiColumnsByVariant.get(variant.value);
|
|
1870
1881
|
if (selectedColumns === void 0) {
|
|
1871
1882
|
selectedColumns = /* @__PURE__ */ new Set();
|
|
1872
|
-
selectedMtiColumnsByVariant.set(variant.
|
|
1883
|
+
selectedMtiColumnsByVariant.set(variant.value, selectedColumns);
|
|
1873
1884
|
}
|
|
1874
1885
|
selectedColumns.add(column);
|
|
1875
1886
|
}
|
|
@@ -1878,7 +1889,7 @@ function resolvePolymorphicProjectionSelection(contract, namespaceId, modelName,
|
|
|
1878
1889
|
return {
|
|
1879
1890
|
baseSelectedFields,
|
|
1880
1891
|
selectedMtiColumnsByVariant,
|
|
1881
|
-
needsHiddenDiscriminator: state.
|
|
1892
|
+
needsHiddenDiscriminator: state.variantValue === void 0 && hasVariantOwnedSelection && !baseSelectedFields.includes(polyInfo.discriminatorColumn)
|
|
1882
1893
|
};
|
|
1883
1894
|
}
|
|
1884
1895
|
function buildHiddenDiscriminatorProjection(contract, table, polyInfo, needed) {
|
|
@@ -1917,7 +1928,7 @@ function buildIncludeJoinExpr(include, child, parentLocalRefs) {
|
|
|
1917
1928
|
return joinExprs.length === 1 ? firstExpr : AndExpr.of(joinExprs);
|
|
1918
1929
|
}
|
|
1919
1930
|
function localTable(tables, include) {
|
|
1920
|
-
return include.
|
|
1931
|
+
return include.localVariantValue === void 0 ? tables.root : requireVariantTable(tables, include.localVariantValue);
|
|
1921
1932
|
}
|
|
1922
1933
|
function resolveParentLocalRefs(parent, include, localColumns) {
|
|
1923
1934
|
const local = localTable(parent.tables, include);
|
|
@@ -1960,7 +1971,7 @@ function buildChildPolymorphismJoinsAndProjection(contract, include) {
|
|
|
1960
1971
|
baseSelectedFields: include.nested.selectedFields
|
|
1961
1972
|
};
|
|
1962
1973
|
const selection = resolvePolymorphicProjectionSelection(contract, include.relatedNamespaceId, include.relatedModelName, polyInfo, include.nested);
|
|
1963
|
-
const { joins, projection } = buildMtiJoins(contract, include.nested.tables, polyInfo, include.nested.
|
|
1974
|
+
const { joins, projection } = buildMtiJoins(contract, include.nested.tables, polyInfo, include.nested.variantValue, selection.selectedMtiColumnsByVariant);
|
|
1964
1975
|
return {
|
|
1965
1976
|
joins,
|
|
1966
1977
|
projection,
|
|
@@ -1972,8 +1983,8 @@ function buildRequiredMtiJoinKeyProjection(contract, include) {
|
|
|
1972
1983
|
const aliases = /* @__PURE__ */ new Set();
|
|
1973
1984
|
const projection = [];
|
|
1974
1985
|
for (const nested of include.nested.includes) {
|
|
1975
|
-
if (nested.
|
|
1976
|
-
const variantTable = requireVariantTable(include.nested.tables, nested.
|
|
1986
|
+
if (nested.localVariantValue === void 0) continue;
|
|
1987
|
+
const variantTable = requireVariantTable(include.nested.tables, nested.localVariantValue);
|
|
1977
1988
|
for (const column of localColumnsForRowInclude(nested)) {
|
|
1978
1989
|
const alias = variantColumnLabel(variantTable, column);
|
|
1979
1990
|
if (aliases.has(alias)) continue;
|
|
@@ -2054,7 +2065,7 @@ function buildIncludeChildRowsSelect(contract, aggregates, scope, parent, includ
|
|
|
2054
2065
|
junctionJoins
|
|
2055
2066
|
});
|
|
2056
2067
|
const polyJoinsAndProjection = buildChildPolymorphismJoinsAndProjection(contract, include);
|
|
2057
|
-
const scalarProjection = buildProjection(contract,
|
|
2068
|
+
const scalarProjection = buildProjection(contract, addressedModel(contract, include.relatedNamespaceId, include.relatedModelName, include.nested.variantValue), child, polyJoinsAndProjection.baseSelectedFields);
|
|
2058
2069
|
const nestedProjections = buildNestedIncludeProjections(contract, aggregates, scope, { tables: childState.tables }, childState.includes);
|
|
2059
2070
|
const childProjection = [
|
|
2060
2071
|
...scalarProjection,
|
|
@@ -2092,7 +2103,7 @@ function buildDistinctNonLeafChildRowsSelect(options) {
|
|
|
2092
2103
|
const { contract, aggregates, scope, include, rowsAlias, childOrderBy, hiddenOrderProjection, aggregateOrderBy, whereExpr, junctionJoins } = options;
|
|
2093
2104
|
const childState = include.nested;
|
|
2094
2105
|
const child = childState.tables.root;
|
|
2095
|
-
const grandchildJoinColumns = Array.from(new Set(childState.includes.flatMap((nested) => nested.
|
|
2106
|
+
const grandchildJoinColumns = Array.from(new Set(childState.includes.flatMap((nested) => nested.localVariantValue === void 0 ? localColumnsForRowInclude(nested) : [])));
|
|
2096
2107
|
const { selectedForQuery } = augmentSelectionForJoinColumns(childState.selectedFields, grandchildJoinColumns);
|
|
2097
2108
|
const visiblePolyProjection = buildChildPolymorphismJoinsAndProjection(contract, include);
|
|
2098
2109
|
const queryPolyProjection = buildChildPolymorphismJoinsAndProjection(contract, {
|
|
@@ -2102,7 +2113,7 @@ function buildDistinctNonLeafChildRowsSelect(options) {
|
|
|
2102
2113
|
selectedFields: selectedForQuery
|
|
2103
2114
|
}
|
|
2104
2115
|
});
|
|
2105
|
-
const innerScalarProjection = buildProjection(contract,
|
|
2116
|
+
const innerScalarProjection = buildProjection(contract, addressedModel(contract, include.relatedNamespaceId, include.relatedModelName, include.nested.variantValue), child, queryPolyProjection.baseSelectedFields);
|
|
2106
2117
|
const innerMtiProjection = mergeProjectionByAlias(queryPolyProjection.projection, buildRequiredMtiJoinKeyProjection(contract, include));
|
|
2107
2118
|
let baseInner = SelectAst.from(child.tableSource(contract)).withProjection([
|
|
2108
2119
|
...innerScalarProjection,
|
|
@@ -2125,7 +2136,7 @@ function buildDistinctNonLeafChildRowsSelect(options) {
|
|
|
2125
2136
|
if (childState.limit !== void 0) innerSelect = innerSelect.withLimit(childState.limit);
|
|
2126
2137
|
if (childState.offset !== void 0) innerSelect = innerSelect.withOffset(childState.offset);
|
|
2127
2138
|
const distinctAlias = scope.alias(`${include.relationName}__distinct`);
|
|
2128
|
-
const outerScalarProjection = buildProjection(contract,
|
|
2139
|
+
const outerScalarProjection = buildProjection(contract, addressedModel(contract, include.relatedNamespaceId, include.relatedModelName, include.nested.variantValue), child, visiblePolyProjection.baseSelectedFields, distinctAlias);
|
|
2129
2140
|
const outerNestedProjections = buildNestedIncludeProjections(contract, aggregates, scope, {
|
|
2130
2141
|
tables: childState.tables,
|
|
2131
2142
|
projectedThrough: distinctAlias
|
|
@@ -2321,9 +2332,9 @@ function buildSelectAst(contract, modelName, state, options) {
|
|
|
2321
2332
|
assertDistinctOnCapability(contract, "distinctOn");
|
|
2322
2333
|
assertDistinctOnCompatibleOrder(state.orderBy, state.distinctOn.length);
|
|
2323
2334
|
}
|
|
2324
|
-
const addressed =
|
|
2335
|
+
const addressed = addressedModel(contract, namespaceId, modelName, state.variantValue);
|
|
2325
2336
|
const projection = [...buildProjection(contract, addressed, root, state.selectedFields), ...options.includeProjection ?? []];
|
|
2326
|
-
const { source: fromSource, where: effectiveWhere } = buildDedupedTableSource(contract, state, options.where ?? buildStateWhere(contract, state), getColumnsReadOnTable(contract,
|
|
2337
|
+
const { source: fromSource, where: effectiveWhere } = buildDedupedTableSource(contract, state, options.where ?? buildStateWhere(contract, state), getColumnsReadOnTable(contract, ...addressed, tableName, namespaceId).map((column) => ProjectionItem.of(column, root.column(column))));
|
|
2327
2338
|
let ast = SelectAst.from(fromSource).withProjection(projection);
|
|
2328
2339
|
if (effectiveWhere) ast = ast.withWhere(effectiveWhere);
|
|
2329
2340
|
if (state.orderBy) ast = ast.withOrderBy(state.orderBy);
|
|
@@ -2345,7 +2356,7 @@ function buildRootPolymorphism(contract, state, modelName) {
|
|
|
2345
2356
|
projection: []
|
|
2346
2357
|
};
|
|
2347
2358
|
const selection = resolvePolymorphicProjectionSelection(contract, namespaceId, modelName, polyInfo, state);
|
|
2348
|
-
const mtiArtifacts = polyInfo.mtiVariants.length > 0 ? buildMtiJoins(contract, state.tables, polyInfo, state.
|
|
2359
|
+
const mtiArtifacts = polyInfo.mtiVariants.length > 0 ? buildMtiJoins(contract, state.tables, polyInfo, state.variantValue, selection.selectedMtiColumnsByVariant) : void 0;
|
|
2349
2360
|
return {
|
|
2350
2361
|
projectionState: {
|
|
2351
2362
|
...state,
|
|
@@ -2406,7 +2417,7 @@ function describeExecutionRows(options) {
|
|
|
2406
2417
|
const polyInfo = resolvePolymorphismInfo(contract, namespaceId, modelName);
|
|
2407
2418
|
if (state.includes.length === 0) {
|
|
2408
2419
|
const compiled = compileSelect(contract, modelName, state);
|
|
2409
|
-
const mapper = polyInfo ? (rawRow) => blindCast(mapPolymorphicRow(contract, namespaceId, modelName, polyInfo, state.tables, rawRow, state.
|
|
2420
|
+
const mapper = polyInfo ? (rawRow) => blindCast(mapPolymorphicRow(contract, namespaceId, modelName, polyInfo, state.tables, rawRow, state.variantValue)) : (rawRow) => blindCast(mapStorageRowToModelFields(contract, namespaceId, modelName, rawRow));
|
|
2410
2421
|
return {
|
|
2411
2422
|
plan: compiled,
|
|
2412
2423
|
consume: (rows) => mapResultRows(rows, mapper)
|
|
@@ -2430,7 +2441,7 @@ function deferResolution(resolve) {
|
|
|
2430
2441
|
function createPreparedMapper(contract, namespaceId, modelName, state) {
|
|
2431
2442
|
const resolved = deferResolution(() => {
|
|
2432
2443
|
const polyInfo = resolvePolymorphismInfo(contract, namespaceId, modelName);
|
|
2433
|
-
return polyInfo ? createPolymorphicRowMapper(contract, namespaceId, modelName, polyInfo, state.tables, state.
|
|
2444
|
+
return polyInfo ? createPolymorphicRowMapper(contract, namespaceId, modelName, polyInfo, state.tables, state.variantValue) : createStorageRowMapper(contract, namespaceId, modelName);
|
|
2434
2445
|
});
|
|
2435
2446
|
return (row) => resolved()(row);
|
|
2436
2447
|
}
|
|
@@ -2479,10 +2490,10 @@ function createPreparedIncludeConsumer(context, include) {
|
|
|
2479
2490
|
const mapRow = createPreparedMapper(contract, include.relatedNamespaceId, include.relatedModelName, include.nested);
|
|
2480
2491
|
const bindings = deferResolution(() => {
|
|
2481
2492
|
const namespace = include.relatedNamespaceId;
|
|
2482
|
-
const keys = new Set(getColumnsReadOnTable(contract, namespace,
|
|
2493
|
+
const keys = new Set(getColumnsReadOnTable(contract, ...addressedModel(contract, namespace, include.relatedModelName, include.nested.variantValue), include.relatedTableName, namespace));
|
|
2483
2494
|
const polyInfo = resolvePolymorphismInfo(contract, namespace, include.relatedModelName);
|
|
2484
2495
|
for (const variant of polyInfo?.mtiVariants ?? []) {
|
|
2485
|
-
const variantTable = requireVariantTable(include.nested.tables, variant.
|
|
2496
|
+
const variantTable = requireVariantTable(include.nested.tables, variant.value);
|
|
2486
2497
|
for (const column of getColumnsReadOnTable(contract, variantTable.storage.namespaceId, variant.modelName, variantTable.storage.tableName)) keys.add(variantColumnLabel(variantTable, column));
|
|
2487
2498
|
}
|
|
2488
2499
|
return new Map([...keys].map((key) => [key, deferResolution(() => resolveIncludedColumnBinding(contract, context, include, key))]));
|
|
@@ -2595,7 +2606,7 @@ function consumeIncludeRows(context, state, namespaceId, modelName, rows) {
|
|
|
2595
2606
|
const parentRows = parentRowsRaw.map((row) => {
|
|
2596
2607
|
return {
|
|
2597
2608
|
raw: row,
|
|
2598
|
-
mapped: polyInfo ? mapPolymorphicRow(contract, namespaceId, modelName, polyInfo, state.tables, row, state.
|
|
2609
|
+
mapped: polyInfo ? mapPolymorphicRow(contract, namespaceId, modelName, polyInfo, state.tables, row, state.variantValue) : mapStorageRowToModelFields(contract, namespaceId, modelName, row)
|
|
2599
2610
|
};
|
|
2600
2611
|
});
|
|
2601
2612
|
const bindings = /* @__PURE__ */ new WeakMap();
|
|
@@ -2688,7 +2699,7 @@ function decodeIncludePayload(contract, context, include, raw, bindings) {
|
|
|
2688
2699
|
if (include.combine) return decodeCombineIncludePayload(contract, context, include, include.combine, raw, bindings);
|
|
2689
2700
|
const rawChildren = parseIncludedRows(include, raw);
|
|
2690
2701
|
const polyInfo = resolvePolymorphismInfo(contract, include.relatedNamespaceId, include.relatedModelName);
|
|
2691
|
-
const mapChildRow = polyInfo ? (childRow) => mapPolymorphicRow(contract, include.relatedNamespaceId, include.relatedModelName, polyInfo, include.nested.tables, childRow, include.nested.
|
|
2702
|
+
const mapChildRow = polyInfo ? (childRow) => mapPolymorphicRow(contract, include.relatedNamespaceId, include.relatedModelName, polyInfo, include.nested.tables, childRow, include.nested.variantValue) : createStorageRowMapper(contract, include.relatedNamespaceId, include.relatedModelName);
|
|
2692
2703
|
let columns = bindings.get(include);
|
|
2693
2704
|
if (!columns) {
|
|
2694
2705
|
columns = /* @__PURE__ */ new Map();
|
|
@@ -2751,7 +2762,7 @@ function resolveIncludedColumnRef(contract, include, key) {
|
|
|
2751
2762
|
const polyInfo = resolvePolymorphismInfo(contract, include.relatedNamespaceId, include.relatedModelName);
|
|
2752
2763
|
if (!polyInfo) return;
|
|
2753
2764
|
for (const variant of polyInfo.mtiVariants) {
|
|
2754
|
-
const variantTable = requireVariantTable(include.nested.tables, variant.
|
|
2765
|
+
const variantTable = requireVariantTable(include.nested.tables, variant.value);
|
|
2755
2766
|
const prefix = variantColumnLabelPrefix(variantTable);
|
|
2756
2767
|
if (!key.startsWith(prefix)) continue;
|
|
2757
2768
|
const column = key.slice(prefix.length);
|
|
@@ -2920,14 +2931,14 @@ function parseIncludePayload(value) {
|
|
|
2920
2931
|
return [];
|
|
2921
2932
|
}
|
|
2922
2933
|
}
|
|
2923
|
-
function createMutationRowMapper(contract, namespaceId, modelName, tables,
|
|
2934
|
+
function createMutationRowMapper(contract, namespaceId, modelName, tables, variantValue) {
|
|
2924
2935
|
const polyInfo = resolvePolymorphismInfo(contract, namespaceId, modelName);
|
|
2925
|
-
return polyInfo ? (row) => mapPolymorphicRow(contract, namespaceId, modelName, polyInfo, tables, row,
|
|
2936
|
+
return polyInfo ? (row) => mapPolymorphicRow(contract, namespaceId, modelName, polyInfo, tables, row, variantValue) : (row) => mapStorageRowToModelFields(contract, namespaceId, modelName, row);
|
|
2926
2937
|
}
|
|
2927
2938
|
function dispatchMutationRows(options) {
|
|
2928
|
-
const { context, runtime, compiled, tables, modelName, namespaceId,
|
|
2939
|
+
const { context, runtime, compiled, tables, modelName, namespaceId, variantValue, includes, selectedFields, hiddenColumns, mapRow } = options;
|
|
2929
2940
|
const { contract } = context;
|
|
2930
|
-
const mapStorageRow = createMutationRowMapper(contract, namespaceId, modelName, tables,
|
|
2941
|
+
const mapStorageRow = createMutationRowMapper(contract, namespaceId, modelName, tables, variantValue);
|
|
2931
2942
|
if (includes.length === 0) return mapResultRows(queryPlanRows(runtime, compiled), (rawRow) => {
|
|
2932
2943
|
const mapped = mapStorageRow(rawRow);
|
|
2933
2944
|
if (hiddenColumns.length > 0) stripHiddenMappedFields(contract, namespaceId, modelName, mapped, hiddenColumns);
|
|
@@ -2949,9 +2960,9 @@ function dispatchMutationRows(options) {
|
|
|
2949
2960
|
return new AsyncIterableResult(generator());
|
|
2950
2961
|
}
|
|
2951
2962
|
function dispatchSplitMutationRows(options) {
|
|
2952
|
-
const { context, runtime, plans, tables, modelName, namespaceId,
|
|
2963
|
+
const { context, runtime, plans, tables, modelName, namespaceId, variantValue, includes, selectedFields, hiddenColumns, mapRow } = options;
|
|
2953
2964
|
const { contract } = context;
|
|
2954
|
-
const mapStorageRow = createMutationRowMapper(contract, namespaceId, modelName, tables,
|
|
2965
|
+
const mapStorageRow = createMutationRowMapper(contract, namespaceId, modelName, tables, variantValue);
|
|
2955
2966
|
const generator = async function* () {
|
|
2956
2967
|
if (includes.length > 0) {
|
|
2957
2968
|
const identityRows = [];
|
|
@@ -2977,9 +2988,9 @@ function dispatchSplitMutationRows(options) {
|
|
|
2977
2988
|
return new AsyncIterableResult(generator());
|
|
2978
2989
|
}
|
|
2979
2990
|
async function executeMutationReturningSingleRow(options) {
|
|
2980
|
-
const { context, runtime, compiled, tables, modelName, namespaceId,
|
|
2991
|
+
const { context, runtime, compiled, tables, modelName, namespaceId, variantValue, includes, selectedFields, hiddenColumns, mapRow, operation, onMissingRowMessage } = options;
|
|
2981
2992
|
const { contract } = context;
|
|
2982
|
-
const mapStorageRow = createMutationRowMapper(contract, namespaceId, modelName, tables,
|
|
2993
|
+
const mapStorageRow = createMutationRowMapper(contract, namespaceId, modelName, tables, variantValue);
|
|
2983
2994
|
if (includes.length === 0) {
|
|
2984
2995
|
const first = (await queryPlanRows(runtime, compiled).toArray())[0];
|
|
2985
2996
|
if (!first) return null;
|
|
@@ -3157,7 +3168,7 @@ function assertModelFragmentReceiver(source, value) {
|
|
|
3157
3168
|
}
|
|
3158
3169
|
function firstQueryState(state) {
|
|
3159
3170
|
return [
|
|
3160
|
-
["a variant", state.
|
|
3171
|
+
["a variant", state.variantValue !== void 0],
|
|
3161
3172
|
["a cursor", state.cursor !== void 0],
|
|
3162
3173
|
["distinctOn", state.distinctOn !== void 0],
|
|
3163
3174
|
["distinct", state.distinct !== void 0],
|
|
@@ -3242,7 +3253,7 @@ function assertDeclaredFieldsFragmentFields(collection, fields) {
|
|
|
3242
3253
|
meta
|
|
3243
3254
|
});
|
|
3244
3255
|
const fieldMany = multiplicity(domainFieldOf(contract, namespaceId, modelName, name)?.many);
|
|
3245
|
-
const column = resolveColumn(contract, namespaceId, fieldColumn.table, fieldColumn.column);
|
|
3256
|
+
const column = resolveColumn(contract, fieldColumn.namespaceId, fieldColumn.table, fieldColumn.column);
|
|
3246
3257
|
const actual = column === void 0 ? `${label}.${name} has no column.` : fieldMany === false ? `${label}.${name} has codec ${column.codecId} and ${nullability(column.nullable)}.` : `${label}.${name} is a list ${describeField({
|
|
3247
3258
|
codecId: column.codecId,
|
|
3248
3259
|
nullable: column.nullable,
|
|
@@ -3329,7 +3340,7 @@ function fieldCodecId(collection, field) {
|
|
|
3329
3340
|
const modelFields = getModelFields(contract, collection.namespaceId, collection.modelName);
|
|
3330
3341
|
const fieldColumn = Object.hasOwn(modelFields, field) ? modelFields[field] : void 0;
|
|
3331
3342
|
if (fieldColumn === void 0) return void 0;
|
|
3332
|
-
return resolveColumn(contract,
|
|
3343
|
+
return resolveColumn(contract, fieldColumn.namespaceId, fieldColumn.table, fieldColumn.column)?.codecId;
|
|
3333
3344
|
}
|
|
3334
3345
|
/** The domain declaration of a model's own or inherited field. */
|
|
3335
3346
|
function domainFieldOf(contract, namespaceId, modelName, name) {
|
|
@@ -3509,8 +3520,8 @@ function createCallbackTools(context, indexes) {
|
|
|
3509
3520
|
function hasThrough$1(relation) {
|
|
3510
3521
|
return relation.through !== void 0;
|
|
3511
3522
|
}
|
|
3512
|
-
function createModelAccessor(context, namespaceId, modelName, tables,
|
|
3513
|
-
return createModelAccessorInScope(context, namespaceId, modelName,
|
|
3523
|
+
function createModelAccessor(context, namespaceId, modelName, tables, variantValue) {
|
|
3524
|
+
return createModelAccessorInScope(context, namespaceId, modelName, variantValue, tables.scope, tables.root, variantValue === void 0 ? void 0 : tables.variants.get(variantValue));
|
|
3514
3525
|
}
|
|
3515
3526
|
/**
|
|
3516
3527
|
* The second argument of a `where` or `orderBy` callback on a collection of the model: the SQL query builder's functions, and the indexes of the model's table.
|
|
@@ -3545,14 +3556,16 @@ function indexReferencesOf(context, modelName, aliasedTable) {
|
|
|
3545
3556
|
}
|
|
3546
3557
|
});
|
|
3547
3558
|
}
|
|
3548
|
-
function createModelAccessorInScope(context, namespaceId, modelName,
|
|
3559
|
+
function createModelAccessorInScope(context, namespaceId, modelName, variantValue, scope, table, variantTable) {
|
|
3549
3560
|
const contract = context.contract;
|
|
3550
|
-
const fieldColumns = getModelAndVariantFieldColumns(contract, namespaceId, modelName,
|
|
3561
|
+
const fieldColumns = getModelAndVariantFieldColumns(contract, namespaceId, modelName, variantValue);
|
|
3551
3562
|
const modelRelations = resolveModelRelations(contract, namespaceId, modelName);
|
|
3552
|
-
const variantFieldColumns =
|
|
3553
|
-
const
|
|
3554
|
-
|
|
3555
|
-
|
|
3563
|
+
const variantFieldColumns = variantValue ? resolveVariantFieldColumns(contract, namespaceId, modelName, variantValue) : {};
|
|
3564
|
+
const [addressedNamespaceId, addressed] = addressedModel(contract, namespaceId, modelName, variantValue);
|
|
3565
|
+
const variantCoordinates = variantValue ? {
|
|
3566
|
+
namespaceId: addressedNamespaceId,
|
|
3567
|
+
name: addressed,
|
|
3568
|
+
relations: resolveModelRelations(contract, addressedNamespaceId, addressed)
|
|
3556
3569
|
} : void 0;
|
|
3557
3570
|
const variantFieldTable = variantTable ?? table;
|
|
3558
3571
|
const opsByCodecId = /* @__PURE__ */ new Map();
|
|
@@ -3578,7 +3591,7 @@ function createModelAccessorInScope(context, namespaceId, modelName, variantName
|
|
|
3578
3591
|
if (typeof prop !== "string") return;
|
|
3579
3592
|
if (variantCoordinates && Object.hasOwn(variantCoordinates.relations, prop)) {
|
|
3580
3593
|
const variantRelation = variantCoordinates.relations[prop];
|
|
3581
|
-
if (variantRelation) return createRelationFilterAccessor(context, namespaceId, variantCoordinates.name, scope, variantFieldTable, variantRelation);
|
|
3594
|
+
if (variantRelation) return createRelationFilterAccessor(context, variantCoordinates.namespaceId, variantCoordinates.name, scope, variantFieldTable, variantRelation);
|
|
3582
3595
|
}
|
|
3583
3596
|
const relation = Object.hasOwn(modelRelations, prop) ? modelRelations[prop] : void 0;
|
|
3584
3597
|
if (relation) return createRelationFilterAccessor(context, namespaceId, modelName, scope, table, relation);
|
|
@@ -3588,7 +3601,7 @@ function createModelAccessorInScope(context, namespaceId, modelName, variantName
|
|
|
3588
3601
|
}
|
|
3589
3602
|
const fieldTable = variantField ? variantFieldTable : table;
|
|
3590
3603
|
const fieldStorage = fieldTable.storage;
|
|
3591
|
-
const columnName = variantField?.column ?? columnOfCallerField(contract,
|
|
3604
|
+
const columnName = variantField?.column ?? columnOfCallerField(contract, addressedNamespaceId, fieldColumns, addressed, prop);
|
|
3592
3605
|
const column = resolveColumn(contract, fieldStorage.namespaceId, fieldStorage.tableName, columnName);
|
|
3593
3606
|
if (!column) throw new InternalError(`Field "${modelName}.${prop}" maps column "${columnName}", which table "${fieldStorage.tableName}" does not have`);
|
|
3594
3607
|
const traits = codecTraits(context, column.codecId);
|
|
@@ -4798,7 +4811,7 @@ var CollectionBase = class CollectionBase {
|
|
|
4798
4811
|
}
|
|
4799
4812
|
where(input) {
|
|
4800
4813
|
const tables = withScopeCopy(this.state.tables);
|
|
4801
|
-
const filter = normalizeWhereArg(typeof input === "function" ? whereArgOf(input(createModelAccessor(this.ctx.context, this.namespaceId, this.modelName, tables, this.state.
|
|
4814
|
+
const filter = normalizeWhereArg(typeof input === "function" ? whereArgOf(input(createModelAccessor(this.ctx.context, this.namespaceId, this.modelName, tables, this.state.variantValue), this.#callbackTools(tables))) : isWhereDirectInput(input) ? input : shorthandToWhereExpr(this.ctx.context, this.namespaceId, this.modelName, input, tables.root), {
|
|
4802
4815
|
contract: this.contract,
|
|
4803
4816
|
tables: tableAliases(tables)
|
|
4804
4817
|
});
|
|
@@ -4855,20 +4868,17 @@ var CollectionBase = class CollectionBase {
|
|
|
4855
4868
|
}
|
|
4856
4869
|
variant(value) {
|
|
4857
4870
|
const polyInfo = resolvePolymorphismInfo(this.contract, this.namespaceId, this.modelName);
|
|
4858
|
-
const
|
|
4859
|
-
if (
|
|
4860
|
-
|
|
4861
|
-
|
|
4862
|
-
|
|
4863
|
-
|
|
4864
|
-
|
|
4865
|
-
|
|
4866
|
-
|
|
4867
|
-
} });
|
|
4868
|
-
}
|
|
4869
|
-
const variantInfo = polyInfo?.variantsByValue.get(value);
|
|
4871
|
+
const selectedVariantValue = this.state.variantValue;
|
|
4872
|
+
if (selectedVariantValue !== void 0) throw ormError("ORM.OPERATION_UNSUPPORTED", `variant("${value}") cannot be called on model "${this.modelName}" because variant("${selectedVariantValue}") is already selected; call variant() on the base collection instead`, { meta: {
|
|
4873
|
+
method: "variant",
|
|
4874
|
+
model: this.modelName,
|
|
4875
|
+
variant: polyInfo?.variants.get(selectedVariantValue)?.modelName,
|
|
4876
|
+
selectedValue: selectedVariantValue,
|
|
4877
|
+
reason: "variant-already-selected"
|
|
4878
|
+
} });
|
|
4879
|
+
const variantInfo = polyInfo?.variants.get(value);
|
|
4870
4880
|
if (!polyInfo || !variantInfo) {
|
|
4871
|
-
const declaredValues = [...polyInfo?.
|
|
4881
|
+
const declaredValues = [...polyInfo?.variants.keys() ?? []];
|
|
4872
4882
|
throw ormError("ORM.ARGUMENT_INVALID", declaredValues.length === 0 ? `variant("${value}") cannot narrow model "${this.modelName}": it declares no discriminator values` : `variant("${value}") cannot narrow model "${this.modelName}": the declared discriminator values are ${declaredValues.map((declared) => `"${declared}"`).join(", ")}`, { meta: {
|
|
4873
4883
|
method: "variant",
|
|
4874
4884
|
argument: "value",
|
|
@@ -4881,11 +4891,11 @@ var CollectionBase = class CollectionBase {
|
|
|
4881
4891
|
const filter = BinaryExpr.eq(this.state.tables.root.column(columnName), paramRefForStorageColumn(this.contract, this.state.tables.root.storage, columnName, variantInfo.value));
|
|
4882
4892
|
return this.#cloneWithRow({
|
|
4883
4893
|
filters: [...this.state.filters, filter],
|
|
4884
|
-
|
|
4894
|
+
variantValue: variantInfo.value
|
|
4885
4895
|
});
|
|
4886
4896
|
}
|
|
4887
4897
|
include(relationName, refineFn) {
|
|
4888
|
-
const relation = resolveIncludeRelation(this.contract, this.namespaceId, this.modelName, relationName, this.state.
|
|
4898
|
+
const relation = resolveIncludeRelation(this.contract, this.namespaceId, this.modelName, relationName, this.state.variantValue);
|
|
4889
4899
|
const child = createIncludeTables(this.contract, this.state.tables, relation);
|
|
4890
4900
|
let nestedState = emptyState(child.tables);
|
|
4891
4901
|
let adoptedScope = child.tables.scope;
|
|
@@ -4922,7 +4932,7 @@ var CollectionBase = class CollectionBase {
|
|
|
4922
4932
|
relatedModelName: relation.relatedModelName,
|
|
4923
4933
|
relatedNamespaceId: relation.relatedNamespaceId,
|
|
4924
4934
|
relatedTableName: relation.relatedTableName,
|
|
4925
|
-
...ifDefined("
|
|
4935
|
+
...ifDefined("localVariantValue", relation.localVariantValue),
|
|
4926
4936
|
targetColumns: relation.targetColumns,
|
|
4927
4937
|
localColumns: relation.localColumns,
|
|
4928
4938
|
cardinality: relation.cardinality,
|
|
@@ -4941,12 +4951,12 @@ var CollectionBase = class CollectionBase {
|
|
|
4941
4951
|
});
|
|
4942
4952
|
}
|
|
4943
4953
|
select(...fields) {
|
|
4944
|
-
const selectedFields = mapSelectedFieldsToColumns(this.contract, this.namespaceId, this.modelName, this.state.
|
|
4954
|
+
const selectedFields = mapSelectedFieldsToColumns(this.contract, this.namespaceId, this.modelName, this.state.variantValue, fields);
|
|
4945
4955
|
return this.#cloneWithRow({ selectedFields });
|
|
4946
4956
|
}
|
|
4947
4957
|
orderBy(selection) {
|
|
4948
4958
|
const tables = withScopeCopy(this.state.tables);
|
|
4949
|
-
const accessor = createModelAccessor(this.ctx.context, this.namespaceId, this.modelName, tables, this.state.
|
|
4959
|
+
const accessor = createModelAccessor(this.ctx.context, this.namespaceId, this.modelName, tables, this.state.variantValue);
|
|
4950
4960
|
const tools = this.#callbackTools(tables);
|
|
4951
4961
|
const nextOrders = (Array.isArray(selection) ? selection : [selection]).map((selector) => selector(accessor, tools));
|
|
4952
4962
|
const existing = this.state.orderBy ?? [];
|
|
@@ -5183,7 +5193,7 @@ var CollectionBase = class CollectionBase {
|
|
|
5183
5193
|
tables: this.state.tables,
|
|
5184
5194
|
modelName: this.modelName,
|
|
5185
5195
|
namespaceId: this.namespaceId,
|
|
5186
|
-
|
|
5196
|
+
variantValue: this.state.variantValue,
|
|
5187
5197
|
includes: this.state.includes,
|
|
5188
5198
|
selectedFields: this.state.selectedFields,
|
|
5189
5199
|
hiddenColumns,
|
|
@@ -5198,7 +5208,7 @@ var CollectionBase = class CollectionBase {
|
|
|
5198
5208
|
tables: this.state.tables,
|
|
5199
5209
|
modelName: this.modelName,
|
|
5200
5210
|
namespaceId: this.namespaceId,
|
|
5201
|
-
|
|
5211
|
+
variantValue: this.state.variantValue,
|
|
5202
5212
|
includes: this.state.includes,
|
|
5203
5213
|
selectedFields: this.state.selectedFields,
|
|
5204
5214
|
hiddenColumns,
|
|
@@ -5218,36 +5228,39 @@ var CollectionBase = class CollectionBase {
|
|
|
5218
5228
|
return { columns: resolveInsertConflictColumns(this.contract, this.namespaceId, this.modelName, conflictOn) };
|
|
5219
5229
|
}
|
|
5220
5230
|
#assertNotMtiVariant(method) {
|
|
5221
|
-
this.#refuseOnMtiVariant(method, `${method} is not supported for MTI variant "${this
|
|
5231
|
+
this.#refuseOnMtiVariant(method, `${method} is not supported for MTI variant "${this.#variantModelName()}" on model "${this.modelName}". Use createAll() instead.`);
|
|
5222
5232
|
}
|
|
5223
5233
|
#assertConflictSkipNotOnMtiVariant(method) {
|
|
5224
|
-
this.#refuseOnMtiVariant(method, `The onConflict option is not supported on variant "${this
|
|
5234
|
+
this.#refuseOnMtiVariant(method, `The onConflict option is not supported on variant "${this.#variantModelName()}" of model "${this.modelName}" because the variant is stored in its own table. Call createAll(rows) without the option; a duplicate row then makes the call fail.`);
|
|
5225
5235
|
}
|
|
5226
5236
|
#refuseOnMtiVariant(method, message) {
|
|
5227
5237
|
if (!this.#resolveMtiCreateContext()) return;
|
|
5228
5238
|
throw ormError("ORM.OPERATION_UNSUPPORTED", message, { meta: {
|
|
5229
5239
|
method,
|
|
5230
5240
|
model: this.modelName,
|
|
5231
|
-
variant: this
|
|
5241
|
+
variant: this.#variantModelName(),
|
|
5232
5242
|
reason: "mti-variant"
|
|
5233
5243
|
} });
|
|
5234
5244
|
}
|
|
5245
|
+
#variantModelName() {
|
|
5246
|
+
return addressedModel(this.contract, this.namespaceId, this.modelName, this.state.variantValue)[1];
|
|
5247
|
+
}
|
|
5235
5248
|
#resolveMtiCreateContext() {
|
|
5236
|
-
const
|
|
5237
|
-
if (!
|
|
5249
|
+
const variantValue = this.state.variantValue;
|
|
5250
|
+
if (!variantValue) return null;
|
|
5238
5251
|
const polyInfo = resolvePolymorphismInfo(this.contract, this.namespaceId, this.modelName);
|
|
5239
5252
|
if (!polyInfo) return null;
|
|
5240
|
-
const variant = polyInfo.variants.get(
|
|
5253
|
+
const variant = polyInfo.variants.get(variantValue);
|
|
5241
5254
|
if (!isMtiVariantInfo(variant)) return null;
|
|
5242
5255
|
const baseFieldToColumn = getModelFieldColumns(this.contract, this.namespaceId, this.modelName);
|
|
5243
|
-
const variantFieldToColumn = getOwnFieldColumns(this.contract,
|
|
5256
|
+
const variantFieldToColumn = getOwnFieldColumns(this.contract, variant.namespaceId, variant.modelName);
|
|
5244
5257
|
const pkColumns = resolvePrimaryKeyColumns(this.contract, this.namespaceId, this.tableName);
|
|
5245
5258
|
return {
|
|
5246
5259
|
polyInfo,
|
|
5247
5260
|
variant,
|
|
5248
5261
|
baseFieldToColumn,
|
|
5249
5262
|
variantFieldToColumn,
|
|
5250
|
-
mergedFieldToColumn: getModelAndVariantFieldColumns(this.contract, this.namespaceId, this.modelName, variant.
|
|
5263
|
+
mergedFieldToColumn: getModelAndVariantFieldColumns(this.contract, this.namespaceId, this.modelName, variant.value),
|
|
5251
5264
|
pkColumns
|
|
5252
5265
|
};
|
|
5253
5266
|
}
|
|
@@ -5260,7 +5273,7 @@ var CollectionBase = class CollectionBase {
|
|
|
5260
5273
|
const modelName = this.modelName;
|
|
5261
5274
|
const namespaceId = this.namespaceId;
|
|
5262
5275
|
const tables = this.state.tables;
|
|
5263
|
-
const variantTable = requireVariantTable(tables, variant.
|
|
5276
|
+
const variantTable = requireVariantTable(tables, variant.value);
|
|
5264
5277
|
const baseFieldColumns = new Set(Object.values(baseFieldToColumn));
|
|
5265
5278
|
const variantFieldColumns = new Set(Object.values(variantFieldToColumn));
|
|
5266
5279
|
const generator = async function* () {
|
|
@@ -5269,7 +5282,7 @@ var CollectionBase = class CollectionBase {
|
|
|
5269
5282
|
const allMapped = {};
|
|
5270
5283
|
for (const [fieldName, value] of Object.entries(row)) {
|
|
5271
5284
|
if (value === void 0) continue;
|
|
5272
|
-
allMapped[columnOfCallerField(contract, namespaceId, mergedFieldToColumn, variant.modelName, fieldName)] = value;
|
|
5285
|
+
allMapped[columnOfCallerField(contract, variant.namespaceId, mergedFieldToColumn, variant.modelName, fieldName)] = value;
|
|
5273
5286
|
}
|
|
5274
5287
|
allMapped[polyInfo.discriminatorColumn] = variant.value;
|
|
5275
5288
|
const baseRow = {};
|
|
@@ -5304,25 +5317,25 @@ var CollectionBase = class CollectionBase {
|
|
|
5304
5317
|
return mapPolymorphicRow(contract, namespaceId, modelName, polyInfo, tables, {
|
|
5305
5318
|
...baseCreated,
|
|
5306
5319
|
...prefixedVariant
|
|
5307
|
-
}, variant.
|
|
5320
|
+
}, variant.value);
|
|
5308
5321
|
}));
|
|
5309
5322
|
}
|
|
5310
5323
|
};
|
|
5311
5324
|
return new AsyncIterableResult(generator());
|
|
5312
5325
|
}
|
|
5313
5326
|
#mapCreateRows(data) {
|
|
5314
|
-
const
|
|
5315
|
-
if (!
|
|
5327
|
+
const variantValue = this.state.variantValue;
|
|
5328
|
+
if (!variantValue) return data.map((row) => mapModelDataToStorageRow(this.contract, this.namespaceId, this.modelName, row));
|
|
5316
5329
|
const polyInfo = resolvePolymorphismInfo(this.contract, this.namespaceId, this.modelName);
|
|
5317
5330
|
if (!polyInfo) return data.map((row) => mapModelDataToStorageRow(this.contract, this.namespaceId, this.modelName, row));
|
|
5318
|
-
const variant = polyInfo.variants.get(
|
|
5331
|
+
const variant = polyInfo.variants.get(variantValue);
|
|
5319
5332
|
if (!variant) return data.map((row) => mapModelDataToStorageRow(this.contract, this.namespaceId, this.modelName, row));
|
|
5320
|
-
const mergedFieldToColumn = getModelAndVariantFieldColumns(this.contract, this.namespaceId, this.modelName, variant.
|
|
5333
|
+
const mergedFieldToColumn = getModelAndVariantFieldColumns(this.contract, this.namespaceId, this.modelName, variant.value);
|
|
5321
5334
|
return data.map((row) => {
|
|
5322
5335
|
const mapped = {};
|
|
5323
5336
|
for (const [fieldName, value] of Object.entries(row)) {
|
|
5324
5337
|
if (value === void 0) continue;
|
|
5325
|
-
mapped[columnOfCallerField(this.contract,
|
|
5338
|
+
mapped[columnOfCallerField(this.contract, variant.namespaceId, mergedFieldToColumn, variant.modelName, fieldName)] = value;
|
|
5326
5339
|
}
|
|
5327
5340
|
mapped[polyInfo.discriminatorColumn] = variant.value;
|
|
5328
5341
|
return mapped;
|
|
@@ -5399,7 +5412,7 @@ var CollectionBase = class CollectionBase {
|
|
|
5399
5412
|
tables: this.state.tables,
|
|
5400
5413
|
modelName: this.modelName,
|
|
5401
5414
|
namespaceId: this.namespaceId,
|
|
5402
|
-
|
|
5415
|
+
variantValue: this.state.variantValue,
|
|
5403
5416
|
includes: this.state.includes,
|
|
5404
5417
|
selectedFields: this.state.selectedFields,
|
|
5405
5418
|
hiddenColumns,
|
|
@@ -5467,7 +5480,7 @@ var CollectionBase = class CollectionBase {
|
|
|
5467
5480
|
tables: this.state.tables,
|
|
5468
5481
|
modelName: this.modelName,
|
|
5469
5482
|
namespaceId: this.namespaceId,
|
|
5470
|
-
|
|
5483
|
+
variantValue: this.state.variantValue,
|
|
5471
5484
|
includes: this.state.includes,
|
|
5472
5485
|
selectedFields: this.state.selectedFields,
|
|
5473
5486
|
hiddenColumns,
|
|
@@ -5481,7 +5494,7 @@ var CollectionBase = class CollectionBase {
|
|
|
5481
5494
|
if (Object.keys(mappedData).length === 0) return 0;
|
|
5482
5495
|
applyUpdateDefaults(this.ctx, this.namespaceId, this.tableName, mappedData);
|
|
5483
5496
|
const annotationsMap = this.#collectAnnotationsFromMeta(configure, "write", "updateAndCount");
|
|
5484
|
-
const compiled = mergeAnnotations(compileUpdateCount(this.contract, this.state.tables, mappedData, this.state.filters, this.state.
|
|
5497
|
+
const compiled = mergeAnnotations(compileUpdateCount(this.contract, this.state.tables, mappedData, this.state.filters, this.state.variantValue), annotationsMap);
|
|
5485
5498
|
return (await this.ctx.runtime.execute(compiled)).affectedRows;
|
|
5486
5499
|
}
|
|
5487
5500
|
async delete(configure) {
|
|
@@ -5519,7 +5532,7 @@ var CollectionBase = class CollectionBase {
|
|
|
5519
5532
|
tables: this.state.tables,
|
|
5520
5533
|
modelName: this.modelName,
|
|
5521
5534
|
namespaceId: this.namespaceId,
|
|
5522
|
-
|
|
5535
|
+
variantValue: this.state.variantValue,
|
|
5523
5536
|
includes: this.state.includes,
|
|
5524
5537
|
selectedFields: this.state.selectedFields,
|
|
5525
5538
|
hiddenColumns,
|
|
@@ -5550,7 +5563,7 @@ var CollectionBase = class CollectionBase {
|
|
|
5550
5563
|
modelName: collection.modelName,
|
|
5551
5564
|
namespaceId: collection.namespaceId
|
|
5552
5565
|
}).toArray();
|
|
5553
|
-
const deletePlan = mergeAnnotations(compileDeleteCount(collection.contract, collection.state.tables, collection.state.filters, collection.state.
|
|
5566
|
+
const deletePlan = mergeAnnotations(compileDeleteCount(collection.contract, collection.state.tables, collection.state.filters, collection.state.variantValue), annotationsMap);
|
|
5554
5567
|
await scope.execute(deletePlan);
|
|
5555
5568
|
return rows;
|
|
5556
5569
|
});
|
|
@@ -5562,7 +5575,7 @@ var CollectionBase = class CollectionBase {
|
|
|
5562
5575
|
assertBulkWriteIgnoresNothing(this.state, this.modelName, "deleteAndCount");
|
|
5563
5576
|
assertLockCompatible(this.state, "mutation");
|
|
5564
5577
|
const annotationsMap = this.#collectAnnotationsFromMeta(configure, "write", "deleteAndCount");
|
|
5565
|
-
const compiled = mergeAnnotations(compileDeleteCount(this.contract, this.state.tables, this.state.filters, this.state.
|
|
5578
|
+
const compiled = mergeAnnotations(compileDeleteCount(this.contract, this.state.tables, this.state.filters, this.state.variantValue), annotationsMap);
|
|
5566
5579
|
return (await this.ctx.runtime.execute(compiled)).affectedRows;
|
|
5567
5580
|
}
|
|
5568
5581
|
#buildUpsertConflictCriterion(createValues, conflictColumns) {
|