orchid-orm 1.59.4 → 1.60.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/dist/index.d.ts +27 -25
- package/dist/index.js +236 -239
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +237 -240
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { makeColumnTypes, getStackTrace, applyMixins, QueryHooks, defaultSchemaConfig, raw, getCallerFilePath, snakeCaseKey, getColumnTypes, parseTableData, toSnakeCase, emptyObject, emptyArray, _queryHookAfterCreate, _queryHookAfterUpdate, getQueryAs, setQueryObjectValueImmutable, pushQueryOnForOuter, isExpression, cloneQueryBaseUnscoped, DynamicRawSQL, RawSql, getShapeFromSelect, _queryWhere, _queryDefaults, getPrimaryKeys, VirtualColumn,
|
|
1
|
+
import { makeColumnTypes, getStackTrace, applyMixins, QueryHooks, defaultSchemaConfig, raw, getCallerFilePath, snakeCaseKey, getColumnTypes, parseTableData, toSnakeCase, emptyObject, emptyArray, _queryHookAfterCreate, _queryHookAfterUpdate, getQueryAs, setQueryObjectValueImmutable, pushQueryOnForOuter, isExpression, cloneQueryBaseUnscoped, DynamicRawSQL, RawSql, getShapeFromSelect, _queryWhere, _queryDefaults, getPrimaryKeys, VirtualColumn, _prependWith, _queryCreate, _orCreate, getFreeAlias, _querySelect, _queryUpdate, _queryWhereIn, _appendQuery, isQueryReturnsAll, _queryUpsert, _queryDelete, noop, _queryFindBy, prepareSubQueryForSql, _clone, _queryUpdateOrThrow, _queryInsert, _queryCreateMany, OrchidOrmInternalError, toArray, objectHasValues, _queryJoinOn, _queryCreateManyFrom, NotFoundError, _queryFindByOptional, _queryRows, pick, _queryWhereExists, _queryTake, _queryTakeOptional, _initQueryBuilder, Db, getClonedQueryData } from 'pqb';
|
|
2
2
|
export * from 'pqb';
|
|
3
3
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
4
4
|
|
|
@@ -190,7 +190,7 @@ const hasRelationHandleUpdate = (q, set, key, primaryKeys, nestedUpdate) => {
|
|
|
190
190
|
);
|
|
191
191
|
});
|
|
192
192
|
};
|
|
193
|
-
const
|
|
193
|
+
const _selectIfNotSelected = (q, columns) => {
|
|
194
194
|
const select = q.q.select || [];
|
|
195
195
|
if (!select.includes("*")) {
|
|
196
196
|
for (const column of columns) {
|
|
@@ -286,6 +286,8 @@ const getColumnKeyFromDbName = (query, name) => {
|
|
|
286
286
|
}
|
|
287
287
|
return name;
|
|
288
288
|
};
|
|
289
|
+
const selectCteColumnsSql = (cteAs, columns) => `(SELECT ${columns.map((c) => `"${cteAs}"."${c}"`).join(", ")} FROM "${cteAs}")`;
|
|
290
|
+
const selectCteColumnSql = (cteAs, column) => `(SELECT "${cteAs}"."${column}" FROM "${cteAs}")`;
|
|
289
291
|
|
|
290
292
|
const joinQueryChainHOF = (relPKeys, reverseJoin, joinQuery) => (joiningQuery, baseQuery) => {
|
|
291
293
|
const jq = joiningQuery;
|
|
@@ -401,7 +403,7 @@ class BelongsToVirtualColumn extends VirtualColumn {
|
|
|
401
403
|
super(schema);
|
|
402
404
|
this.key = key;
|
|
403
405
|
this.state = state;
|
|
404
|
-
this.nestedUpdate = nestedUpdate$
|
|
406
|
+
this.nestedUpdate = nestedUpdate$2(this.state);
|
|
405
407
|
}
|
|
406
408
|
create(q, ctx, item) {
|
|
407
409
|
const {
|
|
@@ -415,18 +417,11 @@ class BelongsToVirtualColumn extends VirtualColumn {
|
|
|
415
417
|
}
|
|
416
418
|
const value = item[key];
|
|
417
419
|
if ("create" in value || "connectOrCreate" in value) {
|
|
418
|
-
|
|
420
|
+
const asFn = setForeignKeysFromCte(item, primaryKeys, foreignKeys);
|
|
419
421
|
const selectPKeys = query.select(...primaryKeys);
|
|
420
|
-
|
|
422
|
+
_prependWith(
|
|
421
423
|
q,
|
|
422
|
-
|
|
423
|
-
foreignKeys.forEach((foreignKey, i) => {
|
|
424
|
-
item[foreignKey]._sql = selectCteColumnSql(
|
|
425
|
-
as,
|
|
426
|
-
primaryKeys[i]
|
|
427
|
-
);
|
|
428
|
-
});
|
|
429
|
-
},
|
|
424
|
+
asFn,
|
|
430
425
|
"create" in value ? _queryCreate(selectPKeys, value.create) : _orCreate(
|
|
431
426
|
_queryWhere(selectPKeys, [
|
|
432
427
|
value.connectOrCreate.where
|
|
@@ -437,7 +432,7 @@ class BelongsToVirtualColumn extends VirtualColumn {
|
|
|
437
432
|
return;
|
|
438
433
|
} else if ("connect" in value) {
|
|
439
434
|
const as = getFreeAlias(q.q.withShapes, "q");
|
|
440
|
-
|
|
435
|
+
_prependWith(q, as, query.select(...primaryKeys).findBy(value.connect));
|
|
441
436
|
foreignKeys.map((foreignKey, i) => {
|
|
442
437
|
item[foreignKey] = new RawSql(
|
|
443
438
|
selectCteColumnMustExistSql(i, as, primaryKeys[i])
|
|
@@ -446,10 +441,10 @@ class BelongsToVirtualColumn extends VirtualColumn {
|
|
|
446
441
|
return;
|
|
447
442
|
}
|
|
448
443
|
}
|
|
449
|
-
update(q,
|
|
444
|
+
update(q, set) {
|
|
450
445
|
q.q.wrapInTransaction = true;
|
|
451
446
|
const data = set[this.key];
|
|
452
|
-
this.nestedUpdate(q, set, data
|
|
447
|
+
this.nestedUpdate(q, set, data);
|
|
453
448
|
}
|
|
454
449
|
}
|
|
455
450
|
const makeBelongsToMethod = (tableConfig, table, relation, relationName, query) => {
|
|
@@ -520,139 +515,138 @@ const makeBelongsToMethod = (tableConfig, table, relation, relationName, query)
|
|
|
520
515
|
reverseJoin
|
|
521
516
|
};
|
|
522
517
|
};
|
|
523
|
-
const nestedUpdate$
|
|
524
|
-
return (
|
|
525
|
-
if (params.
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
518
|
+
const nestedUpdate$2 = ({ query, primaryKeys, foreignKeys, len }) => {
|
|
519
|
+
return (self, update, params) => {
|
|
520
|
+
if (params.create) {
|
|
521
|
+
const createQuery = _querySelect(
|
|
522
|
+
_queryCreate(query.clone(), params.create),
|
|
523
|
+
primaryKeys
|
|
524
|
+
);
|
|
525
|
+
const asFn = setForeignKeysFromCte(update, primaryKeys, foreignKeys);
|
|
526
|
+
_prependWith(self, asFn, createQuery);
|
|
527
|
+
} else if (params.update) {
|
|
528
|
+
_selectIfNotSelected(self, foreignKeys);
|
|
529
|
+
const selectIdsSql = new RawSql("");
|
|
530
|
+
const updateQuery = _queryUpdate(
|
|
531
|
+
_queryWhereIn(query.clone(), true, primaryKeys, selectIdsSql),
|
|
532
|
+
params.update
|
|
533
|
+
);
|
|
534
|
+
updateQuery.q.returnType = "value";
|
|
535
|
+
_appendQuery(self, updateQuery, (as) => {
|
|
536
|
+
selectIdsSql._sql = selectCteColumnsSql(as, foreignKeys);
|
|
537
|
+
});
|
|
538
|
+
} else if (params.upsert) {
|
|
539
|
+
if (isQueryReturnsAll(self)) {
|
|
540
|
+
throw new Error("`upsert` option is not allowed in a batch update");
|
|
541
|
+
}
|
|
542
|
+
const { relQuery } = relWithSelectIds(
|
|
543
|
+
self,
|
|
544
|
+
query,
|
|
545
|
+
primaryKeys,
|
|
546
|
+
foreignKeys
|
|
547
|
+
);
|
|
548
|
+
const upsertQuery = _querySelect(
|
|
549
|
+
_queryUpsert(
|
|
550
|
+
relQuery,
|
|
551
|
+
params.upsert
|
|
552
|
+
),
|
|
553
|
+
primaryKeys
|
|
554
|
+
);
|
|
555
|
+
const asFn = setForeignKeysFromCte(update, primaryKeys, foreignKeys);
|
|
556
|
+
_prependWith(self, asFn, upsertQuery);
|
|
557
|
+
} else if (params.delete) {
|
|
558
|
+
_selectIfNotSelected(self, foreignKeys);
|
|
559
|
+
disconnect(update, foreignKeys);
|
|
560
|
+
const { selectIdsSql, relQuery } = relWithSelectIds(
|
|
561
|
+
self,
|
|
562
|
+
query,
|
|
563
|
+
primaryKeys,
|
|
564
|
+
foreignKeys
|
|
565
|
+
);
|
|
566
|
+
self.q.and = self.q.or = void 0;
|
|
567
|
+
_queryWhereIn(self, true, foreignKeys, selectIdsSql);
|
|
568
|
+
const deleteQuery = _queryDelete(relQuery);
|
|
569
|
+
deleteQuery.q.returnType = "value";
|
|
570
|
+
_appendQuery(self, deleteQuery, noop);
|
|
571
|
+
} else if (params.disconnect) {
|
|
572
|
+
disconnect(update, foreignKeys);
|
|
573
|
+
} else if (params.set) {
|
|
574
|
+
let loadPrimaryKeys;
|
|
575
|
+
let loadForeignKeys;
|
|
576
|
+
for (let i = 0; i < len; i++) {
|
|
577
|
+
const primaryKey = primaryKeys[i];
|
|
578
|
+
if (primaryKey in params.set) {
|
|
579
|
+
update[foreignKeys[i]] = params.set[primaryKey];
|
|
580
|
+
} else {
|
|
581
|
+
(loadPrimaryKeys ?? (loadPrimaryKeys = [])).push(primaryKey);
|
|
582
|
+
(loadForeignKeys ?? (loadForeignKeys = [])).push(foreignKeys[i]);
|
|
559
583
|
}
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
584
|
+
}
|
|
585
|
+
if (loadPrimaryKeys) {
|
|
586
|
+
const asFn = setForeignKeysFromCte(
|
|
587
|
+
update,
|
|
588
|
+
loadPrimaryKeys,
|
|
589
|
+
loadForeignKeys,
|
|
590
|
+
true
|
|
591
|
+
);
|
|
592
|
+
_prependWith(
|
|
593
|
+
self,
|
|
594
|
+
asFn,
|
|
595
|
+
_queryFindBy(query.select(...loadPrimaryKeys), params.set)
|
|
566
596
|
);
|
|
567
|
-
for (let i = 0; i < len; i++) {
|
|
568
|
-
update[foreignKeys[i]] = record[primaryKeys[i]];
|
|
569
|
-
}
|
|
570
|
-
} else if (params.delete) {
|
|
571
|
-
const selectQuery = q2.clone();
|
|
572
|
-
selectQuery.q.type = void 0;
|
|
573
|
-
selectQuery.q.distinct = emptyArray;
|
|
574
|
-
selectIfNotSelected(selectQuery, foreignKeys);
|
|
575
|
-
idsForDelete = await _queryRows(selectQuery);
|
|
576
|
-
for (const foreignKey of foreignKeys) {
|
|
577
|
-
update[foreignKey] = null;
|
|
578
|
-
}
|
|
579
597
|
}
|
|
580
|
-
});
|
|
581
|
-
const { upsert } = params;
|
|
582
|
-
if (upsert || params.update || params.delete) {
|
|
583
|
-
selectIfNotSelected(q, foreignKeys);
|
|
584
|
-
}
|
|
585
|
-
if (upsert) {
|
|
586
|
-
(state.queries ?? (state.queries = [])).push(async (queryResult) => {
|
|
587
|
-
const row = queryResult.rows[0];
|
|
588
|
-
let obj = {};
|
|
589
|
-
for (let i = 0; i < len; i++) {
|
|
590
|
-
const id = row[foreignKeys[i]];
|
|
591
|
-
if (id === null) {
|
|
592
|
-
obj = void 0;
|
|
593
|
-
break;
|
|
594
|
-
}
|
|
595
|
-
obj[primaryKeys[i]] = id;
|
|
596
|
-
}
|
|
597
|
-
const count = obj ? await _queryUpdate(
|
|
598
|
-
query.findBy(obj),
|
|
599
|
-
upsert.update
|
|
600
|
-
) : 0;
|
|
601
|
-
if (!count) {
|
|
602
|
-
const data = typeof upsert.create === "function" ? upsert.create() : upsert.create;
|
|
603
|
-
const result = await _queryCreate(
|
|
604
|
-
query.select(...primaryKeys),
|
|
605
|
-
data
|
|
606
|
-
);
|
|
607
|
-
const collectData = {};
|
|
608
|
-
state.collect = {
|
|
609
|
-
data: collectData
|
|
610
|
-
};
|
|
611
|
-
for (let i = 0; i < len; i++) {
|
|
612
|
-
collectData[foreignKeys[i]] = result[primaryKeys[i]];
|
|
613
|
-
}
|
|
614
|
-
}
|
|
615
|
-
});
|
|
616
|
-
} else if (params.delete || params.update) {
|
|
617
|
-
_queryHookAfterUpdate(
|
|
618
|
-
q,
|
|
619
|
-
params.update ? foreignKeys : emptyArray,
|
|
620
|
-
async (data) => {
|
|
621
|
-
let ids;
|
|
622
|
-
if (params.delete) {
|
|
623
|
-
ids = idsForDelete;
|
|
624
|
-
} else {
|
|
625
|
-
ids = [];
|
|
626
|
-
for (const item of data) {
|
|
627
|
-
let row;
|
|
628
|
-
for (const foreignKey of foreignKeys) {
|
|
629
|
-
const id = item[foreignKey];
|
|
630
|
-
if (id === null) {
|
|
631
|
-
row = void 0;
|
|
632
|
-
break;
|
|
633
|
-
} else {
|
|
634
|
-
(row ?? (row = [])).push(id);
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
if (row) ids.push(row);
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
if (!ids?.length) return;
|
|
641
|
-
const t = query.whereIn(
|
|
642
|
-
primaryKeys,
|
|
643
|
-
ids
|
|
644
|
-
);
|
|
645
|
-
if (params.delete) {
|
|
646
|
-
await _queryDelete(t);
|
|
647
|
-
} else {
|
|
648
|
-
await _queryUpdate(t, params.update);
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
);
|
|
652
598
|
}
|
|
653
599
|
};
|
|
654
600
|
};
|
|
655
|
-
const
|
|
601
|
+
const disconnect = (update, foreignKeys) => {
|
|
602
|
+
for (const foreignKey of foreignKeys) {
|
|
603
|
+
update[foreignKey] = null;
|
|
604
|
+
}
|
|
605
|
+
};
|
|
606
|
+
const relWithSelectIds = (self, rel, primaryKeys, foreignKeys) => {
|
|
607
|
+
const selectIdsQuery = makeSelectIdsQuery(self, foreignKeys);
|
|
608
|
+
const selectIdsSql = new RawSql("");
|
|
609
|
+
_prependWith(
|
|
610
|
+
self,
|
|
611
|
+
(as) => {
|
|
612
|
+
selectIdsSql._sql = selectCteColumnsSql(as, foreignKeys);
|
|
613
|
+
},
|
|
614
|
+
selectIdsQuery
|
|
615
|
+
);
|
|
616
|
+
return {
|
|
617
|
+
selectIdsSql,
|
|
618
|
+
relQuery: _queryWhereIn(rel.clone(), true, primaryKeys, selectIdsSql)
|
|
619
|
+
};
|
|
620
|
+
};
|
|
621
|
+
const makeSelectIdsQuery = (self, foreignKeys) => {
|
|
622
|
+
const selectIdsQuery = self.baseQuery.clone();
|
|
623
|
+
selectIdsQuery.q.distinct = emptyArray;
|
|
624
|
+
selectIdsQuery.q.select = foreignKeys;
|
|
625
|
+
selectIdsQuery.q.and = self.q.and;
|
|
626
|
+
selectIdsQuery.q.or = self.q.or;
|
|
627
|
+
return selectIdsQuery;
|
|
628
|
+
};
|
|
629
|
+
const setForeignKeysFromCte = (record, primaryKeys, foreignKeys, mustExist) => {
|
|
630
|
+
for (const key of foreignKeys) {
|
|
631
|
+
record[key] = new RawSql("");
|
|
632
|
+
}
|
|
633
|
+
return (as) => {
|
|
634
|
+
foreignKeys.forEach(
|
|
635
|
+
mustExist ? (foreignKey, i) => {
|
|
636
|
+
record[foreignKey]._sql = selectCteColumnMustExistSql(
|
|
637
|
+
i,
|
|
638
|
+
as,
|
|
639
|
+
primaryKeys[i]
|
|
640
|
+
);
|
|
641
|
+
} : (foreignKey, i) => {
|
|
642
|
+
record[foreignKey]._sql = selectCteColumnSql(
|
|
643
|
+
as,
|
|
644
|
+
primaryKeys[i]
|
|
645
|
+
);
|
|
646
|
+
}
|
|
647
|
+
);
|
|
648
|
+
};
|
|
649
|
+
};
|
|
656
650
|
const selectCteColumnMustExistSql = (i, cteAs, column) => {
|
|
657
651
|
const selectColumn = selectCteColumnSql(cteAs, column);
|
|
658
652
|
return i === 0 ? `CASE WHEN (SELECT count(*) FROM "${cteAs}") = 0 AND (SELECT 'not-found')::int = 0 THEN NULL ELSE ${selectColumn} END` : selectColumn;
|
|
@@ -664,32 +658,107 @@ class HasOneVirtualColumn extends VirtualColumn {
|
|
|
664
658
|
this.key = key;
|
|
665
659
|
this.state = state;
|
|
666
660
|
this.nestedInsert = nestedInsert$2(state);
|
|
667
|
-
this.
|
|
661
|
+
this.setNulls = {};
|
|
662
|
+
for (const foreignKey of state.foreignKeys) {
|
|
663
|
+
this.setNulls[foreignKey] = null;
|
|
664
|
+
}
|
|
668
665
|
}
|
|
669
|
-
create(
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
this.
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
666
|
+
create(self, ctx, item, rowIndex, one) {
|
|
667
|
+
if (one) {
|
|
668
|
+
const value = item[this.key];
|
|
669
|
+
if (!value.create && !value.connect && !value.connectOrCreate) {
|
|
670
|
+
return;
|
|
671
|
+
}
|
|
672
|
+
const { query: rel, primaryKeys, foreignKeys } = this.state;
|
|
673
|
+
_selectIfNotSelected(self, primaryKeys);
|
|
674
|
+
const data = value.create ? { ...value.create } : {};
|
|
675
|
+
foreignKeys.forEach((key) => {
|
|
676
|
+
data[key] = new RawSql("");
|
|
677
|
+
});
|
|
678
|
+
const query = value.create ? _queryCreate(_clone(rel), data) : value.connect ? _queryUpdateOrThrow(
|
|
679
|
+
rel.where(value.connect),
|
|
680
|
+
data
|
|
681
|
+
) : value.connectOrCreate ? _queryUpsert(rel.where(value.connectOrCreate.where), {
|
|
682
|
+
update: data,
|
|
683
|
+
create: {
|
|
684
|
+
...value.connectOrCreate.create,
|
|
685
|
+
...data
|
|
686
|
+
}
|
|
687
|
+
}) : void 0;
|
|
688
|
+
_appendQuery(self, query, (as) => {
|
|
689
|
+
foreignKeys.forEach((key, i) => {
|
|
690
|
+
data[key]._sql = selectCteColumnSql(as, primaryKeys[i]);
|
|
691
|
+
});
|
|
692
|
+
});
|
|
693
|
+
} else {
|
|
694
|
+
hasRelationHandleCreate(
|
|
695
|
+
self,
|
|
696
|
+
ctx,
|
|
697
|
+
item,
|
|
698
|
+
rowIndex,
|
|
699
|
+
this.key,
|
|
700
|
+
this.state.primaryKeys,
|
|
701
|
+
this.nestedInsert
|
|
702
|
+
);
|
|
703
|
+
}
|
|
679
704
|
}
|
|
680
|
-
update(
|
|
705
|
+
update(self, set) {
|
|
681
706
|
const params = set[this.key];
|
|
682
|
-
if ((params.set || params.create || params.upsert) && isQueryReturnsAll(
|
|
707
|
+
if ((params.set || params.create || params.upsert) && isQueryReturnsAll(self)) {
|
|
683
708
|
const key = params.set ? "set" : params.create ? "create" : "upsert";
|
|
684
709
|
throw new Error(`\`${key}\` option is not allowed in a batch update`);
|
|
685
710
|
}
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
711
|
+
const { primaryKeys, foreignKeys, query: relQuery } = this.state;
|
|
712
|
+
if (params.create || params.update || params.upsert || params.disconnect || params.set || params.delete) {
|
|
713
|
+
_selectIfNotSelected(self, primaryKeys);
|
|
714
|
+
const selectIdsSql = new RawSql("");
|
|
715
|
+
const existingRelQuery = _queryWhereIn(
|
|
716
|
+
_clone(relQuery),
|
|
717
|
+
true,
|
|
718
|
+
foreignKeys,
|
|
719
|
+
selectIdsSql
|
|
720
|
+
);
|
|
721
|
+
let setIds = void 0;
|
|
722
|
+
if (params.create || params.set || params.upsert) {
|
|
723
|
+
setIds = {};
|
|
724
|
+
foreignKeys.forEach((foreignKey) => {
|
|
725
|
+
setIds[foreignKey] = new RawSql("");
|
|
726
|
+
});
|
|
727
|
+
}
|
|
728
|
+
const nullifyOrDeleteQuery = params.update ? _queryUpdate(existingRelQuery, params.update) : params.upsert ? _queryUpsert(existingRelQuery, {
|
|
729
|
+
update: params.upsert.update,
|
|
730
|
+
create: {
|
|
731
|
+
...typeof params.upsert.create === "function" ? params.upsert.create() : params.upsert.create,
|
|
732
|
+
...setIds
|
|
733
|
+
}
|
|
734
|
+
}) : params.delete ? _queryDelete(existingRelQuery) : _queryUpdate(existingRelQuery, this.setNulls);
|
|
735
|
+
nullifyOrDeleteQuery.q.returnType = "void";
|
|
736
|
+
_appendQuery(self, nullifyOrDeleteQuery, (as) => {
|
|
737
|
+
selectIdsSql._sql = selectCteColumnsSql(as, primaryKeys);
|
|
738
|
+
if (params.create || params.set || params.upsert) {
|
|
739
|
+
foreignKeys.forEach((foreignKey, i) => {
|
|
740
|
+
setIds[foreignKey]._sql = selectCteColumnSql(
|
|
741
|
+
as,
|
|
742
|
+
primaryKeys[i]
|
|
743
|
+
);
|
|
744
|
+
});
|
|
745
|
+
}
|
|
746
|
+
});
|
|
747
|
+
if (params.create) {
|
|
748
|
+
const createQuery = _queryInsert(_clone(relQuery), {
|
|
749
|
+
...params.create,
|
|
750
|
+
...setIds
|
|
751
|
+
});
|
|
752
|
+
_appendQuery(self, createQuery, noop);
|
|
753
|
+
} else if (params.set) {
|
|
754
|
+
const setQuery = _queryUpdate(
|
|
755
|
+
_queryWhere(_clone(relQuery), [params.set]),
|
|
756
|
+
setIds
|
|
757
|
+
);
|
|
758
|
+
setQuery.q.returnType = "void";
|
|
759
|
+
_appendQuery(self, setQuery, noop);
|
|
760
|
+
}
|
|
761
|
+
}
|
|
693
762
|
}
|
|
694
763
|
}
|
|
695
764
|
const makeHasOneMethod = (tableConfig, table, relation, relationName, query) => {
|
|
@@ -817,9 +886,9 @@ const nestedInsert$2 = ({ query, primaryKeys, foreignKeys }) => {
|
|
|
817
886
|
for (let i = 0, len = items.length; i < len; i++) {
|
|
818
887
|
const [selfData, item] = items[i];
|
|
819
888
|
const data2 = {};
|
|
820
|
-
|
|
821
|
-
data2[foreignKeys[i2]] = selfData[
|
|
822
|
-
}
|
|
889
|
+
primaryKeys.forEach((primaryKey, i2) => {
|
|
890
|
+
data2[foreignKeys[i2]] = selfData[primaryKey];
|
|
891
|
+
});
|
|
823
892
|
items[i] = "connect" in item ? _queryUpdateOrThrow(
|
|
824
893
|
t.where(item.connect),
|
|
825
894
|
data2
|
|
@@ -860,78 +929,6 @@ const nestedInsert$2 = ({ query, primaryKeys, foreignKeys }) => {
|
|
|
860
929
|
}
|
|
861
930
|
};
|
|
862
931
|
};
|
|
863
|
-
const nestedUpdate$2 = ({ query, primaryKeys, foreignKeys }) => {
|
|
864
|
-
const len = primaryKeys.length;
|
|
865
|
-
const setNulls = {};
|
|
866
|
-
for (const foreignKey of foreignKeys) {
|
|
867
|
-
setNulls[foreignKey] = null;
|
|
868
|
-
}
|
|
869
|
-
return async (_, data, params) => {
|
|
870
|
-
const t = query.clone();
|
|
871
|
-
const ids = data.map(
|
|
872
|
-
(item) => primaryKeys.map((primaryKey) => item[primaryKey])
|
|
873
|
-
);
|
|
874
|
-
const currentRelationsQuery = t.whereIn(
|
|
875
|
-
foreignKeys,
|
|
876
|
-
ids
|
|
877
|
-
);
|
|
878
|
-
if (params.create || params.disconnect || params.set) {
|
|
879
|
-
let queryToDisconnect = currentRelationsQuery;
|
|
880
|
-
if (params.set) {
|
|
881
|
-
queryToDisconnect = queryToDisconnect.whereNot(params.set);
|
|
882
|
-
}
|
|
883
|
-
await _queryUpdate(queryToDisconnect, setNulls);
|
|
884
|
-
const record = data[0];
|
|
885
|
-
if (params.create) {
|
|
886
|
-
const obj = { ...params.create };
|
|
887
|
-
for (let i = 0; i < len; i++) {
|
|
888
|
-
obj[foreignKeys[i]] = record[primaryKeys[i]];
|
|
889
|
-
}
|
|
890
|
-
await t.insert(obj);
|
|
891
|
-
}
|
|
892
|
-
if (params.set) {
|
|
893
|
-
const obj = {};
|
|
894
|
-
for (let i = 0; i < len; i++) {
|
|
895
|
-
obj[foreignKeys[i]] = record[primaryKeys[i]];
|
|
896
|
-
}
|
|
897
|
-
await _queryUpdate(
|
|
898
|
-
_queryWhere(t, [params.set]),
|
|
899
|
-
obj
|
|
900
|
-
);
|
|
901
|
-
}
|
|
902
|
-
} else if (params.update) {
|
|
903
|
-
await _queryUpdate(currentRelationsQuery, params.update);
|
|
904
|
-
} else if (params.delete) {
|
|
905
|
-
const q = _queryDelete(currentRelationsQuery);
|
|
906
|
-
q.q.returnType = "value";
|
|
907
|
-
await q;
|
|
908
|
-
} else if (params.upsert) {
|
|
909
|
-
const { update, create } = params.upsert;
|
|
910
|
-
currentRelationsQuery.q.select = foreignKeys;
|
|
911
|
-
const updatedIds = await _queryUpdate(
|
|
912
|
-
_queryRows(currentRelationsQuery),
|
|
913
|
-
update
|
|
914
|
-
);
|
|
915
|
-
if (updatedIds.length < ids.length) {
|
|
916
|
-
const data2 = typeof create === "function" ? create() : create;
|
|
917
|
-
await t.createMany(
|
|
918
|
-
ids.reduce((rows, ids2) => {
|
|
919
|
-
if (!updatedIds.some(
|
|
920
|
-
(updated) => updated.every((value, i) => value === ids2[i])
|
|
921
|
-
)) {
|
|
922
|
-
const obj = { ...data2 };
|
|
923
|
-
for (let i = 0; i < len; i++) {
|
|
924
|
-
obj[foreignKeys[i]] = ids2[i];
|
|
925
|
-
}
|
|
926
|
-
rows.push(obj);
|
|
927
|
-
}
|
|
928
|
-
return rows;
|
|
929
|
-
}, [])
|
|
930
|
-
);
|
|
931
|
-
}
|
|
932
|
-
}
|
|
933
|
-
};
|
|
934
|
-
};
|
|
935
932
|
|
|
936
933
|
class HasManyVirtualColumn extends VirtualColumn {
|
|
937
934
|
constructor(schema, key, state) {
|
|
@@ -952,7 +949,7 @@ class HasManyVirtualColumn extends VirtualColumn {
|
|
|
952
949
|
this.nestedInsert
|
|
953
950
|
);
|
|
954
951
|
}
|
|
955
|
-
update(q,
|
|
952
|
+
update(q, set) {
|
|
956
953
|
const params = set[this.key];
|
|
957
954
|
if ((params.set || params.create) && isQueryReturnsAll(q)) {
|
|
958
955
|
const key = params.set ? "set" : "create";
|
|
@@ -1295,7 +1292,7 @@ class HasAndBelongsToManyVirtualColumn extends VirtualColumn {
|
|
|
1295
1292
|
this.nestedInsert
|
|
1296
1293
|
);
|
|
1297
1294
|
}
|
|
1298
|
-
update(q,
|
|
1295
|
+
update(q, set) {
|
|
1299
1296
|
hasRelationHandleUpdate(
|
|
1300
1297
|
q,
|
|
1301
1298
|
set,
|