joist-orm 0.1.538 → 1.0.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/build/{BaseEntity.d.ts → src/BaseEntity.d.ts} +2 -1
- package/build/{BaseEntity.js → src/BaseEntity.js} +13 -9
- package/build/src/BaseEntity.js.map +1 -0
- package/build/{EntityManager.d.ts → src/EntityManager.d.ts} +139 -110
- package/build/{EntityManager.js → src/EntityManager.js} +281 -262
- package/build/src/EntityManager.js.map +1 -0
- package/build/{QueryBuilder.d.ts → src/QueryBuilder.d.ts} +53 -3
- package/build/src/QueryBuilder.js +341 -0
- package/build/src/QueryBuilder.js.map +1 -0
- package/build/src/Todo.d.ts +25 -0
- package/build/src/Todo.js +52 -0
- package/build/src/Todo.js.map +1 -0
- package/build/src/changes.d.ts +34 -0
- package/build/src/changes.js +37 -0
- package/build/src/changes.js.map +1 -0
- package/build/src/config.d.ts +43 -0
- package/build/src/config.js +114 -0
- package/build/src/config.js.map +1 -0
- package/build/{createOrUpdatePartial.d.ts → src/createOrUpdatePartial.d.ts} +2 -1
- package/build/{createOrUpdatePartial.js → src/createOrUpdatePartial.js} +42 -10
- package/build/src/createOrUpdatePartial.js.map +1 -0
- package/build/src/dataloaders/findDataLoader.d.ts +5 -0
- package/build/src/dataloaders/findDataLoader.js +28 -0
- package/build/src/dataloaders/findDataLoader.js.map +1 -0
- package/build/src/dataloaders/loadDataLoader.d.ts +3 -0
- package/build/src/dataloaders/loadDataLoader.js +37 -0
- package/build/src/dataloaders/loadDataLoader.js.map +1 -0
- package/build/src/dataloaders/manyToManyDataLoader.d.ts +5 -0
- package/build/src/dataloaders/manyToManyDataLoader.js +78 -0
- package/build/src/dataloaders/manyToManyDataLoader.js.map +1 -0
- package/build/src/dataloaders/manyToManyFindDataLoader.d.ts +5 -0
- package/build/src/dataloaders/manyToManyFindDataLoader.js +33 -0
- package/build/src/dataloaders/manyToManyFindDataLoader.js.map +1 -0
- package/build/src/dataloaders/oneToManyDataLoader.d.ts +4 -0
- package/build/src/dataloaders/oneToManyDataLoader.js +40 -0
- package/build/src/dataloaders/oneToManyDataLoader.js.map +1 -0
- package/build/src/dataloaders/oneToManyFindDataLoader.d.ts +5 -0
- package/build/src/dataloaders/oneToManyFindDataLoader.js +32 -0
- package/build/src/dataloaders/oneToManyFindDataLoader.js.map +1 -0
- package/build/src/dataloaders/oneToOneDataLoader.d.ts +4 -0
- package/build/src/dataloaders/oneToOneDataLoader.js +40 -0
- package/build/src/dataloaders/oneToOneDataLoader.js.map +1 -0
- package/build/src/drivers/IdAssigner.d.ts +33 -0
- package/build/src/drivers/IdAssigner.js +106 -0
- package/build/src/drivers/IdAssigner.js.map +1 -0
- package/build/src/drivers/InMemoryDriver.d.ts +29 -0
- package/build/src/drivers/InMemoryDriver.js +306 -0
- package/build/src/drivers/InMemoryDriver.js.map +1 -0
- package/build/src/drivers/PostgresDriver.d.ts +40 -0
- package/build/src/drivers/PostgresDriver.js +376 -0
- package/build/src/drivers/PostgresDriver.js.map +1 -0
- package/build/src/drivers/driver.d.ts +23 -0
- package/build/src/drivers/driver.js +3 -0
- package/build/src/drivers/driver.js.map +1 -0
- package/build/src/drivers/index.d.ts +4 -0
- package/build/src/drivers/index.js +17 -0
- package/build/src/drivers/index.js.map +1 -0
- package/build/{getProperties.d.ts → src/getProperties.d.ts} +0 -0
- package/build/{getProperties.js → src/getProperties.js} +1 -1
- package/build/src/getProperties.js.map +1 -0
- package/build/src/index.d.ts +62 -0
- package/build/src/index.js +263 -0
- package/build/src/index.js.map +1 -0
- package/build/src/keys.d.ts +30 -0
- package/build/{keys.js → src/keys.js} +48 -16
- package/build/src/keys.js.map +1 -0
- package/build/{loadLens.d.ts → src/loadLens.d.ts} +2 -2
- package/build/{loadLens.js → src/loadLens.js} +1 -1
- package/build/src/loadLens.js.map +1 -0
- package/build/src/loaded.d.ts +49 -0
- package/build/src/loaded.js +9 -0
- package/build/src/loaded.js.map +1 -0
- package/build/{newTestInstance.d.ts → src/newTestInstance.d.ts} +37 -3
- package/build/src/newTestInstance.js +342 -0
- package/build/src/newTestInstance.js.map +1 -0
- package/build/{collections → src/relations}/AbstractRelationImpl.d.ts +6 -5
- package/build/{collections → src/relations}/AbstractRelationImpl.js +0 -0
- package/build/src/relations/AbstractRelationImpl.js.map +1 -0
- package/build/src/relations/Collection.d.ts +26 -0
- package/build/src/relations/Collection.js +19 -0
- package/build/src/relations/Collection.js.map +1 -0
- package/build/{collections → src/relations}/CustomCollection.d.ts +6 -2
- package/build/{collections → src/relations}/CustomCollection.js +17 -9
- package/build/src/relations/CustomCollection.js.map +1 -0
- package/build/{collections → src/relations}/CustomReference.d.ts +7 -2
- package/build/{collections → src/relations}/CustomReference.js +16 -9
- package/build/src/relations/CustomReference.js.map +1 -0
- package/build/src/relations/LargeCollection.d.ts +17 -0
- package/build/src/relations/LargeCollection.js +3 -0
- package/build/src/relations/LargeCollection.js.map +1 -0
- package/build/{collections → src/relations}/ManyToManyCollection.d.ts +9 -2
- package/build/src/relations/ManyToManyCollection.js +249 -0
- package/build/src/relations/ManyToManyCollection.js.map +1 -0
- package/build/src/relations/ManyToManyLargeCollection.d.ts +25 -0
- package/build/src/relations/ManyToManyLargeCollection.js +97 -0
- package/build/src/relations/ManyToManyLargeCollection.js.map +1 -0
- package/build/src/relations/ManyToOneReference.d.ts +77 -0
- package/build/{collections → src/relations}/ManyToOneReference.js +101 -48
- package/build/src/relations/ManyToOneReference.js.map +1 -0
- package/build/{collections → src/relations}/OneToManyCollection.d.ts +10 -2
- package/build/{collections → src/relations}/OneToManyCollection.js +54 -59
- package/build/src/relations/OneToManyCollection.js.map +1 -0
- package/build/src/relations/OneToManyLargeCollection.d.ts +25 -0
- package/build/src/relations/OneToManyLargeCollection.js +83 -0
- package/build/src/relations/OneToManyLargeCollection.js.map +1 -0
- package/build/src/relations/OneToOneReference.d.ts +82 -0
- package/build/src/relations/OneToOneReference.js +168 -0
- package/build/src/relations/OneToOneReference.js.map +1 -0
- package/build/src/relations/PolymorphicReference.d.ts +69 -0
- package/build/src/relations/PolymorphicReference.js +210 -0
- package/build/src/relations/PolymorphicReference.js.map +1 -0
- package/build/src/relations/Reference.d.ts +29 -0
- package/build/src/relations/Reference.js +23 -0
- package/build/src/relations/Reference.js.map +1 -0
- package/build/src/relations/Relation.d.ts +10 -0
- package/build/src/relations/Relation.js +13 -0
- package/build/src/relations/Relation.js.map +1 -0
- package/build/src/relations/hasAsyncProperty.d.ts +36 -0
- package/build/src/relations/hasAsyncProperty.js +55 -0
- package/build/src/relations/hasAsyncProperty.js.map +1 -0
- package/build/{collections → src/relations}/hasManyDerived.d.ts +2 -1
- package/build/{collections → src/relations}/hasManyDerived.js +1 -1
- package/build/src/relations/hasManyDerived.js.map +1 -0
- package/build/{collections → src/relations}/hasManyThrough.d.ts +0 -0
- package/build/{collections → src/relations}/hasManyThrough.js +2 -2
- package/build/src/relations/hasManyThrough.js.map +1 -0
- package/build/{collections → src/relations}/hasOneDerived.d.ts +3 -2
- package/build/{collections → src/relations}/hasOneDerived.js +1 -1
- package/build/src/relations/hasOneDerived.js.map +1 -0
- package/build/{collections → src/relations}/hasOneThrough.d.ts +0 -0
- package/build/{collections → src/relations}/hasOneThrough.js +2 -2
- package/build/src/relations/hasOneThrough.js.map +1 -0
- package/build/src/relations/index.d.ts +18 -0
- package/build/src/relations/index.js +53 -0
- package/build/src/relations/index.js.map +1 -0
- package/build/{reverseHint.d.ts → src/reverseHint.d.ts} +2 -1
- package/build/{reverseHint.js → src/reverseHint.js} +13 -9
- package/build/src/reverseHint.js.map +1 -0
- package/build/src/rules.d.ts +23 -0
- package/build/src/rules.js +23 -0
- package/build/src/rules.js.map +1 -0
- package/build/src/serde.d.ts +121 -0
- package/build/src/serde.js +190 -0
- package/build/src/serde.js.map +1 -0
- package/build/{utils.d.ts → src/utils.d.ts} +2 -0
- package/build/{utils.js → src/utils.js} +10 -1
- package/build/src/utils.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/package.json +30 -15
- package/build/BaseEntity.js.map +0 -1
- package/build/EntityManager.js.map +0 -1
- package/build/EntityPersister.d.ts +0 -30
- package/build/EntityPersister.js +0 -197
- package/build/EntityPersister.js.map +0 -1
- package/build/QueryBuilder.js +0 -195
- package/build/QueryBuilder.js.map +0 -1
- package/build/changes.d.ts +0 -23
- package/build/changes.js +0 -14
- package/build/changes.js.map +0 -1
- package/build/collections/AbstractRelationImpl.js.map +0 -1
- package/build/collections/CustomCollection.js.map +0 -1
- package/build/collections/CustomReference.js.map +0 -1
- package/build/collections/ManyToManyCollection.js +0 -288
- package/build/collections/ManyToManyCollection.js.map +0 -1
- package/build/collections/ManyToOneReference.d.ts +0 -50
- package/build/collections/ManyToOneReference.js.map +0 -1
- package/build/collections/OneToManyCollection.js.map +0 -1
- package/build/collections/OneToOneReference.d.ts +0 -51
- package/build/collections/OneToOneReference.js +0 -132
- package/build/collections/OneToOneReference.js.map +0 -1
- package/build/collections/hasManyDerived.js.map +0 -1
- package/build/collections/hasManyThrough.js.map +0 -1
- package/build/collections/hasOneDerived.js.map +0 -1
- package/build/collections/hasOneThrough.js.map +0 -1
- package/build/collections/index.d.ts +0 -19
- package/build/collections/index.js +0 -49
- package/build/collections/index.js.map +0 -1
- package/build/createOrUpdatePartial.js.map +0 -1
- package/build/getProperties.js.map +0 -1
- package/build/index.d.ts +0 -140
- package/build/index.js +0 -278
- package/build/index.js.map +0 -1
- package/build/keys.d.ts +0 -21
- package/build/keys.js.map +0 -1
- package/build/loadLens.js.map +0 -1
- package/build/newTestInstance.js +0 -153
- package/build/newTestInstance.js.map +0 -1
- package/build/reverseHint.js.map +0 -1
- package/build/serde.d.ts +0 -47
- package/build/serde.js +0 -93
- package/build/serde.js.map +0 -1
- package/build/utils.js.map +0 -1
- package/package.json.bak +0 -27
- package/src/BaseEntity.ts +0 -104
- package/src/EntityManager.ts +0 -1263
- package/src/EntityPersister.ts +0 -240
- package/src/QueryBuilder.ts +0 -289
- package/src/changes.ts +0 -40
- package/src/collections/AbstractRelationImpl.ts +0 -28
- package/src/collections/CustomCollection.ts +0 -152
- package/src/collections/CustomReference.ts +0 -138
- package/src/collections/ManyToManyCollection.ts +0 -346
- package/src/collections/ManyToOneReference.ts +0 -215
- package/src/collections/OneToManyCollection.ts +0 -254
- package/src/collections/OneToOneReference.ts +0 -153
- package/src/collections/hasManyDerived.ts +0 -29
- package/src/collections/hasManyThrough.ts +0 -20
- package/src/collections/hasOneDerived.ts +0 -26
- package/src/collections/hasOneThrough.ts +0 -20
- package/src/collections/index.ts +0 -74
- package/src/createOrUpdatePartial.ts +0 -144
- package/src/getProperties.ts +0 -27
- package/src/index.ts +0 -400
- package/src/keys.ts +0 -75
- package/src/loadLens.ts +0 -126
- package/src/newTestInstance.ts +0 -205
- package/src/reverseHint.ts +0 -43
- package/src/serde.ts +0 -97
- package/src/utils.ts +0 -63
- package/tsconfig.json +0 -21
- package/tsconfig.tsbuildinfo +0 -2646
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneToManyDataLoader.js","sourceRoot":"","sources":["../../../src/dataloaders/oneToManyDataLoader.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAoC;AAEpC,oCAAwG;AACxG,oCAA6C;AAE7C,SAAgB,mBAAmB,CACjC,EAAiB,EACjB,UAAqC;IAErC,2DAA2D;IAC3D,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC;IACvC,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;IACpD,OAAO,IAAA,gBAAQ,EAAC,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE;QAC/C,OAAO,IAAI,oBAAU,CAAc,KAAK,EAAE,KAAK,EAAE,EAAE;YACjD,MAAM,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC;YAEjC,IAAA,0BAAkB,EAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAA,gBAAQ,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAEnC,MAAM,EAAE,EAAE,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YAEjE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAClG,sCAAsC;YAEtC,MAAM,QAAQ,GAAG,IAAA,eAAO,EAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC5C,wEAAwE;gBACxE,MAAM,OAAO,GAAG,IAAA,iCAAyB,EAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;gBACxF,yFAAyF;gBACzF,uFAAuF;gBACvF,0FAA0F;gBAC1F,sFAAsF;gBACtF,0FAA0F;gBAC1F,qFAAqF;gBACrF,eAAe;gBACf,OAAO,OAAO,IAAI,oBAAoB,CAAC;YACzC,CAAC,CAAC,CAAC;YACH,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAnCD,kDAmCC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import DataLoader from "dataloader";
|
|
2
|
+
import { Entity, EntityManager } from "../EntityManager";
|
|
3
|
+
import { OneToManyCollection, OneToManyLargeCollection } from "../index";
|
|
4
|
+
/** Batches o2m.find/include calls (i.e. that don't fully load the o2m relation). */
|
|
5
|
+
export declare function oneToManyFindDataLoader<T extends Entity, U extends Entity>(em: EntityManager, collection: OneToManyCollection<T, U> | OneToManyLargeCollection<T, U>): DataLoader<string, U | undefined>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.oneToManyFindDataLoader = void 0;
|
|
7
|
+
const dataloader_1 = __importDefault(require("dataloader"));
|
|
8
|
+
const utils_1 = require("../utils");
|
|
9
|
+
/** Batches o2m.find/include calls (i.e. that don't fully load the o2m relation). */
|
|
10
|
+
function oneToManyFindDataLoader(em, collection) {
|
|
11
|
+
const { meta, fieldName } = collection;
|
|
12
|
+
const loaderName = `find-${meta.tableName}.${collection.fieldName}`;
|
|
13
|
+
return (0, utils_1.getOrSet)(em.loadLoaders, loaderName, () => {
|
|
14
|
+
return new dataloader_1.default(async (keys) => {
|
|
15
|
+
const { em } = collection.entity;
|
|
16
|
+
const rows = await em.driver.findOneToMany(em, collection, keys);
|
|
17
|
+
const entities = rows.map((row) => em.hydrate(collection.otherMeta.cstr, row, { overwriteExisting: false }));
|
|
18
|
+
// Decode `id=b:1,author_id=a:1`
|
|
19
|
+
return keys.map((k) => {
|
|
20
|
+
const [otherKey, parentKey] = k.split(",");
|
|
21
|
+
const [, otherId] = otherKey.split("=");
|
|
22
|
+
const [, parentId] = parentKey.split("=");
|
|
23
|
+
const other = em.getEntity(otherId);
|
|
24
|
+
// We have may fetched `other` for a different parent in our batch
|
|
25
|
+
const isMine = other?.[collection.otherFieldName].id === parentId;
|
|
26
|
+
return isMine ? other : undefined;
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
exports.oneToManyFindDataLoader = oneToManyFindDataLoader;
|
|
32
|
+
//# sourceMappingURL=oneToManyFindDataLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneToManyFindDataLoader.js","sourceRoot":"","sources":["../../../src/dataloaders/oneToManyFindDataLoader.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAoC;AAGpC,oCAAoC;AAEpC,oFAAoF;AACpF,SAAgB,uBAAuB,CACrC,EAAiB,EACjB,UAAsE;IAEtE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC;IACvC,MAAM,UAAU,GAAG,QAAQ,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;IACpE,OAAO,IAAA,gBAAQ,EAAC,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE;QAC/C,OAAO,IAAI,oBAAU,CAAwB,KAAK,EAAE,IAAI,EAAE,EAAE;YAC1D,MAAM,EAAE,EAAE,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAC7G,gCAAgC;YAChC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACpB,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC3C,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACxC,MAAM,CAAC,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC1C,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,OAAkB,CAAC,CAAC;gBAC/C,kEAAkE;gBAClE,MAAM,MAAM,GAAI,KAAa,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC;gBAC3E,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YACpC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAvBD,0DAuBC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import DataLoader from "dataloader";
|
|
2
|
+
import { Entity, EntityManager } from "../EntityManager";
|
|
3
|
+
import { OneToOneReferenceImpl } from "../relations/OneToOneReference";
|
|
4
|
+
export declare function oneToOneDataLoader<T extends Entity, U extends Entity>(em: EntityManager, reference: OneToOneReferenceImpl<T, U>): DataLoader<string, U | undefined>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.oneToOneDataLoader = void 0;
|
|
7
|
+
const dataloader_1 = __importDefault(require("dataloader"));
|
|
8
|
+
const EntityManager_1 = require("../EntityManager");
|
|
9
|
+
const index_1 = require("../index");
|
|
10
|
+
const utils_1 = require("../utils");
|
|
11
|
+
function oneToOneDataLoader(em, reference) {
|
|
12
|
+
// The metadata for the entity that contains the reference
|
|
13
|
+
const meta = (0, EntityManager_1.getMetadata)(reference.entity);
|
|
14
|
+
const loaderName = `${meta.tableName}.${reference.fieldName}`;
|
|
15
|
+
return (0, utils_1.getOrSet)(em.loadLoaders, loaderName, () => {
|
|
16
|
+
return new dataloader_1.default(async (_keys) => {
|
|
17
|
+
const { otherMeta, otherFieldName } = reference;
|
|
18
|
+
(0, index_1.assertIdsAreTagged)(_keys);
|
|
19
|
+
const keys = (0, index_1.deTagIds)(meta, _keys);
|
|
20
|
+
const { em } = reference.entity;
|
|
21
|
+
const rows = await em.driver.loadOneToOne(em, reference, keys);
|
|
22
|
+
const entities = rows.map((row) => em.hydrate(otherMeta.cstr, row, { overwriteExisting: false }));
|
|
23
|
+
const rowsById = (0, utils_1.groupBy)(entities, (entity) => {
|
|
24
|
+
// TODO If this came from the UoW, it may not be an id? I.e. pre-insert.
|
|
25
|
+
const ownerId = (0, index_1.maybeResolveReferenceToId)(entity.__orm.data[otherFieldName]);
|
|
26
|
+
// We almost always expect ownerId to be found, b/c normally we just hydrated this entity
|
|
27
|
+
// directly from a SQL row with owner_id=X, however we might be loading this reference
|
|
28
|
+
// (i.e. find all children where owner_id=X) when the SQL thinks a child is still pointing
|
|
29
|
+
// at the parent (i.e. owner_id=X in the db), but our already-loaded child has had its
|
|
30
|
+
// `child.owner` field either changed to some other owner, or set to undefined. In either,
|
|
31
|
+
// that child should no longer be parent of this owner's collection, so just return a
|
|
32
|
+
// dummy value.
|
|
33
|
+
return ownerId ?? "dummyNoLongerOwned";
|
|
34
|
+
});
|
|
35
|
+
return _keys.map((k) => rowsById.get(k)?.[0]);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
exports.oneToOneDataLoader = oneToOneDataLoader;
|
|
40
|
+
//# sourceMappingURL=oneToOneDataLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneToOneDataLoader.js","sourceRoot":"","sources":["../../../src/dataloaders/oneToOneDataLoader.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAoC;AACpC,oDAAsE;AACtE,oCAAmF;AAEnF,oCAA6C;AAE7C,SAAgB,kBAAkB,CAChC,EAAiB,EACjB,SAAsC;IAEtC,0DAA0D;IAC1D,MAAM,IAAI,GAAG,IAAA,2BAAW,EAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;IAC9D,OAAO,IAAA,gBAAQ,EAAC,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE;QAC/C,OAAO,IAAI,oBAAU,CAAwB,KAAK,EAAE,KAAK,EAAE,EAAE;YAC3D,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;YAEhD,IAAA,0BAAkB,EAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAA,gBAAQ,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAEnC,MAAM,EAAE,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC;YAChC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAE/D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAElG,MAAM,QAAQ,GAAG,IAAA,eAAO,EAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC5C,wEAAwE;gBACxE,MAAM,OAAO,GAAG,IAAA,iCAAyB,EAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAC7E,yFAAyF;gBACzF,sFAAsF;gBACtF,0FAA0F;gBAC1F,sFAAsF;gBACtF,0FAA0F;gBAC1F,qFAAqF;gBACrF,eAAe;gBACf,OAAO,OAAO,IAAI,oBAAoB,CAAC;YACzC,CAAC,CAAC,CAAC;YACH,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAkB,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAlCD,gDAkCC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Knex } from "knex";
|
|
2
|
+
import { Todo } from "../Todo";
|
|
3
|
+
export interface IdAssigner {
|
|
4
|
+
assignNewIds(knex: Knex, todos: Record<string, Todo>): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Assigns all new entities an id directly from their corresponding sequence generator, instead of via INSERTs.
|
|
8
|
+
*
|
|
9
|
+
* This lets us avoid cyclic issues with some INSERTs having foreign keys to other rows that themselves
|
|
10
|
+
* need to first be INSERTed.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SequenceIdAssigner implements IdAssigner {
|
|
13
|
+
assignNewIds(knex: Knex, todos: Record<string, Todo>): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Creates random UUIDs for uuid-based keys in production environments.
|
|
17
|
+
*
|
|
18
|
+
* See {@link TestUuidAssigner} for creating stable-ish ids for tests
|
|
19
|
+
*/
|
|
20
|
+
export declare class RandomUuidAssigner implements IdAssigner {
|
|
21
|
+
assignNewIds(knex: Knex, todos: Record<string, Todo>): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Creates deterministic / stable-ish UUIDs for test suites.
|
|
25
|
+
*
|
|
26
|
+
* These ids can technically change as test cases insert different types/numbers
|
|
27
|
+
* of entities, in different orders, but otherwise will be stable.
|
|
28
|
+
*/
|
|
29
|
+
export declare class TestUuidAssigner implements IdAssigner {
|
|
30
|
+
private nextId;
|
|
31
|
+
assignNewIds(knex: Knex, todos: Record<string, Todo>): Promise<void>;
|
|
32
|
+
reset(): void;
|
|
33
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.TestUuidAssigner = exports.RandomUuidAssigner = exports.SequenceIdAssigner = void 0;
|
|
23
|
+
const crypto = __importStar(require("crypto"));
|
|
24
|
+
const keys_1 = require("../keys");
|
|
25
|
+
/**
|
|
26
|
+
* Assigns all new entities an id directly from their corresponding sequence generator, instead of via INSERTs.
|
|
27
|
+
*
|
|
28
|
+
* This lets us avoid cyclic issues with some INSERTs having foreign keys to other rows that themselves
|
|
29
|
+
* need to first be INSERTed.
|
|
30
|
+
*/
|
|
31
|
+
class SequenceIdAssigner {
|
|
32
|
+
async assignNewIds(knex, todos) {
|
|
33
|
+
const seqStatements = [];
|
|
34
|
+
Object.values(todos).forEach((todo) => {
|
|
35
|
+
if (todo.inserts.length > 0) {
|
|
36
|
+
const meta = todo.inserts[0].__orm.metadata;
|
|
37
|
+
const sequenceName = `${meta.tableName}_id_seq`;
|
|
38
|
+
const sql = `select nextval('${sequenceName}') from generate_series(1, ${todo.inserts.length})`;
|
|
39
|
+
seqStatements.push(sql);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
if (seqStatements.length > 0) {
|
|
43
|
+
// There will be 1 per table; 1 single insert should be fine but we might need to batch for super-large schemas?
|
|
44
|
+
const sql = seqStatements.join(" UNION ALL ");
|
|
45
|
+
const result = await knex.raw(sql);
|
|
46
|
+
let i = 0;
|
|
47
|
+
Object.values(todos).forEach((todo) => {
|
|
48
|
+
for (const insert of todo.inserts) {
|
|
49
|
+
insert.__orm.data["id"] = (0, keys_1.keyToString)(todo.metadata, result.rows[i++]["nextval"]);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.SequenceIdAssigner = SequenceIdAssigner;
|
|
56
|
+
/**
|
|
57
|
+
* Creates random UUIDs for uuid-based keys in production environments.
|
|
58
|
+
*
|
|
59
|
+
* See {@link TestUuidAssigner} for creating stable-ish ids for tests
|
|
60
|
+
*/
|
|
61
|
+
class RandomUuidAssigner {
|
|
62
|
+
async assignNewIds(knex, todos) {
|
|
63
|
+
Object.values(todos).forEach((todo) => {
|
|
64
|
+
for (const insert of todo.inserts) {
|
|
65
|
+
insert.__orm.data["id"] = (0, keys_1.keyToString)(todo.metadata, crypto.randomUUID());
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.RandomUuidAssigner = RandomUuidAssigner;
|
|
71
|
+
/**
|
|
72
|
+
* Creates deterministic / stable-ish UUIDs for test suites.
|
|
73
|
+
*
|
|
74
|
+
* These ids can technically change as test cases insert different types/numbers
|
|
75
|
+
* of entities, in different orders, but otherwise will be stable.
|
|
76
|
+
*/
|
|
77
|
+
class TestUuidAssigner {
|
|
78
|
+
constructor() {
|
|
79
|
+
// We can be cute and create per-entity UUID spaces to be more stable
|
|
80
|
+
this.nextId = {};
|
|
81
|
+
}
|
|
82
|
+
async assignNewIds(knex, todos) {
|
|
83
|
+
Object.entries(todos).forEach(([type, todo]) => {
|
|
84
|
+
if (todo.inserts.length > 0) {
|
|
85
|
+
// Each entity's uuid space is based on the slot/order it's added to nextId.
|
|
86
|
+
// This will change across tests, i.e. it's not like tagged ids, but it's
|
|
87
|
+
// an easy number to determine, and should be stable enough.
|
|
88
|
+
let entitySpace = Object.keys(this.nextId).indexOf(type);
|
|
89
|
+
if (entitySpace === -1) {
|
|
90
|
+
this.nextId[type] = 0;
|
|
91
|
+
entitySpace = Object.keys(this.nextId).indexOf(type);
|
|
92
|
+
}
|
|
93
|
+
for (const insert of todo.inserts) {
|
|
94
|
+
const id = this.nextId[type]++;
|
|
95
|
+
const uuid = `10000000-${String(entitySpace).padStart(4, "0")}-0000-0000-${String(id).padStart(12, "0")}`;
|
|
96
|
+
insert.__orm.data["id"] = (0, keys_1.keyToString)(todo.metadata, uuid);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
reset() {
|
|
102
|
+
this.nextId = {};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.TestUuidAssigner = TestUuidAssigner;
|
|
106
|
+
//# sourceMappingURL=IdAssigner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdAssigner.js","sourceRoot":"","sources":["../../../src/drivers/IdAssigner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Knex } from "knex";
|
|
2
|
+
import { Entity, EntityConstructor, EntityManager, EntityMetadata } from "../EntityManager";
|
|
3
|
+
import { FilterAndSettings } from "../QueryBuilder";
|
|
4
|
+
import { ManyToManyCollection, OneToManyCollection, OneToOneReferenceImpl } from "../relations";
|
|
5
|
+
import { JoinRow } from "../relations/ManyToManyCollection";
|
|
6
|
+
import { JoinRowTodo, Todo } from "../Todo";
|
|
7
|
+
import { Driver } from "./driver";
|
|
8
|
+
export declare class InMemoryDriver implements Driver {
|
|
9
|
+
private data;
|
|
10
|
+
private onQuery;
|
|
11
|
+
constructor(onQuery?: () => void);
|
|
12
|
+
select(tableName: string): readonly any[];
|
|
13
|
+
insert(tableName: string, row: any): void;
|
|
14
|
+
update(tableName: string, row: any): void;
|
|
15
|
+
delete(tableName: string, id: number): void;
|
|
16
|
+
clear(): void;
|
|
17
|
+
find<T extends Entity>(em: EntityManager, type: EntityConstructor<T>, queries: readonly FilterAndSettings<T>[]): Promise<unknown[][]>;
|
|
18
|
+
flushEntities(em: EntityManager, todos: Record<string, Todo>): Promise<void>;
|
|
19
|
+
flushJoinTables(em: EntityManager, joinRows: Record<string, JoinRowTodo>): Promise<void>;
|
|
20
|
+
load<T extends Entity>(em: EntityManager, meta: EntityMetadata<T>, untaggedIds: readonly string[]): Promise<unknown[]>;
|
|
21
|
+
loadManyToMany<T extends Entity, U extends Entity>(em: EntityManager, collection: ManyToManyCollection<T, U>, keys: readonly string[]): Promise<JoinRow[]>;
|
|
22
|
+
findManyToMany<T extends Entity, U extends Entity>(em: EntityManager, collection: ManyToManyCollection<T, U>, keys: readonly string[]): Promise<JoinRow[]>;
|
|
23
|
+
loadOneToMany<T extends Entity, U extends Entity>(em: EntityManager, collection: OneToManyCollection<T, U>, untaggedIds: readonly string[]): Promise<unknown[]>;
|
|
24
|
+
findOneToMany<T extends Entity, U extends Entity>(em: EntityManager, collection: OneToManyCollection<T, U>, keys: readonly string[]): Promise<JoinRow[]>;
|
|
25
|
+
loadOneToOne<T extends Entity, U extends Entity>(em: EntityManager, reference: OneToOneReferenceImpl<T, U>, untaggedIds: readonly string[]): Promise<unknown[]>;
|
|
26
|
+
transaction<T>(em: EntityManager, fn: (txn: Knex.Transaction) => Promise<T>, isolationLevel?: "serializable"): Promise<T>;
|
|
27
|
+
rowsOfTable(tableName: string): Record<string, any>;
|
|
28
|
+
private nextId;
|
|
29
|
+
}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InMemoryDriver = void 0;
|
|
4
|
+
const EntityManager_1 = require("../EntityManager");
|
|
5
|
+
const keys_1 = require("../keys");
|
|
6
|
+
const QueryBuilder_1 = require("../QueryBuilder");
|
|
7
|
+
const serde_1 = require("../serde");
|
|
8
|
+
const utils_1 = require("../utils");
|
|
9
|
+
class InMemoryDriver {
|
|
10
|
+
constructor(onQuery) {
|
|
11
|
+
// Map from table name --> string untagged id --> record
|
|
12
|
+
this.data = {};
|
|
13
|
+
this.onQuery = onQuery || (() => { });
|
|
14
|
+
}
|
|
15
|
+
select(tableName) {
|
|
16
|
+
this.onQuery();
|
|
17
|
+
return Object.values(this.data[tableName] || {});
|
|
18
|
+
}
|
|
19
|
+
insert(tableName, row) {
|
|
20
|
+
this.onQuery();
|
|
21
|
+
// Purposefully assign row.id as a side-effect
|
|
22
|
+
row.id || (row.id = this.nextId(tableName));
|
|
23
|
+
this.rowsOfTable(tableName)[row.id] = { ...row }; // Make a copy
|
|
24
|
+
}
|
|
25
|
+
update(tableName, row) {
|
|
26
|
+
this.onQuery();
|
|
27
|
+
const existingRow = this.rowsOfTable(tableName)[row.id];
|
|
28
|
+
this.rowsOfTable(tableName)[row.id] = { ...existingRow, ...row };
|
|
29
|
+
}
|
|
30
|
+
delete(tableName, id) {
|
|
31
|
+
this.onQuery();
|
|
32
|
+
delete this.rowsOfTable(tableName)[id];
|
|
33
|
+
}
|
|
34
|
+
clear() {
|
|
35
|
+
this.data = {};
|
|
36
|
+
}
|
|
37
|
+
async find(em, type, queries) {
|
|
38
|
+
this.onQuery();
|
|
39
|
+
return queries.map((query) => {
|
|
40
|
+
const { where, orderBy, limit, offset = 0 } = query;
|
|
41
|
+
const meta = (0, EntityManager_1.getMetadata)(type);
|
|
42
|
+
const allRows = Object.values(this.rowsOfTable(meta.tableName));
|
|
43
|
+
const matched = allRows.filter((row) => rowMatches(this, meta, row, where));
|
|
44
|
+
const sorted = !orderBy ? matched : matched.sort((a, b) => sort(this, meta, orderBy, a, b));
|
|
45
|
+
return ensureUnderLimit(sorted.slice(offset, offset + (limit ?? sorted.length)));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
async flushEntities(em, todos) {
|
|
49
|
+
const updatedAt = new Date();
|
|
50
|
+
// do our version of assign ids
|
|
51
|
+
Object.entries(todos).forEach(([_, todo]) => {
|
|
52
|
+
todo.inserts.forEach((i) => {
|
|
53
|
+
const id = this.nextId(todo.metadata.tableName);
|
|
54
|
+
i.__orm.data["id"] = (0, keys_1.keyToString)(todo.metadata, id);
|
|
55
|
+
this.rowsOfTable(todo.metadata.tableName)[id] = {};
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
Object.entries(todos).forEach(([_, todo]) => {
|
|
59
|
+
// Because our assign id step effectively inserts the row, we can handle
|
|
60
|
+
// both inserts and updates with the same code path.
|
|
61
|
+
[...todo.updates, ...todo.inserts].forEach((u) => {
|
|
62
|
+
this.onQuery();
|
|
63
|
+
// TODO Do this in EntityManager instead of the drivers
|
|
64
|
+
u.__orm.data["updatedAt"] = updatedAt;
|
|
65
|
+
const id = (0, keys_1.deTagId)(todo.metadata, u.idOrFail);
|
|
66
|
+
const row = {};
|
|
67
|
+
Object.values(todo.metadata.fields)
|
|
68
|
+
.filter(serde_1.hasSerde)
|
|
69
|
+
.flatMap((f) => f.serde.columns.map((c) => [f, c]))
|
|
70
|
+
.forEach(([f, c]) => {
|
|
71
|
+
// Kinda surprised mapToDb doesn't work here...
|
|
72
|
+
row[c.columnName] = c.dbValue(u.__orm.data) ?? null;
|
|
73
|
+
});
|
|
74
|
+
this.rowsOfTable(todo.metadata.tableName)[id] = row;
|
|
75
|
+
});
|
|
76
|
+
todo.deletes.forEach((d) => {
|
|
77
|
+
this.onQuery();
|
|
78
|
+
const id = (0, keys_1.deTagId)(todo.metadata, d.idOrFail);
|
|
79
|
+
delete this.rowsOfTable(todo.metadata.tableName)[id];
|
|
80
|
+
d.__orm.deleted = "deleted";
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async flushJoinTables(em, joinRows) {
|
|
85
|
+
for (const [joinTableName, { m2m, newRows, deletedRows }] of Object.entries(joinRows)) {
|
|
86
|
+
// Any newRows count as 1 query
|
|
87
|
+
if (newRows.length > 0) {
|
|
88
|
+
this.onQuery();
|
|
89
|
+
}
|
|
90
|
+
newRows.forEach((row) => {
|
|
91
|
+
const { id, created_at, deleted, m2m, ...fkColumns } = row;
|
|
92
|
+
// The rows in EntityManager.joinRows point to entities, change those to integers
|
|
93
|
+
Object.keys(fkColumns).forEach((key) => {
|
|
94
|
+
const meta = key == m2m.columnName ? (0, EntityManager_1.getMetadata)(m2m.entity) : m2m.otherMeta;
|
|
95
|
+
fkColumns[key] = (0, keys_1.keyToNumber)(meta, (0, keys_1.maybeResolveReferenceToId)(fkColumns[key]));
|
|
96
|
+
});
|
|
97
|
+
// Mimic an ON CONFLICT upsert
|
|
98
|
+
const existing = Object.values(this.rowsOfTable(joinTableName)).find((row) => {
|
|
99
|
+
const [col1, col2] = Object.keys(fkColumns);
|
|
100
|
+
return fkColumns[col1] === row[col1] && fkColumns[col2] === row[col2];
|
|
101
|
+
});
|
|
102
|
+
if (!existing) {
|
|
103
|
+
this.insert(joinTableName, fkColumns);
|
|
104
|
+
row.id = fkColumns.id;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
row.id = existing.id;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
// `remove`s that were done against unloaded ManyToManyCollections will not have row ids
|
|
111
|
+
const [haveIds, noIds] = (0, utils_1.partition)(deletedRows, (r) => r.id !== -1);
|
|
112
|
+
if (haveIds.length > 0) {
|
|
113
|
+
this.onQuery();
|
|
114
|
+
haveIds.forEach((row) => this.delete(joinTableName, row.id));
|
|
115
|
+
}
|
|
116
|
+
if (noIds.length > 0) {
|
|
117
|
+
this.onQuery();
|
|
118
|
+
noIds.forEach((noIdRow) => {
|
|
119
|
+
const rows = Object.values(this.rowsOfTable(joinTableName));
|
|
120
|
+
rows
|
|
121
|
+
.filter((row) => {
|
|
122
|
+
const a = String(row[m2m.columnName]) === (0, keys_1.deTagId)(m2m.meta, (0, keys_1.maybeResolveReferenceToId)(noIdRow[m2m.columnName]));
|
|
123
|
+
const b = String(row[m2m.otherColumnName]) ===
|
|
124
|
+
(0, keys_1.deTagId)(m2m.otherMeta, (0, keys_1.maybeResolveReferenceToId)(noIdRow[m2m.otherColumnName]));
|
|
125
|
+
return a && b;
|
|
126
|
+
})
|
|
127
|
+
.forEach((found) => this.delete(joinTableName, found.id));
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async load(em, meta, untaggedIds) {
|
|
133
|
+
this.onQuery();
|
|
134
|
+
const rows = Object.values(this.data[meta.tableName] || {});
|
|
135
|
+
return rows.filter((row) => untaggedIds.includes(String(row["id"])));
|
|
136
|
+
}
|
|
137
|
+
async loadManyToMany(em, collection, keys) {
|
|
138
|
+
this.onQuery();
|
|
139
|
+
const ids = {};
|
|
140
|
+
keys.forEach((key) => {
|
|
141
|
+
const [column, id] = key.split("=");
|
|
142
|
+
(ids[column] || (ids[column] = [])).push((0, keys_1.unsafeDeTagIds)([id])[0]);
|
|
143
|
+
});
|
|
144
|
+
const rows = Object.values(this.rowsOfTable(collection.joinTableName));
|
|
145
|
+
return rows.filter((row) => {
|
|
146
|
+
return Object.entries(ids).some(([column, ids]) => ids.includes(String(row[column])));
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
async findManyToMany(em, collection, keys) {
|
|
150
|
+
this.onQuery();
|
|
151
|
+
const rows = Object.values(this.rowsOfTable(collection.joinTableName));
|
|
152
|
+
const set = new Set(keys);
|
|
153
|
+
const [column1, column2] = [collection.columnName, collection.otherColumnName];
|
|
154
|
+
const [m1, m2] = [collection.meta, collection.otherMeta];
|
|
155
|
+
return rows.filter((row) => {
|
|
156
|
+
const key1 = `${column1}=${(0, keys_1.tagId)(m1, row[column1])},${column2}=${(0, keys_1.tagId)(m2, row[column2])}`;
|
|
157
|
+
const key2 = `${column2}=${(0, keys_1.tagId)(m2, row[column2])},${column1}=${(0, keys_1.tagId)(m1, row[column1])}`;
|
|
158
|
+
return set.has(key1) || set.has(key2);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
async loadOneToMany(em, collection, untaggedIds) {
|
|
162
|
+
this.onQuery();
|
|
163
|
+
const rows = Object.values(this.rowsOfTable(collection.otherMeta.tableName));
|
|
164
|
+
return rows.filter((row) => untaggedIds.includes(String(row[collection.otherColumnName])));
|
|
165
|
+
}
|
|
166
|
+
async findOneToMany(em, collection, keys) {
|
|
167
|
+
this.onQuery();
|
|
168
|
+
// If we're loading author.books, we need to look in the books table
|
|
169
|
+
const rows = Object.values(this.rowsOfTable(collection.otherMeta.tableName));
|
|
170
|
+
const set = new Set(keys);
|
|
171
|
+
return rows.filter((row) => {
|
|
172
|
+
const col1 = `id=${(0, keys_1.tagId)(collection.otherMeta, row.id)}`;
|
|
173
|
+
const col2 = `${collection.otherColumnName}=${(0, keys_1.tagId)(collection.meta, row[collection.otherColumnName])}`;
|
|
174
|
+
return set.has(`${col1},${col2}`);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
async loadOneToOne(em, reference, untaggedIds) {
|
|
178
|
+
this.onQuery();
|
|
179
|
+
const rows = Object.values(this.rowsOfTable(reference.otherMeta.tableName));
|
|
180
|
+
return rows.filter((row) => untaggedIds.includes(String(row[reference.otherColumnName])));
|
|
181
|
+
}
|
|
182
|
+
transaction(em, fn, isolationLevel) {
|
|
183
|
+
return fn(undefined);
|
|
184
|
+
}
|
|
185
|
+
rowsOfTable(tableName) {
|
|
186
|
+
var _a;
|
|
187
|
+
return ((_a = this.data)[tableName] || (_a[tableName] = {}));
|
|
188
|
+
}
|
|
189
|
+
nextId(tableName) {
|
|
190
|
+
return Object.values(this.data[tableName] || {}).length + 1;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
exports.InMemoryDriver = InMemoryDriver;
|
|
194
|
+
/** In SQL `a !== null` is false. */
|
|
195
|
+
function notEqual(a, b) {
|
|
196
|
+
if (a === null || b === null) {
|
|
197
|
+
return !(a === null && b === null);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
return a !== b;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const ops = {
|
|
204
|
+
gt: (a, b) => a > b,
|
|
205
|
+
gte: (a, b) => a >= b,
|
|
206
|
+
lt: (a, b) => a < b,
|
|
207
|
+
lte: (a, b) => a <= b,
|
|
208
|
+
like: (a, b) => new RegExp(b.replace("%", ".*")).test(a),
|
|
209
|
+
ilike: (a, b) => new RegExp(b.replace("%", ".*"), "i").test(a),
|
|
210
|
+
};
|
|
211
|
+
function rowMatches(driver, meta, row, where) {
|
|
212
|
+
return Object.entries(where)
|
|
213
|
+
.filter(([_, value]) => value !== undefined)
|
|
214
|
+
.every(([fieldName, value]) => {
|
|
215
|
+
const field = meta.fields[fieldName] || (0, utils_1.fail)();
|
|
216
|
+
// TODO Add column data to the fields
|
|
217
|
+
const column = meta.fields[field.fieldName] || (0, utils_1.fail)();
|
|
218
|
+
// TODO Support multiple columns i.e. polymorphic references
|
|
219
|
+
const currentValue = (column.serde && row[column.serde.columns[0].columnName]) ?? null;
|
|
220
|
+
switch (field.kind) {
|
|
221
|
+
case "primaryKey":
|
|
222
|
+
case "primitive":
|
|
223
|
+
case "enum":
|
|
224
|
+
let fn = (a) => a;
|
|
225
|
+
if (field.kind === "enum") {
|
|
226
|
+
fn = (v) => field.enumDetailType.getByCode(v).id;
|
|
227
|
+
}
|
|
228
|
+
else if (field.kind === "primaryKey") {
|
|
229
|
+
fn = (v) => (0, keys_1.keyToNumber)(meta, v);
|
|
230
|
+
}
|
|
231
|
+
const filter = (0, QueryBuilder_1.parseValueFilter)(value);
|
|
232
|
+
switch (filter.kind) {
|
|
233
|
+
case "eq":
|
|
234
|
+
return currentValue === fn(filter.value);
|
|
235
|
+
case "ne":
|
|
236
|
+
return notEqual(currentValue, fn(filter.value));
|
|
237
|
+
case "in":
|
|
238
|
+
return filter.value.map(fn).includes(currentValue);
|
|
239
|
+
case "gt":
|
|
240
|
+
case "gte":
|
|
241
|
+
case "lt":
|
|
242
|
+
case "lte":
|
|
243
|
+
case "like":
|
|
244
|
+
case "ilike":
|
|
245
|
+
const a = currentValue;
|
|
246
|
+
const b = fn(filter.value);
|
|
247
|
+
const op = ops[filter.kind];
|
|
248
|
+
return op(a, b);
|
|
249
|
+
case "pass":
|
|
250
|
+
return true;
|
|
251
|
+
default:
|
|
252
|
+
throw new Error("Unsupported");
|
|
253
|
+
}
|
|
254
|
+
case "m2o":
|
|
255
|
+
const otherMeta = field.otherMetadata();
|
|
256
|
+
const ef = (0, QueryBuilder_1.parseEntityFilter)(otherMeta, value);
|
|
257
|
+
switch (ef.kind) {
|
|
258
|
+
case "eq":
|
|
259
|
+
return currentValue === ef.id;
|
|
260
|
+
case "ne":
|
|
261
|
+
return notEqual(currentValue, ef.id);
|
|
262
|
+
case "in":
|
|
263
|
+
return ef.ids.includes(currentValue);
|
|
264
|
+
case "join":
|
|
265
|
+
if (currentValue === null) {
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
const otherRow = driver.rowsOfTable(otherMeta.tableName)[currentValue];
|
|
269
|
+
return rowMatches(driver, otherMeta, otherRow, ef.subFilter);
|
|
270
|
+
default:
|
|
271
|
+
throw new Error("Unsupported");
|
|
272
|
+
}
|
|
273
|
+
default:
|
|
274
|
+
throw new Error("Unsupported");
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
function sort(driver, meta, orderBy, a, b) {
|
|
279
|
+
const fieldName = Object.keys(orderBy)[0];
|
|
280
|
+
const value = orderBy[fieldName];
|
|
281
|
+
if (value !== "ASC" && value !== "DESC") {
|
|
282
|
+
// I.e. value is something like `{ book: { author: { ... } }`
|
|
283
|
+
const field = meta.fields[fieldName] || (0, utils_1.fail)();
|
|
284
|
+
if (field.kind === "m2o") {
|
|
285
|
+
const newMeta = field.otherMetadata();
|
|
286
|
+
const newA = driver.rowsOfTable(newMeta.tableName)[a.id];
|
|
287
|
+
const newB = driver.rowsOfTable(newMeta.tableName)[b.id];
|
|
288
|
+
return sort(driver, newMeta, value, newA, newB);
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
throw new Error(`Unsupported order by field ${fieldName}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
const flip = value === "DESC" ? -1 : 1;
|
|
295
|
+
const column = meta.fields[fieldName] || (0, utils_1.fail)();
|
|
296
|
+
const key = column.serde.columns[0].columnName;
|
|
297
|
+
// TODO Handle sorting by more than just strings
|
|
298
|
+
return a[key].localeCompare(b[key]) * flip;
|
|
299
|
+
}
|
|
300
|
+
function ensureUnderLimit(rows) {
|
|
301
|
+
if (rows.length >= EntityManager_1.entityLimit) {
|
|
302
|
+
throw new Error(`Query returned more than ${EntityManager_1.entityLimit} rows`);
|
|
303
|
+
}
|
|
304
|
+
return rows;
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=InMemoryDriver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemoryDriver.js","sourceRoot":"","sources":["../../../src/drivers/InMemoryDriver.ts"],"names":[],"mappings":"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"}
|