joist-core 2.0.3-next.2 → 2.0.3-next.21
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/AliasAssigner.d.ts +3 -0
- package/build/AliasAssigner.d.ts.map +1 -1
- package/build/AliasAssigner.js +12 -3
- package/build/AliasAssigner.js.map +1 -1
- package/build/EntityManager.d.ts +20 -9
- package/build/EntityManager.d.ts.map +1 -1
- package/build/EntityManager.js +94 -58
- package/build/EntityManager.js.map +1 -1
- package/build/ReactionsManager.d.ts +1 -1
- package/build/ReactionsManager.d.ts.map +1 -1
- package/build/ReactionsManager.js +7 -5
- package/build/ReactionsManager.js.map +1 -1
- package/build/batchloaders/BatchLoader.d.ts +14 -0
- package/build/batchloaders/BatchLoader.d.ts.map +1 -0
- package/build/batchloaders/BatchLoader.js +49 -0
- package/build/batchloaders/BatchLoader.js.map +1 -0
- package/build/batchloaders/loadBatchLoader.d.ts +17 -0
- package/build/batchloaders/loadBatchLoader.d.ts.map +1 -0
- package/build/batchloaders/loadBatchLoader.js +55 -0
- package/build/batchloaders/loadBatchLoader.js.map +1 -0
- package/build/batchloaders/manyToManyBatchLoader.d.ts +7 -0
- package/build/batchloaders/manyToManyBatchLoader.d.ts.map +1 -0
- package/build/batchloaders/manyToManyBatchLoader.js +57 -0
- package/build/batchloaders/manyToManyBatchLoader.js.map +1 -0
- package/build/batchloaders/oneToManyBatchLoader.d.ts +7 -0
- package/build/batchloaders/oneToManyBatchLoader.d.ts.map +1 -0
- package/build/{dataloaders/oneToManyDataLoader.js → batchloaders/oneToManyBatchLoader.js} +9 -18
- package/build/batchloaders/oneToManyBatchLoader.js.map +1 -0
- package/build/batchloaders/oneToOneBatchLoader.d.ts +7 -0
- package/build/batchloaders/oneToOneBatchLoader.d.ts.map +1 -0
- package/build/{dataloaders/oneToOneDataLoader.js → batchloaders/oneToOneBatchLoader.js} +10 -16
- package/build/batchloaders/oneToOneBatchLoader.js.map +1 -0
- package/build/{dataloaders/populateDataLoader.d.ts → batchloaders/populateBatchLoader.d.ts} +5 -5
- package/build/batchloaders/populateBatchLoader.d.ts.map +1 -0
- package/build/{dataloaders/populateDataLoader.js → batchloaders/populateBatchLoader.js} +97 -54
- package/build/batchloaders/populateBatchLoader.js.map +1 -0
- package/build/batchloaders/recursiveChildrenBatchLoader.d.ts +7 -0
- package/build/batchloaders/recursiveChildrenBatchLoader.d.ts.map +1 -0
- package/build/{dataloaders/recursiveChildrenDataLoader.js → batchloaders/recursiveChildrenBatchLoader.js} +4 -6
- package/build/batchloaders/recursiveChildrenBatchLoader.js.map +1 -0
- package/build/batchloaders/recursiveParentsBatchLoader.d.ts +7 -0
- package/build/batchloaders/recursiveParentsBatchLoader.d.ts.map +1 -0
- package/build/{dataloaders/recursiveParentsDataLoader.js → batchloaders/recursiveParentsBatchLoader.js} +4 -5
- package/build/batchloaders/recursiveParentsBatchLoader.js.map +1 -0
- package/build/changes.js +2 -2
- package/build/changes.js.map +1 -1
- package/build/config.js +1 -1
- package/build/config.js.map +1 -1
- package/build/dataloaders/findIdsDataLoader.js +2 -2
- package/build/dataloaders/findIdsDataLoader.js.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.js +1 -1
- package/build/logging/ReactionLogger.d.ts +8 -4
- package/build/logging/ReactionLogger.d.ts.map +1 -1
- package/build/logging/ReactionLogger.js +11 -4
- package/build/logging/ReactionLogger.js.map +1 -1
- package/build/preloading/JsonAggregatePreloader.js +29 -24
- package/build/preloading/JsonAggregatePreloader.js.map +1 -1
- package/build/relations/Collection.d.ts +6 -1
- package/build/relations/Collection.d.ts.map +1 -1
- package/build/relations/Collection.js.map +1 -1
- package/build/relations/ManyToManyCollection.d.ts +8 -1
- package/build/relations/ManyToManyCollection.d.ts.map +1 -1
- package/build/relations/ManyToManyCollection.js +338 -130
- package/build/relations/ManyToManyCollection.js.map +1 -1
- package/build/relations/ManyToOneReference.d.ts +2 -6
- package/build/relations/ManyToOneReference.d.ts.map +1 -1
- package/build/relations/ManyToOneReference.js +115 -78
- package/build/relations/ManyToOneReference.js.map +1 -1
- package/build/relations/OneToManyCollection.d.ts +8 -4
- package/build/relations/OneToManyCollection.d.ts.map +1 -1
- package/build/relations/OneToManyCollection.js +415 -173
- package/build/relations/OneToManyCollection.js.map +1 -1
- package/build/relations/OneToOneReference.d.ts.map +1 -1
- package/build/relations/OneToOneReference.js +12 -7
- package/build/relations/OneToOneReference.js.map +1 -1
- package/build/relations/ReactiveManyToMany.js +4 -4
- package/build/relations/ReactiveManyToMany.js.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.js +3 -3
- package/build/relations/ReactiveManyToManyOtherSide.js.map +1 -1
- package/build/relations/RecursiveCollection.d.ts.map +1 -1
- package/build/relations/RecursiveCollection.js +22 -8
- package/build/relations/RecursiveCollection.js.map +1 -1
- package/package.json +3 -4
- package/build/dataloaders/loadDataLoader.d.ts +0 -11
- package/build/dataloaders/loadDataLoader.d.ts.map +0 -1
- package/build/dataloaders/loadDataLoader.js +0 -54
- package/build/dataloaders/loadDataLoader.js.map +0 -1
- package/build/dataloaders/manyToManyDataLoader.d.ts +0 -8
- package/build/dataloaders/manyToManyDataLoader.d.ts.map +0 -1
- package/build/dataloaders/manyToManyDataLoader.js +0 -74
- package/build/dataloaders/manyToManyDataLoader.js.map +0 -1
- package/build/dataloaders/oneToManyDataLoader.d.ts +0 -7
- package/build/dataloaders/oneToManyDataLoader.d.ts.map +0 -1
- package/build/dataloaders/oneToManyDataLoader.js.map +0 -1
- package/build/dataloaders/oneToOneDataLoader.d.ts +0 -7
- package/build/dataloaders/oneToOneDataLoader.d.ts.map +0 -1
- package/build/dataloaders/oneToOneDataLoader.js.map +0 -1
- package/build/dataloaders/populateDataLoader.d.ts.map +0 -1
- package/build/dataloaders/populateDataLoader.js.map +0 -1
- package/build/dataloaders/recursiveChildrenDataLoader.d.ts +0 -7
- package/build/dataloaders/recursiveChildrenDataLoader.d.ts.map +0 -1
- package/build/dataloaders/recursiveChildrenDataLoader.js.map +0 -1
- package/build/dataloaders/recursiveParentsDataLoader.d.ts +0 -7
- package/build/dataloaders/recursiveParentsDataLoader.d.ts.map +0 -1
- package/build/dataloaders/recursiveParentsDataLoader.js.map +0 -1
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadOperation = void 0;
|
|
4
|
+
exports.loadBatchLoader = loadBatchLoader;
|
|
5
|
+
const BaseEntity_1 = require("../BaseEntity");
|
|
6
|
+
const EntityManager_1 = require("../EntityManager");
|
|
7
|
+
const HintTree_1 = require("../HintTree");
|
|
8
|
+
const QueryParser_1 = require("../QueryParser");
|
|
9
|
+
const keys_1 = require("../keys");
|
|
10
|
+
const utils_1 = require("../utils");
|
|
11
|
+
exports.loadOperation = "load";
|
|
12
|
+
/**
|
|
13
|
+
* Batches em.load-style fetches, writing to identity map (via hydrate) instead of returning values.
|
|
14
|
+
* After the batch resolves, callers retrieve their entity from `em.findExistingInstance`.
|
|
15
|
+
*
|
|
16
|
+
* Accepts tuples of `{ taggedId, hint }` so the preloader can inject join-based
|
|
17
|
+
* preloading into the same SELECT that fetches the entities.
|
|
18
|
+
*/
|
|
19
|
+
function loadBatchLoader(em, meta, overwriteExisting = false) {
|
|
20
|
+
return em.getBatchLoader(exports.loadOperation, `${meta.type}-${overwriteExisting}`, async (loads) => {
|
|
21
|
+
const keys = loads.map((l) => (0, keys_1.keyToNumber)(meta, l.taggedId));
|
|
22
|
+
const alias = (0, utils_1.abbreviation)(meta.tableName);
|
|
23
|
+
const query = {
|
|
24
|
+
selects: [`"${alias}".*`],
|
|
25
|
+
tables: [{ alias, join: "primary", table: meta.tableName }],
|
|
26
|
+
condition: {
|
|
27
|
+
kind: "exp",
|
|
28
|
+
op: "and",
|
|
29
|
+
conditions: [{ kind: "column", alias, column: "id", dbType: meta.idDbType, cond: { kind: "in", value: keys } }],
|
|
30
|
+
},
|
|
31
|
+
orderBys: [{ alias, column: "id", order: "ASC" }],
|
|
32
|
+
};
|
|
33
|
+
(0, QueryParser_1.addTablePerClassJoinsAndClassTag)(query, meta, alias, true);
|
|
34
|
+
// Inject preloading joins into the query if enabled
|
|
35
|
+
const { preloader } = (0, EntityManager_1.getEmInternalApi)(em);
|
|
36
|
+
const preloadHydrator = preloader &&
|
|
37
|
+
preloader.addPreloading(meta, (0, HintTree_1.buildHintTree)(loads.map((l) => ({ entity: l.taggedId, hint: l.hint }))), query);
|
|
38
|
+
const rows = await em["executeFind"](meta, exports.loadOperation, query, {});
|
|
39
|
+
const entities = em.hydrate(meta.cstr, rows, { overwriteExisting });
|
|
40
|
+
preloadHydrator && preloadHydrator(rows, entities);
|
|
41
|
+
// If we're missing any requested rows, mark any requested-but-not-found entities as deleted
|
|
42
|
+
if (rows.length !== loads.length) {
|
|
43
|
+
const foundIds = new Set(rows.map((r) => (0, keys_1.tagId)(meta, r.id)));
|
|
44
|
+
for (const load of loads) {
|
|
45
|
+
if (!foundIds.has(load.taggedId)) {
|
|
46
|
+
const existingEntity = em.findExistingInstance(load.taggedId);
|
|
47
|
+
if (existingEntity) {
|
|
48
|
+
(0, BaseEntity_1.getInstanceData)(existingEntity).markDeletedBecauseNotFound();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=loadBatchLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadBatchLoader.js","sourceRoot":"","sources":["../../src/batchloaders/loadBatchLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { EntityManager } from "../EntityManager";
|
|
2
|
+
import { ManyToManyLike } from "../index";
|
|
3
|
+
import { BatchLoader } from "./BatchLoader";
|
|
4
|
+
export declare const manyToManyLoadOperation = "m2m-load";
|
|
5
|
+
/** Batches m2m.packages/core/src/relations/ReactiveManyToMany.tsload calls via BatchLoader. */
|
|
6
|
+
export declare function manyToManyBatchLoader(em: EntityManager, collection: ManyToManyLike): BatchLoader<string>;
|
|
7
|
+
//# sourceMappingURL=manyToManyBatchLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manyToManyBatchLoader.d.ts","sourceRoot":"","sources":["../../src/batchloaders/manyToManyBatchLoader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAoB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAA4B,cAAc,EAAmB,MAAM,UAAU,CAAC;AAErF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAElD,+FAA+F;AAC/F,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,CAExG"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.manyToManyLoadOperation = void 0;
|
|
4
|
+
exports.manyToManyBatchLoader = manyToManyBatchLoader;
|
|
5
|
+
const EntityManager_1 = require("../EntityManager");
|
|
6
|
+
const index_1 = require("../index");
|
|
7
|
+
const utils_1 = require("../utils");
|
|
8
|
+
exports.manyToManyLoadOperation = "m2m-load";
|
|
9
|
+
/** Batches m2m.packages/core/src/relations/ReactiveManyToMany.tsload calls via BatchLoader. */
|
|
10
|
+
function manyToManyBatchLoader(em, collection) {
|
|
11
|
+
return em.getBatchLoader(exports.manyToManyLoadOperation, collection.joinTableName, (keys) => loadBatch(collection, keys));
|
|
12
|
+
}
|
|
13
|
+
async function loadBatch(collection, keys) {
|
|
14
|
+
const { em } = collection.entity;
|
|
15
|
+
const joinRows = (0, EntityManager_1.getEmInternalApi)(em).joinRows(collection);
|
|
16
|
+
// Break out `column_id=string` keys
|
|
17
|
+
const columns = {};
|
|
18
|
+
const tuples = [];
|
|
19
|
+
keys.forEach((key) => {
|
|
20
|
+
const [columnId, id] = key.split("=");
|
|
21
|
+
(0, utils_1.getOrSet)(columns, columnId, []).push(id);
|
|
22
|
+
tuples.push([columnId, id]);
|
|
23
|
+
});
|
|
24
|
+
const alias = (0, utils_1.abbreviation)(collection.joinTableName);
|
|
25
|
+
const query = {
|
|
26
|
+
selects: [`"${alias}".*`],
|
|
27
|
+
tables: [{ alias, join: "primary", table: collection.joinTableName }],
|
|
28
|
+
condition: {
|
|
29
|
+
kind: "exp",
|
|
30
|
+
op: "or",
|
|
31
|
+
conditions: Object.entries(columns).map(([columnId, values]) => {
|
|
32
|
+
const meta = collection.columnName == columnId ? (0, index_1.getMetadata)(collection.entity) : collection.otherMeta;
|
|
33
|
+
return {
|
|
34
|
+
kind: "column",
|
|
35
|
+
alias,
|
|
36
|
+
column: columnId,
|
|
37
|
+
dbType: meta.idDbType,
|
|
38
|
+
cond: { kind: "in", value: values.map((id) => (0, index_1.keyToNumber)(meta, id)) },
|
|
39
|
+
};
|
|
40
|
+
}),
|
|
41
|
+
},
|
|
42
|
+
orderBys: [{ alias, column: "id", order: "ASC" }],
|
|
43
|
+
};
|
|
44
|
+
const rows = await em["executeFind"](collection.otherMeta, exports.manyToManyLoadOperation, query, {});
|
|
45
|
+
await joinRows.loadRows(tuples, rows);
|
|
46
|
+
const api = (0, EntityManager_1.getEmInternalApi)(em);
|
|
47
|
+
for (const [column, id] of tuples) {
|
|
48
|
+
const entity = em.getEntity(id);
|
|
49
|
+
if (!entity)
|
|
50
|
+
continue;
|
|
51
|
+
const others = joinRows.getOthers(column, entity);
|
|
52
|
+
// Determine the field name from the column
|
|
53
|
+
const fieldName = column === collection.columnName ? collection.fieldName : collection.otherFieldName;
|
|
54
|
+
api.setPreloadedRelation(entity.idTagged, fieldName, others);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=manyToManyBatchLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manyToManyBatchLoader.js","sourceRoot":"","sources":["../../src/batchloaders/manyToManyBatchLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Entity } from "../Entity";
|
|
2
|
+
import { EntityManager } from "../EntityManager";
|
|
3
|
+
import { OneToManyCollection } from "../index";
|
|
4
|
+
import { BatchLoader } from "./BatchLoader";
|
|
5
|
+
export declare const oneToManyLoadOperation = "o2m-load";
|
|
6
|
+
export declare function oneToManyBatchLoader<T extends Entity, U extends Entity>(em: EntityManager, collection: OneToManyCollection<T, U>): BatchLoader<string>;
|
|
7
|
+
//# sourceMappingURL=oneToManyBatchLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneToManyBatchLoader.d.ts","sourceRoot":"","sources":["../../src/batchloaders/oneToManyBatchLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,aAAa,EAAoB,MAAM,kBAAkB,CAAC;AAEnE,OAAO,EAKL,mBAAmB,EAGpB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,eAAO,MAAM,sBAAsB,aAAa,CAAC;AAEjD,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EACrE,EAAE,EAAE,aAAa,EACjB,UAAU,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,GACpC,WAAW,CAAC,MAAM,CAAC,CA8CrB"}
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.oneToManyLoadOperation = void 0;
|
|
4
|
-
exports.
|
|
4
|
+
exports.oneToManyBatchLoader = oneToManyBatchLoader;
|
|
5
|
+
const EntityManager_1 = require("../EntityManager");
|
|
5
6
|
const fields_1 = require("../fields");
|
|
6
7
|
const index_1 = require("../index");
|
|
7
8
|
const utils_1 = require("../utils");
|
|
8
9
|
exports.oneToManyLoadOperation = "o2m-load";
|
|
9
|
-
function
|
|
10
|
-
// The metadata for the entity that contains the collection, i.e. Author in author.books
|
|
10
|
+
function oneToManyBatchLoader(em, collection) {
|
|
11
11
|
const { meta: oneMeta, fieldName } = collection;
|
|
12
12
|
const batchKey = `${oneMeta.tableName}-${fieldName}`;
|
|
13
|
-
return em.
|
|
14
|
-
// otherMeta is the entity being fetched, i.e. Book in author.books
|
|
13
|
+
return em.getBatchLoader(exports.oneToManyLoadOperation, batchKey, async (_keys) => {
|
|
15
14
|
const { otherMeta: meta } = collection;
|
|
16
15
|
(0, index_1.assertIdsAreTagged)(_keys);
|
|
17
16
|
const keys = (0, index_1.deTagIds)(oneMeta, _keys);
|
|
@@ -37,24 +36,16 @@ function oneToManyDataLoader(em, collection) {
|
|
|
37
36
|
orderBys: [{ alias, column: "id", order: "ASC" }],
|
|
38
37
|
};
|
|
39
38
|
(0, index_1.addTablePerClassJoinsAndClassTag)(query, meta, alias, true);
|
|
40
|
-
// Skip maybeAddOrderBy b/c we'll sort in memory anyway
|
|
41
|
-
// maybeAddNotSoftDeleted(conditions, meta, alias, "include");
|
|
42
39
|
const rows = await em["executeFind"](meta, exports.oneToManyLoadOperation, query, {});
|
|
43
40
|
const entities = em.hydrate(meta.cstr, rows);
|
|
44
|
-
// .filter((e) => !e.isDeletedEntity);
|
|
45
41
|
const entitiesById = (0, utils_1.groupBy)(entities, (entity) => {
|
|
46
|
-
// TODO If this came from the UoW, it may not be an id? I.e. pre-insert.
|
|
47
42
|
const ownerId = (0, index_1.maybeResolveReferenceToId)((0, fields_1.getField)(entity, collection.otherFieldName));
|
|
48
|
-
// We almost always expect ownerId to be found, b/c normally we just hydrated this entity
|
|
49
|
-
// directly from a SQL row with owner_id=X, however we might be loading this collection
|
|
50
|
-
// (i.e. find all children where owner_id=X) when the SQL thinks a child is still pointing
|
|
51
|
-
// at the parent (i.e. owner_id=X in the db), but our already-loaded child has had its
|
|
52
|
-
// `child.owner` field either changed to some other owner, or set to undefined. In either,
|
|
53
|
-
// that child should no longer be parent of this owner's collection, so just return a
|
|
54
|
-
// dummy value.
|
|
55
43
|
return ownerId ?? "dummyNoLongerOwned";
|
|
56
44
|
});
|
|
57
|
-
|
|
45
|
+
const api = (0, EntityManager_1.getEmInternalApi)(em);
|
|
46
|
+
for (const key of _keys) {
|
|
47
|
+
api.setPreloadedRelation(key, fieldName, entitiesById.get(key) || []);
|
|
48
|
+
}
|
|
58
49
|
});
|
|
59
50
|
}
|
|
60
|
-
//# sourceMappingURL=
|
|
51
|
+
//# sourceMappingURL=oneToManyBatchLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneToManyBatchLoader.js","sourceRoot":"","sources":["../../src/batchloaders/oneToManyBatchLoader.ts"],"names":[],"mappings":";;;AAiBA,oDAiDC;AAjED,oDAAmE;AACnE,sCAAqC;AACrC,oCAQkB;AAClB,oCAAiD;AAGpC,QAAA,sBAAsB,GAAG,UAAU,CAAC;AAEjD,SAAgB,oBAAoB,CAClC,EAAiB,EACjB,UAAqC;IAErC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC;IAChD,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;IACrD,OAAO,EAAE,CAAC,cAAc,CAAC,8BAAsB,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACzE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC;QAEvC,IAAA,0BAAkB,EAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAA,gBAAQ,EAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAEtC,MAAM,KAAK,GAAG,IAAA,oBAAY,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAmB,CAAC;QACtE,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QACxD,MAAM,KAAK,GAAoB;YAC7B,OAAO,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC;YACzB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3D,SAAS,EAAE;gBACT,IAAI,EAAE,KAAK;gBACX,EAAE,EAAE,KAAK;gBACT,UAAU,EAAE;oBACV;wBACE,IAAI,EAAE,QAAQ;wBACd,KAAK,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE;wBACrC,MAAM,EAAE,GAAG,CAAC,eAAe;wBAC3B,MAAM,EAAE,IAAI,CAAC,QAAQ;wBACrB,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;qBAClC;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;SAClD,CAAC;QAEF,IAAA,wCAAgC,EAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAE3D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,8BAAsB,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAE7C,MAAM,YAAY,GAAG,IAAA,eAAO,EAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAChD,MAAM,OAAO,GAAG,IAAA,iCAAyB,EAAC,IAAA,iBAAQ,EAAC,MAAM,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;YACvF,OAAO,OAAO,IAAI,oBAAoB,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,IAAA,gCAAgB,EAAC,EAAE,CAAC,CAAC;QACjC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,GAAG,CAAC,oBAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Entity } from "../Entity";
|
|
2
|
+
import { EntityManager } from "../EntityManager";
|
|
3
|
+
import { OneToOneReferenceImpl } from "../relations/OneToOneReference";
|
|
4
|
+
import { BatchLoader } from "./BatchLoader";
|
|
5
|
+
export declare const oneToOneLoadOperation = "o2o-load";
|
|
6
|
+
export declare function oneToOneBatchLoader<T extends Entity, U extends Entity>(em: EntityManager, reference: OneToOneReferenceImpl<T, U>): BatchLoader<string>;
|
|
7
|
+
//# sourceMappingURL=oneToOneBatchLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneToOneBatchLoader.d.ts","sourceRoot":"","sources":["../../src/batchloaders/oneToOneBatchLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,aAAa,EAAoB,MAAM,kBAAkB,CAAC;AAUnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,eAAO,MAAM,qBAAqB,aAAa,CAAC;AAEhD,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EACpE,EAAE,EAAE,aAAa,EACjB,SAAS,EAAE,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,GACrC,WAAW,CAAC,MAAM,CAAC,CA8CrB"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.oneToOneLoadOperation = void 0;
|
|
4
|
-
exports.
|
|
4
|
+
exports.oneToOneBatchLoader = oneToOneBatchLoader;
|
|
5
|
+
const EntityManager_1 = require("../EntityManager");
|
|
5
6
|
const EntityMetadata_1 = require("../EntityMetadata");
|
|
6
7
|
const fields_1 = require("../fields");
|
|
7
8
|
const index_1 = require("../index");
|
|
8
9
|
const utils_1 = require("../utils");
|
|
9
10
|
exports.oneToOneLoadOperation = "o2o-load";
|
|
10
|
-
function
|
|
11
|
-
// The metadata for the entity that contains the reference, i.e. Author.image is the o2o,
|
|
12
|
-
// and (otherMeta/otherFieldName) Image.author is the physical m2o/FK column.
|
|
11
|
+
function oneToOneBatchLoader(em, reference) {
|
|
13
12
|
const meta = (0, EntityMetadata_1.getMetadata)(reference.entity);
|
|
14
13
|
const batchKey = `${meta.tableName}-${reference.fieldName}`;
|
|
15
|
-
return em.
|
|
14
|
+
return em.getBatchLoader(exports.oneToOneLoadOperation, batchKey, async (_keys) => {
|
|
16
15
|
const { otherMeta, otherFieldName } = reference;
|
|
17
16
|
(0, index_1.assertIdsAreTagged)(_keys);
|
|
18
17
|
const keys = (0, index_1.deTagIds)(meta, _keys);
|
|
@@ -38,22 +37,17 @@ function oneToOneDataLoader(em, reference) {
|
|
|
38
37
|
orderBys: [],
|
|
39
38
|
};
|
|
40
39
|
(0, index_1.addTablePerClassJoinsAndClassTag)(query, otherMeta, alias, true);
|
|
41
|
-
const { em } = reference.entity;
|
|
42
40
|
const rows = await em["executeFind"](otherMeta, exports.oneToOneLoadOperation, query, {});
|
|
43
41
|
const entities = em.hydrate(otherMeta.cstr, rows);
|
|
44
42
|
const entitiesByOtherId = (0, utils_1.groupBy)(entities, (entity) => {
|
|
45
|
-
// TODO If this came from the UoW, it may not be an id? I.e. pre-insert.
|
|
46
43
|
const ownerId = (0, index_1.maybeResolveReferenceToId)((0, fields_1.getField)(entity, otherFieldName));
|
|
47
|
-
// We almost always expect ownerId to be found, b/c normally we just hydrated this entity
|
|
48
|
-
// directly from a SQL row with owner_id=X, however we might be loading this reference
|
|
49
|
-
// (i.e. find all children where owner_id=X) when the SQL thinks a child is still pointing
|
|
50
|
-
// at the parent (i.e. owner_id=X in the db), but our already-loaded child has had its
|
|
51
|
-
// `child.owner` field either changed to some other owner, or set to undefined. In either,
|
|
52
|
-
// that child should no longer be parent of this owner's collection, so just return a
|
|
53
|
-
// dummy value.
|
|
54
44
|
return ownerId ?? "dummyNoLongerOwned";
|
|
55
45
|
});
|
|
56
|
-
|
|
46
|
+
const api = (0, EntityManager_1.getEmInternalApi)(em);
|
|
47
|
+
for (const key of _keys) {
|
|
48
|
+
const found = entitiesByOtherId.get(key);
|
|
49
|
+
api.setPreloadedRelation(key, reference.fieldName, found ? [found[0]] : []);
|
|
50
|
+
}
|
|
57
51
|
});
|
|
58
52
|
}
|
|
59
|
-
//# sourceMappingURL=
|
|
53
|
+
//# sourceMappingURL=oneToOneBatchLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneToOneBatchLoader.js","sourceRoot":"","sources":["../../src/batchloaders/oneToOneBatchLoader.ts"],"names":[],"mappings":";;;AAiBA,kDAiDC;AAjED,oDAAmE;AACnE,sDAA+D;AAC/D,sCAAqC;AACrC,oCAMkB;AAElB,oCAAiD;AAGpC,QAAA,qBAAqB,GAAG,UAAU,CAAC;AAEhD,SAAgB,mBAAmB,CACjC,EAAiB,EACjB,SAAsC;IAEtC,MAAM,IAAI,GAAG,IAAA,4BAAW,EAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;IAC5D,OAAO,EAAE,CAAC,cAAc,CAAC,6BAAqB,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACxE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;QAEhD,IAAA,0BAAkB,EAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAA,gBAAQ,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAEnC,MAAM,KAAK,GAAG,IAAA,oBAAY,EAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAkB,CAAC;QACjE,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAoB;YAC7B,OAAO,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC;YACzB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;YAChE,SAAS,EAAE;gBACT,IAAI,EAAE,KAAK;gBACX,EAAE,EAAE,KAAK;gBACT,UAAU,EAAE;oBACV;wBACE,IAAI,EAAE,QAAQ;wBACd,KAAK,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE;wBACrC,MAAM,EAAE,GAAG,CAAC,eAAe;wBAC3B,MAAM,EAAE,IAAI,CAAC,QAAQ;wBACrB,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;qBAClC;iBACF;aACF;YACD,QAAQ,EAAE,EAAE;SACb,CAAC;QACF,IAAA,wCAAgC,EAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAEhE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,CAAC,SAAS,EAAE,6BAAqB,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAElD,MAAM,iBAAiB,GAAG,IAAA,eAAO,EAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YACrD,MAAM,OAAO,GAAG,IAAA,iCAAyB,EAAC,IAAA,iBAAQ,EAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;YAC5E,OAAO,OAAO,IAAI,oBAAoB,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,IAAA,gCAAgB,EAAC,EAAE,CAAC,CAAC;QACjC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzC,GAAG,CAAC,oBAAoB,CAAC,GAAG,EAAE,SAAS,CAAC,SAAmB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import DataLoader from "dataloader";
|
|
2
1
|
import { Entity } from "../Entity";
|
|
3
2
|
import { EntityMetadata } from "../EntityMetadata";
|
|
4
3
|
import { EntityManager } from "../index";
|
|
5
4
|
import { LoadHint } from "../loadHints";
|
|
5
|
+
import { BatchLoader } from "./BatchLoader";
|
|
6
6
|
export declare const populateOperation = "populate";
|
|
7
|
-
export declare function
|
|
7
|
+
export declare function populateBatchLoader(em: EntityManager, meta: EntityMetadata, hint: LoadHint<any>, mode: "preload" | "intermixed", opts?: {
|
|
8
8
|
forceReload?: boolean;
|
|
9
|
-
}):
|
|
9
|
+
}): BatchLoader<{
|
|
10
10
|
entity: Entity;
|
|
11
11
|
hint: LoadHint<any>;
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=populateBatchLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"populateBatchLoader.d.ts","sourceRoot":"","sources":["../../src/batchloaders/populateBatchLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAEL,aAAa,EAOd,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAIxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAM5C,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAE5C,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,aAAa,EACjB,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,EACnB,IAAI,EAAE,SAAS,GAAG,YAAY,EAC9B,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GACnC,WAAW,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAA;CAAE,CAAC,CA2KtD"}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.populateOperation = void 0;
|
|
4
|
-
exports.
|
|
4
|
+
exports.populateBatchLoader = populateBatchLoader;
|
|
5
5
|
const HintTree_1 = require("../HintTree");
|
|
6
6
|
const index_1 = require("../index");
|
|
7
7
|
const reactiveHints_1 = require("../reactiveHints");
|
|
8
8
|
const ReactiveField_1 = require("../relations/ReactiveField");
|
|
9
9
|
const utils_1 = require("../utils");
|
|
10
|
+
const loadBatchLoader_1 = require("./loadBatchLoader");
|
|
11
|
+
const manyToManyBatchLoader_1 = require("./manyToManyBatchLoader");
|
|
12
|
+
const oneToManyBatchLoader_1 = require("./oneToManyBatchLoader");
|
|
13
|
+
const oneToOneBatchLoader_1 = require("./oneToOneBatchLoader");
|
|
10
14
|
exports.populateOperation = "populate";
|
|
11
|
-
function
|
|
15
|
+
function populateBatchLoader(em, meta, hint, mode, opts = {}) {
|
|
12
16
|
// For batching populates, we want different levels of course-ness:
|
|
13
17
|
// - preloading populates that are only SQL should be batched together as much as possible, but
|
|
14
18
|
// - intermixed populates (some with custom relations) should be batched as separately as possible
|
|
@@ -24,7 +28,7 @@ function populateDataLoader(em, meta, hint, mode, opts = {}) {
|
|
|
24
28
|
const batchKey = mode === "preload"
|
|
25
29
|
? `${meta.tagName}:${opts.forceReload}`
|
|
26
30
|
: `${meta.tagName}:${JSON.stringify(hint)}:${opts.forceReload}`;
|
|
27
|
-
return em.
|
|
31
|
+
return em.getBatchLoader(exports.populateOperation, batchKey, async (populates) => {
|
|
28
32
|
async function populateLayer(layerMeta, layerNode) {
|
|
29
33
|
// Skip join-based preloading if nothing in this layer needs loading. If any entity in the list
|
|
30
34
|
// needs loading, just load everything
|
|
@@ -32,7 +36,11 @@ function populateDataLoader(em, meta, hint, mode, opts = {}) {
|
|
|
32
36
|
// We may not have a layerMeta if we're going through non-field properties
|
|
33
37
|
if (preloader && layerMeta) {
|
|
34
38
|
const preloadThisLayer = Object.entries(layerNode.hints).some(([key, hint]) => {
|
|
35
|
-
|
|
39
|
+
for (const entity of hint.entities) {
|
|
40
|
+
if (entity[key]?.isLoaded === false && !entity[key]?.isPreloaded)
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
36
44
|
});
|
|
37
45
|
if (preloadThisLayer) {
|
|
38
46
|
// Do an up-front SQL call of `select id, ...preloads... from table`,
|
|
@@ -67,16 +75,20 @@ function populateDataLoader(em, meta, hint, mode, opts = {}) {
|
|
|
67
75
|
}
|
|
68
76
|
}
|
|
69
77
|
}
|
|
70
|
-
//
|
|
71
|
-
const
|
|
72
|
-
|
|
78
|
+
// First pass: batch SQL relations directly, fall back to relation.load() for non-SQL
|
|
79
|
+
const batchPromises = new Set();
|
|
80
|
+
const relationsToPreload = [];
|
|
81
|
+
const fallbackPromises = [];
|
|
82
|
+
for (const [key, tree] of Object.entries(layerNode.hints)) {
|
|
83
|
+
const field = layerMeta?.allFields[key];
|
|
84
|
+
for (const entity of tree.entities) {
|
|
73
85
|
const relation = (0, reactiveHints_1.getRelationFromMaybePolyKey)(entity, key);
|
|
74
86
|
// This happens to let through non-relation hints like 'name' on user, which wasn't intentional,
|
|
75
|
-
// but currently doesn't blow up (somehow), and is
|
|
87
|
+
// but currently doesn't blow up (somehow), and is depended on by internal tests.
|
|
76
88
|
if (!relation || typeof relation.load !== "function") {
|
|
77
89
|
// We don't want to throw on poly hints, because they're not actually loaded on the entity
|
|
78
90
|
if ((0, reactiveHints_1.isPolyHint)(key))
|
|
79
|
-
|
|
91
|
+
continue;
|
|
80
92
|
throw new Error(`Invalid load hint '${key}' on ${entity}`);
|
|
81
93
|
}
|
|
82
94
|
// If we're populating a hasReactiveField, don't bother loading it
|
|
@@ -88,61 +100,92 @@ function populateDataLoader(em, meta, hint, mode, opts = {}) {
|
|
|
88
100
|
// So we go ahead and call `.load()`, assuming it will just load its cached value, but it
|
|
89
101
|
// will also check internally if it's marked for recalc, and load its load hint if necessary.
|
|
90
102
|
if (relation instanceof ReactiveField_1.ReactiveFieldImpl && relation.isSet)
|
|
91
|
-
|
|
103
|
+
continue;
|
|
92
104
|
if (relation.isLoaded && !opts.forceReload)
|
|
93
|
-
|
|
94
|
-
// Avoid creating a promise for preloaded relations
|
|
105
|
+
continue;
|
|
95
106
|
if (relation.isPreloaded) {
|
|
96
107
|
relation.preload();
|
|
97
|
-
|
|
108
|
+
continue;
|
|
98
109
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
110
|
+
// For non-derived SQL relations on existing entities, use batch loaders directly
|
|
111
|
+
// (1 shared promise per batch instead of per-entity async overhead).
|
|
112
|
+
// Skip new entities (no id) and derived relations (reactive m2m/m2o have extra logic in load).
|
|
113
|
+
if (!entity.isNewEntity && field) {
|
|
114
|
+
if (field.kind === "o2m") {
|
|
115
|
+
batchPromises.add((0, oneToManyBatchLoader_1.oneToManyBatchLoader)(em, relation).load(entity.idTagged));
|
|
116
|
+
relationsToPreload.push(relation);
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
else if (field.kind === "m2m" && !field.derived) {
|
|
120
|
+
batchPromises.add((0, manyToManyBatchLoader_1.manyToManyBatchLoader)(em, relation).load(`${relation.columnName}=${entity.id}`));
|
|
121
|
+
relationsToPreload.push(relation);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
else if (field.kind === "o2o") {
|
|
125
|
+
batchPromises.add((0, oneToOneBatchLoader_1.oneToOneBatchLoader)(em, relation).load(entity.idTagged));
|
|
126
|
+
relationsToPreload.push(relation);
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
else if (field.kind === "m2o" && !field.derived) {
|
|
130
|
+
const taggedId = relation.idTaggedMaybe;
|
|
131
|
+
if (taggedId) {
|
|
132
|
+
batchPromises.add((0, loadBatchLoader_1.loadBatchLoader)(em, field.otherMetadata()).load({ taggedId, hint: undefined }));
|
|
133
|
+
relationsToPreload.push(relation);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
fallbackPromises.push(relation.load(opts));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (batchPromises.size > 0 || fallbackPromises.length > 0) {
|
|
142
|
+
await Promise.all([...batchPromises, ...fallbackPromises]);
|
|
143
|
+
}
|
|
144
|
+
for (const relation of relationsToPreload) {
|
|
145
|
+
relation.preload();
|
|
146
|
+
}
|
|
102
147
|
// 2nd breadth-width pass to do nested load hints, this will fan out at the sibling level.
|
|
103
148
|
// i.e. populateLayer(...reviews...) & populateLayer(...comments...)
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
149
|
+
let nestedLoadPromises;
|
|
150
|
+
for (const [key, tree] of Object.entries(layerNode.hints)) {
|
|
151
|
+
if (Object.keys(tree.hints).length === 0)
|
|
152
|
+
continue;
|
|
153
|
+
// Get the children we found, i.e. [a1, a2, a3] -> all of their books
|
|
154
|
+
const childrenByParent = new Map();
|
|
155
|
+
for (const entity of tree.entities) {
|
|
156
|
+
const relation = (0, reactiveHints_1.getRelationFromMaybePolyKey)(entity, key);
|
|
157
|
+
childrenByParent.set(entity, relation ? (0, utils_1.toArray)(getEvenDeleted(relation)) : []);
|
|
158
|
+
}
|
|
159
|
+
if (childrenByParent.size === 0)
|
|
160
|
+
continue;
|
|
161
|
+
// Rewrite our node.entities to be the next layer of children, i.e. children will be all books, for all of
|
|
162
|
+
// `[a1, a2, a3]`, but only the books of `a2` need to recurse into `book: reviews` and only the books of
|
|
163
|
+
// `a3` need to recurse into `book: comments`, so swap `node.entities` (which is currently authors)
|
|
164
|
+
// with the books. This is what prevents our dataloader-merged TreeHint from over-fetching and loading
|
|
165
|
+
// the superset load hint for all entities.
|
|
166
|
+
function rewrite(node) {
|
|
167
|
+
const next = new Set();
|
|
168
|
+
for (const entity of node.entities) {
|
|
169
|
+
const children = childrenByParent.get(entity);
|
|
170
|
+
if (children)
|
|
171
|
+
for (const child of children)
|
|
172
|
+
next.add(child);
|
|
124
173
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
174
|
+
node.entities = next;
|
|
175
|
+
Object.values(node.hints).forEach((node) => rewrite(node));
|
|
176
|
+
}
|
|
177
|
+
rewrite(tree);
|
|
178
|
+
const nextMeta = layerMeta?.allFields[key]?.otherMetadata?.();
|
|
179
|
+
(nestedLoadPromises ??= []).push(populateLayer(nextMeta, tree));
|
|
180
|
+
}
|
|
181
|
+
if (nestedLoadPromises)
|
|
182
|
+
await Promise.all(nestedLoadPromises);
|
|
131
183
|
}
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
// We always disable caching, because during a UoW, having called `populate(author, nestedHint1)`
|
|
135
|
-
// once doesn't mean that, on the 2nd call to `populate(author, nestedHint1)`, we can completely
|
|
136
|
-
// skip it b/c author's relations may have been changed/mutated to different not-yet-loaded
|
|
137
|
-
// entities.
|
|
138
|
-
//
|
|
139
|
-
// Even though having `{ cache: false }` looks weird here, i.e. why use dataloader at all?, it
|
|
140
|
-
// still helps us fan-in resolvers callers that are happening ~simultaneously into the same
|
|
141
|
-
// effort.
|
|
142
|
-
{ cache: false });
|
|
184
|
+
await populateLayer(meta, (0, HintTree_1.buildHintTree)(populates));
|
|
185
|
+
});
|
|
143
186
|
}
|
|
144
187
|
/** Probes `relation` to see if it's a m2o/o2m/m2m relation that supports `getWithDeleted`, otherwise calls `get`. */
|
|
145
188
|
function getEvenDeleted(relation) {
|
|
146
189
|
return "getWithDeleted" in relation ? relation.getWithDeleted : relation.get;
|
|
147
190
|
}
|
|
148
|
-
//# sourceMappingURL=
|
|
191
|
+
//# sourceMappingURL=populateBatchLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"populateBatchLoader.js","sourceRoot":"","sources":["../../src/batchloaders/populateBatchLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Entity } from "../Entity";
|
|
2
|
+
import { EntityManager } from "../EntityManager";
|
|
3
|
+
import { RecursiveChildrenCollectionImpl } from "../relations/RecursiveCollection";
|
|
4
|
+
import { BatchLoader } from "./BatchLoader";
|
|
5
|
+
export declare const recursiveChildrenOperation = "o2m-recursive";
|
|
6
|
+
export declare function recursiveChildrenBatchLoader<T extends Entity, U extends Entity>(em: EntityManager, collection: RecursiveChildrenCollectionImpl<T, U>): BatchLoader<Entity>;
|
|
7
|
+
//# sourceMappingURL=recursiveChildrenBatchLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recursiveChildrenBatchLoader.d.ts","sourceRoot":"","sources":["../../src/batchloaders/recursiveChildrenBatchLoader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,aAAa,EAAoB,MAAM,kBAAkB,CAAC;AAcnE,OAAO,EAAE,+BAA+B,EAAE,MAAM,kCAAkC,CAAC;AAEnF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,eAAO,MAAM,0BAA0B,kBAAkB,CAAC;AAE1D,wBAAgB,4BAA4B,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EAC7E,EAAE,EAAE,aAAa,EACjB,UAAU,EAAE,+BAA+B,CAAC,CAAC,EAAE,CAAC,CAAC,GAChD,WAAW,CAAC,MAAM,CAAC,CAqErB"}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.recursiveChildrenOperation = void 0;
|
|
4
|
-
exports.
|
|
4
|
+
exports.recursiveChildrenBatchLoader = recursiveChildrenBatchLoader;
|
|
5
5
|
const configure_1 = require("../configure");
|
|
6
6
|
const EntityManager_1 = require("../EntityManager");
|
|
7
7
|
const index_1 = require("../index");
|
|
8
8
|
const utils_1 = require("../utils");
|
|
9
9
|
exports.recursiveChildrenOperation = "o2m-recursive";
|
|
10
|
-
function
|
|
10
|
+
function recursiveChildrenBatchLoader(em, collection) {
|
|
11
11
|
let { meta, fieldName } = collection;
|
|
12
12
|
// This could be called from subtypes to get relations defined on the parent. So we need to make sure we are using the
|
|
13
13
|
// correct meta by walking the inheritance tree until we find the meta that actually has the root o2m field
|
|
14
14
|
while (!(collection.o2mFieldName in meta.fields) && meta.baseType)
|
|
15
15
|
meta = (0, configure_1.getMetadataForType)(meta.baseType);
|
|
16
16
|
const batchKey = `${meta.tableName}-${fieldName}`;
|
|
17
|
-
return em.
|
|
17
|
+
return em.getBatchLoader(exports.recursiveChildrenOperation, batchKey, async (parents) => {
|
|
18
18
|
const o2m = meta.allFields[collection.o2mFieldName];
|
|
19
19
|
const m2o = meta.allFields[o2m.otherFieldName];
|
|
20
20
|
const { columnName } = m2o.serde.columns[0];
|
|
@@ -70,8 +70,6 @@ function recursiveChildrenDataLoader(em, collection) {
|
|
|
70
70
|
entity[o2m.fieldName].preload();
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
|
-
// We used preloading to load keys + any recursive keys, so the return value doesn't matter
|
|
74
|
-
return parents.map(() => []);
|
|
75
73
|
});
|
|
76
74
|
}
|
|
77
|
-
//# sourceMappingURL=
|
|
75
|
+
//# sourceMappingURL=recursiveChildrenBatchLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recursiveChildrenBatchLoader.js","sourceRoot":"","sources":["../../src/batchloaders/recursiveChildrenBatchLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Entity } from "../Entity";
|
|
2
|
+
import { EntityManager } from "../EntityManager";
|
|
3
|
+
import { RecursiveParentsCollectionImpl } from "../relations/RecursiveCollection";
|
|
4
|
+
import { BatchLoader } from "./BatchLoader";
|
|
5
|
+
export declare const recursiveParentsOperation = "m2o-recursive";
|
|
6
|
+
export declare function recursiveParentsBatchLoader<T extends Entity, U extends Entity>(em: EntityManager, collection: RecursiveParentsCollectionImpl<T, U>): BatchLoader<Entity>;
|
|
7
|
+
//# sourceMappingURL=recursiveParentsBatchLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recursiveParentsBatchLoader.d.ts","sourceRoot":"","sources":["../../src/batchloaders/recursiveParentsBatchLoader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AASjD,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAElF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,eAAO,MAAM,yBAAyB,kBAAkB,CAAC;AAEzD,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EAC5E,EAAE,EAAE,aAAa,EACjB,UAAU,EAAE,8BAA8B,CAAC,CAAC,EAAE,CAAC,CAAC,GAC/C,WAAW,CAAC,MAAM,CAAC,CAmDrB"}
|