joist-core 2.2.0 → 2.3.0-next.2
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/Aliases.d.ts.map +1 -1
- package/build/Aliases.js.map +1 -1
- package/build/BaseEntity.d.ts +2 -0
- package/build/BaseEntity.d.ts.map +1 -1
- package/build/BaseEntity.js +1 -1
- package/build/BaseEntity.js.map +1 -1
- package/build/Entity.d.ts +1 -0
- package/build/Entity.d.ts.map +1 -1
- package/build/EntityFilter.d.ts +29 -10
- package/build/EntityFilter.d.ts.map +1 -1
- package/build/EntityFilter.js +18 -0
- package/build/EntityFilter.js.map +1 -1
- package/build/EntityGraphQLFilter.d.ts +3 -0
- package/build/EntityGraphQLFilter.d.ts.map +1 -1
- package/build/EntityGraphQLFilter.js.map +1 -1
- package/build/EntityManager.d.ts +36 -50
- package/build/EntityManager.d.ts.map +1 -1
- package/build/EntityManager.js +248 -124
- package/build/EntityManager.js.map +1 -1
- package/build/EntityMetadata.d.ts +48 -2
- package/build/EntityMetadata.d.ts.map +1 -1
- package/build/EntityMetadata.js +17 -0
- package/build/EntityMetadata.js.map +1 -1
- package/build/IndexManager.d.ts +5 -5
- package/build/IndexManager.d.ts.map +1 -1
- package/build/IndexManager.js +48 -32
- package/build/IndexManager.js.map +1 -1
- package/build/InstanceData.d.ts +16 -2
- package/build/InstanceData.d.ts.map +1 -1
- package/build/InstanceData.js +37 -4
- package/build/InstanceData.js.map +1 -1
- package/build/IsLoadedCache.d.ts.map +1 -1
- package/build/IsLoadedCache.js +31 -25
- package/build/IsLoadedCache.js.map +1 -1
- package/build/JoinRows.d.ts +54 -12
- package/build/JoinRows.d.ts.map +1 -1
- package/build/JoinRows.js +114 -44
- package/build/JoinRows.js.map +1 -1
- package/build/QueryParser.collectionJoins.js +8 -2
- package/build/QueryParser.collectionJoins.js.map +1 -1
- package/build/QueryParser.d.ts +15 -3
- package/build/QueryParser.d.ts.map +1 -1
- package/build/QueryParser.js +293 -190
- package/build/QueryParser.js.map +1 -1
- package/build/QueryParser.pruning.d.ts.map +1 -1
- package/build/QueryParser.pruning.js +8 -1
- package/build/QueryParser.pruning.js.map +1 -1
- package/build/QueryParser.test.d.ts +2 -0
- package/build/QueryParser.test.d.ts.map +1 -0
- package/build/QueryParser.test.js +27 -0
- package/build/QueryParser.test.js.map +1 -0
- package/build/ReactionsManager.d.ts +2 -1
- package/build/ReactionsManager.d.ts.map +1 -1
- package/build/ReactionsManager.js +53 -49
- package/build/ReactionsManager.js.map +1 -1
- package/build/Todo.d.ts +4 -0
- package/build/Todo.d.ts.map +1 -1
- package/build/Todo.js.map +1 -1
- package/build/batchloaders/BatchLoader.d.ts.map +1 -1
- package/build/batchloaders/BatchLoader.js +6 -1
- package/build/batchloaders/BatchLoader.js.map +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.d.ts +7 -0
- package/build/batchloaders/enumCollectionBatchLoader.d.ts.map +1 -0
- package/build/batchloaders/enumCollectionBatchLoader.js +54 -0
- package/build/batchloaders/enumCollectionBatchLoader.js.map +1 -0
- package/build/batchloaders/manyToManyBatchLoader.d.ts.map +1 -1
- package/build/batchloaders/manyToManyBatchLoader.js +10 -2
- package/build/batchloaders/manyToManyBatchLoader.js.map +1 -1
- package/build/batchloaders/populateBatchLoader.d.ts.map +1 -1
- package/build/batchloaders/populateBatchLoader.js +26 -8
- package/build/batchloaders/populateBatchLoader.js.map +1 -1
- package/build/batchloaders/recursiveChildrenBatchLoader.d.ts.map +1 -1
- package/build/batchloaders/recursiveChildrenBatchLoader.js +2 -0
- package/build/batchloaders/recursiveChildrenBatchLoader.js.map +1 -1
- package/build/batchloaders/recursiveM2mBatchLoader.d.ts.map +1 -1
- package/build/batchloaders/recursiveM2mBatchLoader.js +1 -3
- package/build/batchloaders/recursiveM2mBatchLoader.js.map +1 -1
- package/build/batchloaders/recursiveParentsBatchLoader.d.ts.map +1 -1
- package/build/batchloaders/recursiveParentsBatchLoader.js +2 -0
- package/build/batchloaders/recursiveParentsBatchLoader.js.map +1 -1
- package/build/changes.d.ts +13 -0
- package/build/changes.d.ts.map +1 -1
- package/build/changes.js +49 -0
- package/build/changes.js.map +1 -1
- package/build/configure.d.ts +5 -3
- package/build/configure.d.ts.map +1 -1
- package/build/configure.js +70 -0
- package/build/configure.js.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.d.ts +15 -0
- package/build/dataloaders/fastWhereFilterHash.d.ts.map +1 -0
- package/build/dataloaders/fastWhereFilterHash.js +164 -0
- package/build/dataloaders/fastWhereFilterHash.js.map +1 -0
- package/build/dataloaders/fastWhereFilterHash.test.d.ts +2 -0
- package/build/dataloaders/fastWhereFilterHash.test.d.ts.map +1 -0
- package/build/dataloaders/fastWhereFilterHash.test.js +59 -0
- package/build/dataloaders/fastWhereFilterHash.test.js.map +1 -0
- package/build/dataloaders/findCountDataLoader.d.ts +13 -4
- package/build/dataloaders/findCountDataLoader.d.ts.map +1 -1
- package/build/dataloaders/findCountDataLoader.js +58 -15
- package/build/dataloaders/findCountDataLoader.js.map +1 -1
- package/build/dataloaders/findDataLoader.d.ts +49 -10
- package/build/dataloaders/findDataLoader.d.ts.map +1 -1
- package/build/dataloaders/findDataLoader.js +217 -108
- package/build/dataloaders/findDataLoader.js.map +1 -1
- package/build/dataloaders/findIdsDataLoader.d.ts +1 -2
- package/build/dataloaders/findIdsDataLoader.d.ts.map +1 -1
- package/build/dataloaders/findIdsDataLoader.js +18 -17
- package/build/dataloaders/findIdsDataLoader.js.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.d.ts.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.js +3 -3
- package/build/dataloaders/findOrCreateDataLoader.js.map +1 -1
- package/build/dataloaders/findPaginatedDataLoader.d.ts +7 -0
- package/build/dataloaders/findPaginatedDataLoader.d.ts.map +1 -0
- package/build/dataloaders/findPaginatedDataLoader.js +84 -0
- package/build/dataloaders/findPaginatedDataLoader.js.map +1 -0
- package/build/dataloaders/manyToManyFindDataLoader.js +7 -1
- package/build/dataloaders/manyToManyFindDataLoader.js.map +1 -1
- package/build/drivers/EntityWriter.js +13 -7
- package/build/drivers/EntityWriter.js.map +1 -1
- package/build/drivers/buildRawQuery.d.ts +6 -4
- package/build/drivers/buildRawQuery.d.ts.map +1 -1
- package/build/drivers/buildRawQuery.js +8 -4
- package/build/drivers/buildRawQuery.js.map +1 -1
- package/build/fields.d.ts +2 -0
- package/build/fields.d.ts.map +1 -1
- package/build/fields.js +18 -6
- package/build/fields.js.map +1 -1
- package/build/index.d.ts +3 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +4 -1
- package/build/index.js.map +1 -1
- package/build/keys.d.ts.map +1 -1
- package/build/keys.js +8 -6
- package/build/keys.js.map +1 -1
- package/build/loadHints.d.ts +13 -4
- package/build/loadHints.d.ts.map +1 -1
- package/build/loadHints.js +63 -9
- package/build/loadHints.js.map +1 -1
- package/build/loadLens.d.ts +11 -0
- package/build/loadLens.d.ts.map +1 -1
- package/build/loadLens.js +43 -10
- package/build/loadLens.js.map +1 -1
- package/build/newEntity.d.ts.map +1 -1
- package/build/newEntity.js +16 -14
- package/build/newEntity.js.map +1 -1
- package/build/newTestInstance.d.ts.map +1 -1
- package/build/newTestInstance.js +3 -0
- package/build/newTestInstance.js.map +1 -1
- package/build/normalizeHints.d.ts +7 -0
- package/build/normalizeHints.d.ts.map +1 -1
- package/build/normalizeHints.js +40 -2
- package/build/normalizeHints.js.map +1 -1
- package/build/preloading/JsonAggregatePreloader.d.ts.map +1 -1
- package/build/preloading/JsonAggregatePreloader.js +91 -9
- package/build/preloading/JsonAggregatePreloader.js.map +1 -1
- package/build/preloading/canPreload.d.ts +2 -2
- package/build/preloading/canPreload.d.ts.map +1 -1
- package/build/preloading/canPreload.js +3 -0
- package/build/preloading/canPreload.js.map +1 -1
- package/build/preloading/partitionHint.d.ts.map +1 -1
- package/build/preloading/partitionHint.js +10 -4
- package/build/preloading/partitionHint.js.map +1 -1
- package/build/reactiveHints.d.ts +2 -2
- package/build/reactiveHints.d.ts.map +1 -1
- package/build/reactiveHints.js +9 -0
- package/build/reactiveHints.js.map +1 -1
- package/build/relations/EnumCollection.d.ts +81 -0
- package/build/relations/EnumCollection.d.ts.map +1 -0
- package/build/relations/EnumCollection.js +211 -0
- package/build/relations/EnumCollection.js.map +1 -0
- package/build/relations/ManyToManyCollection.d.ts +1 -0
- package/build/relations/ManyToManyCollection.d.ts.map +1 -1
- package/build/relations/ManyToManyCollection.js +5 -2
- package/build/relations/ManyToManyCollection.js.map +1 -1
- package/build/relations/ManyToManyLargeCollection.d.ts +3 -2
- package/build/relations/ManyToManyLargeCollection.d.ts.map +1 -1
- package/build/relations/ManyToManyLargeCollection.js +7 -4
- package/build/relations/ManyToManyLargeCollection.js.map +1 -1
- package/build/relations/OneToManyCollection.d.ts.map +1 -1
- package/build/relations/OneToManyCollection.js +2 -2
- package/build/relations/OneToManyCollection.js.map +1 -1
- package/build/relations/OneToManyLargeCollection.d.ts.map +1 -1
- package/build/relations/OneToManyLargeCollection.js +2 -1
- package/build/relations/OneToManyLargeCollection.js.map +1 -1
- package/build/relations/ReactiveManyToMany.d.ts +1 -0
- package/build/relations/ReactiveManyToMany.d.ts.map +1 -1
- package/build/relations/ReactiveManyToMany.js +4 -1
- package/build/relations/ReactiveManyToMany.js.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.d.ts +1 -0
- package/build/relations/ReactiveManyToManyOtherSide.d.ts.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.js +4 -1
- package/build/relations/ReactiveManyToManyOtherSide.js.map +1 -1
- package/build/relations/RecursiveCollection.d.ts +2 -6
- package/build/relations/RecursiveCollection.d.ts.map +1 -1
- package/build/relations/RecursiveCollection.js +9 -17
- package/build/relations/RecursiveCollection.js.map +1 -1
- package/build/relations/RecursiveCycleError.d.ts +13 -0
- package/build/relations/RecursiveCycleError.d.ts.map +1 -0
- package/build/relations/RecursiveCycleError.js +15 -0
- package/build/relations/RecursiveCycleError.js.map +1 -0
- package/build/relations/hasOneThrough.d.ts.map +1 -1
- package/build/relations/hasOneThrough.js +6 -4
- package/build/relations/hasOneThrough.js.map +1 -1
- package/build/relations/hasProperty.d.ts +2 -1
- package/build/relations/hasProperty.d.ts.map +1 -1
- package/build/relations/hasProperty.js +15 -5
- package/build/relations/hasProperty.js.map +1 -1
- package/build/relations/index.d.ts +1 -0
- package/build/relations/index.d.ts.map +1 -1
- package/build/relations/index.js +5 -2
- package/build/relations/index.js.map +1 -1
- package/build/rules.js +1 -1
- package/build/rules.js.map +1 -1
- package/build/scopes.d.ts +185 -0
- package/build/scopes.d.ts.map +1 -0
- package/build/scopes.js +302 -0
- package/build/scopes.js.map +1 -0
- package/build/temporal.d.ts +32 -2
- package/build/temporal.d.ts.map +1 -1
- package/build/temporal.js +18 -0
- package/build/temporal.js.map +1 -1
- package/build/upsert.d.ts.map +1 -1
- package/build/upsert.js +9 -2
- package/build/upsert.js.map +1 -1
- package/build/utils.d.ts +2 -0
- package/build/utils.d.ts.map +1 -1
- package/build/utils.js +12 -0
- package/build/utils.js.map +1 -1
- package/package.json +8 -10
- package/build/caches.d.ts +0 -6
- package/build/caches.d.ts.map +0 -1
- package/build/caches.js +0 -42
- package/build/caches.js.map +0 -1
package/build/IndexManager.js
CHANGED
|
@@ -5,6 +5,7 @@ const Entity_1 = require("./Entity");
|
|
|
5
5
|
const EntityMetadata_1 = require("./EntityMetadata");
|
|
6
6
|
const relations_1 = require("./relations");
|
|
7
7
|
const utils_1 = require("./utils");
|
|
8
|
+
const emptySet = new Set();
|
|
8
9
|
// The test reproducing a n^2 with n=500 went from 100ms to 50ms if indexed
|
|
9
10
|
exports.indexThreshold = 500;
|
|
10
11
|
/**
|
|
@@ -25,27 +26,25 @@ class IndexManager {
|
|
|
25
26
|
isIndexed(tagName) {
|
|
26
27
|
return this.#indexes.has(tagName);
|
|
27
28
|
}
|
|
28
|
-
/** Enables indexing for an entity type and builds
|
|
29
|
-
enableIndexingForType(meta, entities) {
|
|
29
|
+
/** Enables indexing for an entity type and builds indexes for the requested fields. */
|
|
30
|
+
enableIndexingForType(meta, entities, where) {
|
|
30
31
|
const { tagName } = meta;
|
|
31
|
-
if (this.#indexes.has(tagName))
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
if (!this.#indexes.has(tagName)) {
|
|
33
|
+
this.#indexes.set(tagName, new Map());
|
|
34
|
+
}
|
|
35
|
+
const fieldNames = Object.keys(where);
|
|
36
|
+
const fieldIndexes = this.#indexes.get(tagName);
|
|
37
|
+
const missingFieldNames = fieldNames.filter((fieldName) => !fieldIndexes.has(fieldName));
|
|
38
|
+
if (missingFieldNames.length === 0)
|
|
39
|
+
return;
|
|
34
40
|
// If subtypes are involved, group by each subtype
|
|
35
41
|
if (meta.baseType || meta.subTypes.length > 0) {
|
|
36
42
|
[...(0, utils_1.groupBy)(entities, (e) => (0, EntityMetadata_1.getMetadata)(e)).entries()].forEach(([meta, entities]) => {
|
|
37
|
-
this.addEntitiesToIndex(meta, entities);
|
|
43
|
+
this.addEntitiesToIndex(meta, entities, missingFieldNames);
|
|
38
44
|
});
|
|
39
45
|
}
|
|
40
46
|
else {
|
|
41
|
-
this.addEntitiesToIndex(meta, entities);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
/** Adds an entity to all relevant indexes. */
|
|
45
|
-
maybeIndexEntity(entity) {
|
|
46
|
-
const meta = (0, EntityMetadata_1.getMetadata)(entity);
|
|
47
|
-
if (this.#indexes.has(meta.tagName)) {
|
|
48
|
-
this.addEntitiesToIndex(meta, [entity]);
|
|
47
|
+
this.addEntitiesToIndex(meta, entities, missingFieldNames);
|
|
49
48
|
}
|
|
50
49
|
}
|
|
51
50
|
/** Updates indexes when a field value changes. */
|
|
@@ -57,8 +56,7 @@ class IndexManager {
|
|
|
57
56
|
const fieldIndexes = this.#indexes.get(meta.tagName);
|
|
58
57
|
if (!fieldIndexes)
|
|
59
58
|
return; // Type not indexed
|
|
60
|
-
const
|
|
61
|
-
const fieldIndex = fieldIndexes.get(field.fieldName);
|
|
59
|
+
const fieldIndex = fieldIndexes.get(fieldName)?.index;
|
|
62
60
|
if (!fieldIndex)
|
|
63
61
|
return; // Field is not indexed
|
|
64
62
|
fieldIndex.remove(oldValue, entity);
|
|
@@ -68,7 +66,7 @@ class IndexManager {
|
|
|
68
66
|
* Finds entities matching the given where clause using indexes.
|
|
69
67
|
* Returns null if the type is not indexed (fallback to linear search).
|
|
70
68
|
*/
|
|
71
|
-
findMatching(meta, where) {
|
|
69
|
+
findMatching(meta, entities, where) {
|
|
72
70
|
const { tagName } = meta;
|
|
73
71
|
if (!this.#indexes.has(tagName)) {
|
|
74
72
|
throw new Error(`${meta.type} is not indexed`);
|
|
@@ -77,13 +75,13 @@ class IndexManager {
|
|
|
77
75
|
// Start with all entities of the 1st condition, then intersect (AND) each subsequent field in `where`
|
|
78
76
|
let candidates;
|
|
79
77
|
for (const [fieldName, value] of Object.entries(where)) {
|
|
80
|
-
|
|
81
|
-
const fieldCandidates =
|
|
78
|
+
this.indexUnindexedEntities(entities, fieldName);
|
|
79
|
+
const fieldCandidates = fieldIndexes.get(fieldName)?.index.get(value);
|
|
82
80
|
if (!candidates) {
|
|
83
|
-
candidates = fieldCandidates; // This is the 1st clause
|
|
81
|
+
candidates = fieldCandidates ?? emptySet; // This is the 1st clause
|
|
84
82
|
}
|
|
85
83
|
else {
|
|
86
|
-
candidates = intersectSets(candidates, fieldCandidates);
|
|
84
|
+
candidates = fieldCandidates ? intersectSets(candidates, fieldCandidates) : emptySet;
|
|
87
85
|
}
|
|
88
86
|
// Early exit if no candidates remain
|
|
89
87
|
if (candidates.size === 0)
|
|
@@ -95,28 +93,46 @@ class IndexManager {
|
|
|
95
93
|
return [...candidates];
|
|
96
94
|
}
|
|
97
95
|
// `entities` should all be of the exact same subtype
|
|
98
|
-
addEntitiesToIndex(meta, entities) {
|
|
96
|
+
addEntitiesToIndex(meta, entities, fieldNames) {
|
|
99
97
|
const { tagName } = meta;
|
|
100
98
|
const indexes = this.#indexes.get(tagName);
|
|
101
99
|
// Iterate over each field so we can do a shared fieldIndex lookup
|
|
102
|
-
for (const
|
|
103
|
-
|
|
104
|
-
if (!
|
|
105
|
-
|
|
106
|
-
|
|
100
|
+
for (const fieldName of fieldNames) {
|
|
101
|
+
const field = meta.allFields[fieldName];
|
|
102
|
+
if (!field)
|
|
103
|
+
continue;
|
|
104
|
+
let entry = indexes.get(fieldName);
|
|
105
|
+
if (!entry) {
|
|
106
|
+
entry = { field, index: new FieldIndex(), indexedCount: 0 };
|
|
107
|
+
indexes.set(fieldName, entry);
|
|
107
108
|
}
|
|
108
109
|
for (const entity of entities) {
|
|
109
|
-
const value = getFieldValue(entity, fieldName);
|
|
110
|
-
|
|
110
|
+
const value = getFieldValue(entity, fieldName, entry.field);
|
|
111
|
+
entry.index.add(value, entity);
|
|
111
112
|
}
|
|
113
|
+
entry.indexedCount = entities.length;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Lazily indexes newly-registered entities only for fields that are queried. */
|
|
117
|
+
indexUnindexedEntities(entities, fieldName) {
|
|
118
|
+
const first = entities[0];
|
|
119
|
+
if (first === undefined)
|
|
120
|
+
return;
|
|
121
|
+
const meta = (0, EntityMetadata_1.getMetadata)(first);
|
|
122
|
+
const entry = this.#indexes.get(meta.tagName)?.get(fieldName);
|
|
123
|
+
if (entry === undefined || entry.indexedCount === entities.length)
|
|
124
|
+
return;
|
|
125
|
+
for (let i = entry.indexedCount; i < entities.length; i++) {
|
|
126
|
+
const entity = entities[i];
|
|
127
|
+
const value = getFieldValue(entity, fieldName, entry.field);
|
|
128
|
+
entry.index.add(value, entity);
|
|
112
129
|
}
|
|
130
|
+
entry.indexedCount = entities.length;
|
|
113
131
|
}
|
|
114
132
|
}
|
|
115
133
|
exports.IndexManager = IndexManager;
|
|
116
134
|
// Use the same field access pattern as entityMatches
|
|
117
|
-
function getFieldValue(entity, fieldName) {
|
|
118
|
-
const meta = (0, EntityMetadata_1.getMetadata)(entity);
|
|
119
|
-
const field = meta.allFields[fieldName] ?? fail();
|
|
135
|
+
function getFieldValue(entity, fieldName, field) {
|
|
120
136
|
const fn = fieldName;
|
|
121
137
|
switch (field.kind) {
|
|
122
138
|
case "primaryKey":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IndexManager.js","sourceRoot":"","sources":["../src/IndexManager.ts"],"names":[],"mappings":";;;AAAA,qCAA4C;AAC5C,
|
|
1
|
+
{"version":3,"file":"IndexManager.js","sourceRoot":"","sources":["../src/IndexManager.ts"],"names":[],"mappings":"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"}
|
package/build/InstanceData.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ import { EntityMetadata } from "./EntityMetadata";
|
|
|
4
4
|
/** The `#orm` metadata field we track on each instance. */
|
|
5
5
|
export declare class InstanceData {
|
|
6
6
|
#private;
|
|
7
|
+
/** The entity this instance data belongs to. */
|
|
8
|
+
readonly entity: Entity;
|
|
7
9
|
/** All entities must be associated to an `EntityManager` to handle lazy loading/etc. */
|
|
8
10
|
readonly em: EntityManager;
|
|
9
11
|
/** A pointer to our entity type's metadata. */
|
|
@@ -22,10 +24,12 @@ export declare class InstanceData {
|
|
|
22
24
|
flushedData: Record<any, any> | undefined;
|
|
23
25
|
/** The `a#1`, `a#2` index if we're an em.create-d entity. We never unset this, to keep ids stable across flushes. */
|
|
24
26
|
createId: string | undefined;
|
|
27
|
+
/** The zero-based order this entity was registered with its EntityManager. */
|
|
28
|
+
entityIndex: number;
|
|
25
29
|
/** Whether our entity should flush regardless of any other changes. */
|
|
26
30
|
isTouched: boolean;
|
|
27
31
|
/** Creates the `#orm` field. */
|
|
28
|
-
constructor(em: EntityManager, metadata: EntityMetadata, isNew: boolean);
|
|
32
|
+
constructor(em: EntityManager, entity: Entity, metadata: EntityMetadata, isNew: boolean);
|
|
29
33
|
/** If `em.flush` has detected a dirty RQF, reset our internal dirty state, w/o reseting our external-dirty state. */
|
|
30
34
|
resetForRqfLoop(): void;
|
|
31
35
|
resetAfterFlushed(): void;
|
|
@@ -41,8 +45,18 @@ export declare class InstanceData {
|
|
|
41
45
|
/** Called when an `em.load` tries to find the entity and it's just gone from the db. */
|
|
42
46
|
markDeletedBecauseNotFound(): void;
|
|
43
47
|
/** Called by `em.delete`, returns true if this is new information. */
|
|
44
|
-
markDeleted(
|
|
48
|
+
markDeleted(): boolean;
|
|
45
49
|
fixupCreatedThenDeleted(): void;
|
|
50
|
+
/** Marks this entity as needing a flush even if no fields changed. */
|
|
51
|
+
markTouched(): void;
|
|
52
|
+
/** Marks a field as dirty with its pre-mutation value. */
|
|
53
|
+
markFieldDirty(fieldName: string, value: any): void;
|
|
54
|
+
/** Marks a reverted field as clean again. */
|
|
55
|
+
markFieldClean(fieldName: string): void;
|
|
56
|
+
/** Marks this entity as a possible flush candidate. */
|
|
57
|
+
markMaybePending(): void;
|
|
58
|
+
/** Removes this entity from the possible flush candidate set. */
|
|
59
|
+
private unmarkMaybePending;
|
|
46
60
|
/** Remembers a reference value that may need to be reverse-walked later. */
|
|
47
61
|
rememberReferenceValue(fieldName: string, value: any): void;
|
|
48
62
|
/** Returns reference values that may need to be reverse-walked later. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InstanceData.d.ts","sourceRoot":"","sources":["../src/InstanceData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,aAAa,EAAoB,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,2DAA2D;AAC3D,qBAAa,YAAY;;IACvB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAM;IACjC,qEAAqE;IACrE,GAAG,EAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,kGAAkG;IAClG,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAM;IACpC,oGAAoG;IACpG,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAM;IACtD,4FAA4F;IAC5F,WAAW,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;IAW1C,qHAAqH;IACrH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,uEAAuE;IACvE,SAAS,EAAE,OAAO,CAAS;IAE3B,gCAAgC;gBACpB,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"InstanceData.d.ts","sourceRoot":"","sources":["../src/InstanceData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,aAAa,EAAoB,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,2DAA2D;AAC3D,qBAAa,YAAY;;IACvB,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAM;IACjC,qEAAqE;IACrE,GAAG,EAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,kGAAkG;IAClG,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAM;IACpC,oGAAoG;IACpG,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAM;IACtD,4FAA4F;IAC5F,WAAW,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;IAW1C,qHAAqH;IACrH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAM;IACzB,uEAAuE;IACvE,SAAS,EAAE,OAAO,CAAS;IAE3B,gCAAgC;gBACpB,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO;IAiBvF,qHAAqH;IACrH,eAAe;IAMf,iBAAiB;IAcjB,uCAAuC;IACvC,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,2CAA2C;IAC3C,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,yCAAyC;IACzC,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,wFAAwF;IACxF,IAAI,gBAAgB,IAAI,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,sBAAsB,CAmBvF;IAED,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED,wFAAwF;IACxF,0BAA0B,IAAI,IAAI;IAIlC,sEAAsE;IACtE,WAAW,IAAI,OAAO;IA2BtB,uBAAuB,IAAI,IAAI;IAM/B,sEAAsE;IACtE,WAAW,IAAI,IAAI;IAKnB,0DAA0D;IAC1D,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAKnD,6CAA6C;IAC7C,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKvC,uDAAuD;IACvD,gBAAgB,IAAI,IAAI;IAIxB,iEAAiE;IACjE,OAAO,CAAC,kBAAkB;IAI1B,4EAA4E;IAC5E,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAM3D,yEAAyE;IACzE,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE;IAItD,IAAI,mBAAmB,IAAI,OAAO,CAEjC;IAED;;;;;;;;;;;OAWG;IACH,IAAI,UAAU,IAAI,OAAO,CAGxB;CACF"}
|
package/build/InstanceData.js
CHANGED
|
@@ -4,6 +4,8 @@ exports.InstanceData = void 0;
|
|
|
4
4
|
const EntityManager_1 = require("./EntityManager");
|
|
5
5
|
/** The `#orm` metadata field we track on each instance. */
|
|
6
6
|
class InstanceData {
|
|
7
|
+
/** The entity this instance data belongs to. */
|
|
8
|
+
entity;
|
|
7
9
|
/** All entities must be associated to an `EntityManager` to handle lazy loading/etc. */
|
|
8
10
|
em;
|
|
9
11
|
/** A pointer to our entity type's metadata. */
|
|
@@ -32,10 +34,13 @@ class InstanceData {
|
|
|
32
34
|
#new;
|
|
33
35
|
/** The `a#1`, `a#2` index if we're an em.create-d entity. We never unset this, to keep ids stable across flushes. */
|
|
34
36
|
createId;
|
|
37
|
+
/** The zero-based order this entity was registered with its EntityManager. */
|
|
38
|
+
entityIndex = -1;
|
|
35
39
|
/** Whether our entity should flush regardless of any other changes. */
|
|
36
40
|
isTouched = false;
|
|
37
41
|
/** Creates the `#orm` field. */
|
|
38
|
-
constructor(em, metadata, isNew) {
|
|
42
|
+
constructor(em, entity, metadata, isNew) {
|
|
43
|
+
this.entity = entity;
|
|
39
44
|
this.em = em;
|
|
40
45
|
this.metadata = metadata;
|
|
41
46
|
if (isNew) {
|
|
@@ -43,6 +48,8 @@ class InstanceData {
|
|
|
43
48
|
this.data = {};
|
|
44
49
|
this.row = {};
|
|
45
50
|
this.flushedData = undefined;
|
|
51
|
+
if (em)
|
|
52
|
+
this.markMaybePending();
|
|
46
53
|
}
|
|
47
54
|
else {
|
|
48
55
|
this.#new = undefined;
|
|
@@ -70,6 +77,7 @@ class InstanceData {
|
|
|
70
77
|
if (this.#deleted === Operation.Pending || this.#deleted === Operation.Flushed) {
|
|
71
78
|
this.#deleted = Operation.Complete;
|
|
72
79
|
}
|
|
80
|
+
this.unmarkMaybePending();
|
|
73
81
|
}
|
|
74
82
|
/** Our public-facing `isNewEntity`. */
|
|
75
83
|
get isNewEntity() {
|
|
@@ -115,7 +123,7 @@ class InstanceData {
|
|
|
115
123
|
this.#deleted = Operation.Complete;
|
|
116
124
|
}
|
|
117
125
|
/** Called by `em.delete`, returns true if this is new information. */
|
|
118
|
-
markDeleted(
|
|
126
|
+
markDeleted() {
|
|
119
127
|
if (this.#deleted === undefined) {
|
|
120
128
|
// Let any OneToManyCollection/ReactiveField/ReactiveReference.get caches know that they should recalc
|
|
121
129
|
// (i.e. their filterDeleted logic) by asserting the `deleteBook.author` field is changing.
|
|
@@ -123,8 +131,8 @@ class InstanceData {
|
|
|
123
131
|
// We only do reference/collection fields and skip the primitives, b/c we assume something like
|
|
124
132
|
// `{ books: "title" }` doesn't need `resetIsLoaded(..., "title")` b/c the same hint will also
|
|
125
133
|
// be watching "did books change", and so get reset that way.
|
|
126
|
-
if (field.kind === "m2o" || field.kind === "poly" || field.kind === "m2m") {
|
|
127
|
-
(0, EntityManager_1.getEmInternalApi)(this.em).isLoadedCache.resetIsLoaded(entity, field.fieldName);
|
|
134
|
+
if (field.kind === "m2o" || field.kind === "poly" || field.kind === "m2m" || field.kind === "m2mEnum") {
|
|
135
|
+
(0, EntityManager_1.getEmInternalApi)(this.em).isLoadedCache.resetIsLoaded(this.entity, field.fieldName);
|
|
128
136
|
}
|
|
129
137
|
else if (field.kind === "primitive" || field.kind === "enum" || field.kind === "primaryKey") {
|
|
130
138
|
// Any reactable watching these fields will also be watching reference/collection
|
|
@@ -140,6 +148,7 @@ class InstanceData {
|
|
|
140
148
|
}
|
|
141
149
|
}
|
|
142
150
|
this.#deleted = Operation.Pending;
|
|
151
|
+
this.markMaybePending();
|
|
143
152
|
return true;
|
|
144
153
|
}
|
|
145
154
|
return false;
|
|
@@ -147,6 +156,30 @@ class InstanceData {
|
|
|
147
156
|
fixupCreatedThenDeleted() {
|
|
148
157
|
// Ideally we could do this via `resetAfterFlushed`?
|
|
149
158
|
this.#deleted = Operation.Complete;
|
|
159
|
+
this.unmarkMaybePending();
|
|
160
|
+
}
|
|
161
|
+
/** Marks this entity as needing a flush even if no fields changed. */
|
|
162
|
+
markTouched() {
|
|
163
|
+
this.isTouched = true;
|
|
164
|
+
this.markMaybePending();
|
|
165
|
+
}
|
|
166
|
+
/** Marks a field as dirty with its pre-mutation value. */
|
|
167
|
+
markFieldDirty(fieldName, value) {
|
|
168
|
+
this.originalData[fieldName] = value;
|
|
169
|
+
this.markMaybePending();
|
|
170
|
+
}
|
|
171
|
+
/** Marks a reverted field as clean again. */
|
|
172
|
+
markFieldClean(fieldName) {
|
|
173
|
+
delete this.originalData[fieldName];
|
|
174
|
+
this.markMaybePending();
|
|
175
|
+
}
|
|
176
|
+
/** Marks this entity as a possible flush candidate. */
|
|
177
|
+
markMaybePending() {
|
|
178
|
+
(0, EntityManager_1.getEmInternalApi)(this.em).markMaybePending(this.entity);
|
|
179
|
+
}
|
|
180
|
+
/** Removes this entity from the possible flush candidate set. */
|
|
181
|
+
unmarkMaybePending() {
|
|
182
|
+
(0, EntityManager_1.getEmInternalApi)(this.em).unmarkMaybePending(this.entity);
|
|
150
183
|
}
|
|
151
184
|
/** Remembers a reference value that may need to be reverse-walked later. */
|
|
152
185
|
rememberReferenceValue(fieldName, value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InstanceData.js","sourceRoot":"","sources":["../src/InstanceData.ts"],"names":[],"mappings":";;;AACA,mDAAkE;AAGlE,2DAA2D;AAC3D,MAAa,YAAY;IACvB,wFAAwF;IAC/E,EAAE,CAAgB;IAC3B,+CAA+C;IACtC,QAAQ,CAAiB;IAClC,gDAAgD;IAChD,SAAS,GAAqB,EAAE,CAAC;IACjC,qEAAqE;IACrE,GAAG,CAAuB;IAC1B,kGAAkG;IAClG,IAAI,CAAsB;IAC1B,iFAAiF;IACjF,YAAY,GAAqB,EAAE,CAAC;IACpC,oGAAoG;IAC3F,gBAAgB,GAA0B,EAAE,CAAC;IACtD,4FAA4F;IAC5F,WAAW,CAA+B;IAC1C;;;;;;OAMG;IACH,QAAQ,CAAa;IACrB,wCAAwC;IACxC,IAAI,CAAa;IACjB,qHAAqH;IACrH,QAAQ,CAAqB;IAC7B,uEAAuE;IACvE,SAAS,GAAY,KAAK,CAAC;IAE3B,gCAAgC;IAChC,YAAY,EAAiB,EAAE,QAAwB,EAAE,KAAc;
|
|
1
|
+
{"version":3,"file":"InstanceData.js","sourceRoot":"","sources":["../src/InstanceData.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IsLoadedCache.d.ts","sourceRoot":"","sources":["../src/IsLoadedCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"IsLoadedCache.d.ts","sourceRoot":"","sources":["../src/IsLoadedCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,IAAI,IAAI,CAAC;CACvB;AAED,qBAAa,aAAa;;IAaxB,+FAA+F;IAC/F,GAAG,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IASnC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAKxC,yFAAyF;IACzF,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;CAsDvD"}
|
package/build/IsLoadedCache.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.IsLoadedCache = void 0;
|
|
4
4
|
const EntityMetadata_1 = require("./EntityMetadata");
|
|
5
|
-
const caches_1 = require("./caches");
|
|
6
5
|
class IsLoadedCache {
|
|
7
6
|
// Cache of `{ tag -> { fieldName -> Set<IsLoadedCachable> } }` to hold derived relations
|
|
8
7
|
// we can selectively invalidate by walking from the mutated field to any downstream
|
|
@@ -11,27 +10,32 @@ class IsLoadedCache {
|
|
|
11
10
|
// A dumb cache for things that are hard selectively invalidate (o2m.get, recursive collections,
|
|
12
11
|
// and custom references/collections), so any mutation resets these.
|
|
13
12
|
#naiveCache = new Set();
|
|
14
|
-
// Counter to
|
|
15
|
-
#
|
|
13
|
+
// Counter to skip reactive hint walking when no smart cache sets are populated.
|
|
14
|
+
#smartDirtySets = 0;
|
|
15
|
+
// Counter to fast-path resetIsLoaded when the naive cache is empty.
|
|
16
|
+
#naiveDirtySets = 0;
|
|
16
17
|
/** Adds a ReactiveField/Relation/Collection to be invalidated when its dependencies change. */
|
|
17
18
|
add(target) {
|
|
18
19
|
const meta = (0, EntityMetadata_1.getMetadata)(target.entity);
|
|
19
20
|
const set = ((this.#smartCache[meta.tagName] ??= {})[target.fieldName] ??= new Set());
|
|
20
|
-
if (set.size === 0)
|
|
21
|
-
this.#
|
|
21
|
+
if (set.size === 0) {
|
|
22
|
+
this.#smartDirtySets++;
|
|
23
|
+
}
|
|
22
24
|
set.add(target);
|
|
23
25
|
}
|
|
24
26
|
addNaive(target) {
|
|
25
27
|
if (this.#naiveCache.size === 0)
|
|
26
|
-
this.#
|
|
28
|
+
this.#naiveDirtySets++;
|
|
27
29
|
this.#naiveCache.add(target);
|
|
28
30
|
}
|
|
29
31
|
/** Resets any in-memory #isLoaded/#isCached caches that depend on `entity.fieldName`. */
|
|
30
32
|
resetIsLoaded(entity, fieldName) {
|
|
31
|
-
if (this.#
|
|
33
|
+
if (this.#smartDirtySets === 0 && this.#naiveDirtySets === 0)
|
|
32
34
|
return;
|
|
33
35
|
// Reset caches that we can deterministically find by walking the reactivity hints
|
|
34
|
-
this.#
|
|
36
|
+
if (this.#smartDirtySets > 0) {
|
|
37
|
+
this.#resetDownstreamReactables((0, EntityMetadata_1.getMetadata)(entity), fieldName);
|
|
38
|
+
}
|
|
35
39
|
// We could use this to invalidate m2o.get, but it doesn't work for collections
|
|
36
40
|
// with an orderBy, when the orderBy changes, so for now we use the blunt naiveCache.
|
|
37
41
|
// const field = meta.allFields[fieldName];
|
|
@@ -47,7 +51,7 @@ class IsLoadedCache {
|
|
|
47
51
|
for (const target of this.#naiveCache.values())
|
|
48
52
|
target.resetIsLoaded();
|
|
49
53
|
this.#naiveCache.clear();
|
|
50
|
-
this.#
|
|
54
|
+
this.#naiveDirtySets--;
|
|
51
55
|
}
|
|
52
56
|
}
|
|
53
57
|
/**
|
|
@@ -57,26 +61,28 @@ class IsLoadedCache {
|
|
|
57
61
|
*/
|
|
58
62
|
#resetDownstreamReactables(meta, fieldName) {
|
|
59
63
|
// These are reactables in other entities that are watching/reacting to this entity/fieldName
|
|
60
|
-
const reactables =
|
|
64
|
+
const reactables = meta.reactablesIncludingReadOnlyByField.get(fieldName);
|
|
65
|
+
if (reactables === undefined)
|
|
66
|
+
return;
|
|
61
67
|
for (const r of reactables) {
|
|
68
|
+
if (this.#smartDirtySets === 0)
|
|
69
|
+
return;
|
|
62
70
|
// I.e. we've written to Author.firstName, and this reactable in Book/otherMeta depends on it
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
this.#resetDownstreamReactables(otherMeta, otherField.fieldName);
|
|
75
|
-
}
|
|
71
|
+
const otherMeta = (0, EntityMetadata_1.getMetadata)(r.cstr);
|
|
72
|
+
// Find any cache entries for this cstr + name
|
|
73
|
+
const set = this.#smartCache[otherMeta.tagName]?.[r.name];
|
|
74
|
+
if (set?.size > 0) {
|
|
75
|
+
for (const target of set) {
|
|
76
|
+
target.resetIsLoaded();
|
|
77
|
+
// Is this target itself a RF/RR? If so, transitively reset its cache as well.
|
|
78
|
+
const otherMeta = (0, EntityMetadata_1.getMetadata)(target.entity);
|
|
79
|
+
const otherField = otherMeta.allFields[target.fieldName];
|
|
80
|
+
if ("derived" in otherField && otherField.derived) {
|
|
81
|
+
this.#resetDownstreamReactables(otherMeta, otherField.fieldName);
|
|
76
82
|
}
|
|
77
|
-
set.clear();
|
|
78
|
-
this.#dirtySets--;
|
|
79
83
|
}
|
|
84
|
+
set.clear();
|
|
85
|
+
this.#smartDirtySets--;
|
|
80
86
|
}
|
|
81
87
|
}
|
|
82
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IsLoadedCache.js","sourceRoot":"","sources":["../src/IsLoadedCache.ts"],"names":[],"mappings":";;;AACA,qDAA+D;
|
|
1
|
+
{"version":3,"file":"IsLoadedCache.js","sourceRoot":"","sources":["../src/IsLoadedCache.ts"],"names":[],"mappings":"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"}
|
package/build/JoinRows.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Entity } from "./Entity";
|
|
2
2
|
import { EntityMetadata } from "./EntityMetadata";
|
|
3
|
+
import { EnumMetadata } from "./EnumMetadata";
|
|
3
4
|
import { ReactionsManager } from "./ReactionsManager";
|
|
4
5
|
import { JoinRowTodo } from "./Todo";
|
|
5
6
|
/**
|
|
@@ -7,6 +8,11 @@ import { JoinRowTodo } from "./Todo";
|
|
|
7
8
|
*
|
|
8
9
|
* Specifically lets ReactiveManyToMany & ReactiveManyToManyOtherSide use JoinRows
|
|
9
10
|
* as if they were full-fledged m2m relations.
|
|
11
|
+
*
|
|
12
|
+
* The "other" side of the join table is usually a second entity, but for `EnumCollection`s
|
|
13
|
+
* (i.e. `Publisher.logoColors`) it is an enum table; in that case `otherEnum` is set and the
|
|
14
|
+
* other column's value is the enum's numeric id rather than an `Entity` (there is also no
|
|
15
|
+
* `otherMeta`/`otherFieldName`, since enums have no reverse collection to keep in sync).
|
|
10
16
|
*/
|
|
11
17
|
export type ManyToManyLike = {
|
|
12
18
|
entity: Entity;
|
|
@@ -14,29 +20,42 @@ export type ManyToManyLike = {
|
|
|
14
20
|
columnName: string;
|
|
15
21
|
otherColumnName: string;
|
|
16
22
|
fieldName: string;
|
|
17
|
-
otherFieldName: string;
|
|
18
23
|
meta: EntityMetadata;
|
|
19
|
-
|
|
24
|
+
/** Undefined when the other side is an enum. */
|
|
25
|
+
otherFieldName?: string;
|
|
26
|
+
/** Undefined when the other side is an enum. */
|
|
27
|
+
otherMeta?: EntityMetadata;
|
|
28
|
+
/** Set when the other side is an enum table, for mapping enum codes <-> their numeric ids. */
|
|
29
|
+
otherEnum?: EnumMetadata<any, any, number>;
|
|
30
|
+
/** Whether the join table has a surrogate `id` PK; if false the FK pair is the composite PK. */
|
|
31
|
+
hasJoinTableId: boolean;
|
|
20
32
|
};
|
|
33
|
+
/** The value of a join row's column: an `Entity`, or an enum's numeric id for `EnumCollection`s. */
|
|
34
|
+
export type JoinColumnValue = Entity | number;
|
|
21
35
|
/** A small holder around m2m join rows, which we treat as psuedo-entities. */
|
|
22
36
|
export declare class JoinRows {
|
|
37
|
+
#private;
|
|
23
38
|
readonly m2m: ManyToManyLike;
|
|
24
39
|
private rm;
|
|
25
40
|
private readonly rows;
|
|
26
41
|
private readonly index;
|
|
27
42
|
constructor(m2m: ManyToManyLike, rm: ReactionsManager);
|
|
28
43
|
/** Adds a new join row to this table. */
|
|
29
|
-
addNew(m2m: ManyToManyLike, e1: Entity, e2:
|
|
44
|
+
addNew(m2m: ManyToManyLike, e1: Entity, e2: JoinColumnValue): void;
|
|
30
45
|
/** Adds a new remove to this table. */
|
|
31
|
-
addRemove(m2m: ManyToManyLike, e1: Entity, e2:
|
|
46
|
+
addRemove(m2m: ManyToManyLike, e1: Entity, e2: JoinColumnValue): void;
|
|
32
47
|
/** Return any "old values" for a m2m collection that might need reactivity checks. */
|
|
33
|
-
removedFor(m2m: ManyToManyLike, e1: Entity):
|
|
34
|
-
addedFor(m2m: ManyToManyLike, e1: Entity):
|
|
48
|
+
removedFor(m2m: ManyToManyLike, e1: Entity): JoinColumnValue[];
|
|
49
|
+
addedFor(m2m: ManyToManyLike, e1: Entity): JoinColumnValue[];
|
|
35
50
|
/** Adds an existing join row to this table. */
|
|
36
|
-
addPreloadedRow(m2m: ManyToManyLike, id: number, e1: Entity, e2:
|
|
51
|
+
addPreloadedRow(m2m: ManyToManyLike, id: number | undefined, e1: Entity, e2: JoinColumnValue): void;
|
|
37
52
|
/** Look up/create our internal JoinRow psuedo-entities for the db rows. */
|
|
38
53
|
loadRows(tuples: [string, string][], dbRows: any[]): Promise<void>;
|
|
39
|
-
getOthers(columnName: string, entity: Entity):
|
|
54
|
+
getOthers(columnName: string, entity: Entity): JoinColumnValue[];
|
|
55
|
+
/** Drops all in-memory rows where `entity` is on `columnName`, e.g. when it is being deleted. */
|
|
56
|
+
removeAllFor(columnName: string, entity: Entity): void;
|
|
57
|
+
/** Drops a single `(e1, e2)` row without queuing a flush, e.g. when mirroring another em's removal. */
|
|
58
|
+
removePreloadedRow(m2m: ManyToManyLike, e1: Entity, e2: JoinColumnValue): void;
|
|
40
59
|
/** Scans our `rows` for newly-added/newly-deleted rows that need `INSERT`s/`UPDATE`s. */
|
|
41
60
|
toTodo(): JoinRowTodo | undefined;
|
|
42
61
|
get hasChanges(): boolean;
|
|
@@ -44,13 +63,14 @@ export declare class JoinRows {
|
|
|
44
63
|
/**
|
|
45
64
|
* A "psuedo-entity" for a join row.
|
|
46
65
|
*
|
|
47
|
-
* We treat this as a special entity, i.e. it has
|
|
48
|
-
*
|
|
66
|
+
* We treat this as a special entity, i.e. it has two "relations" to each entity for the current
|
|
67
|
+
* row, an optional surrogate `id` primary key, and an optional `created_at` column.
|
|
49
68
|
*
|
|
50
69
|
* These rows are immutable, i.e. once created we don't change either FK, and instead make
|
|
51
70
|
* collection changes only by inserting new rows and deleting old rows.
|
|
52
71
|
*
|
|
53
|
-
* This makes the column1+column2 combination a composite key.
|
|
72
|
+
* This makes the column1+column2 combination a composite key. For id-less join tables, that
|
|
73
|
+
* composite is the actual primary key and `id` is always undefined.
|
|
54
74
|
*/
|
|
55
75
|
export interface JoinRow {
|
|
56
76
|
/**
|
|
@@ -61,8 +81,30 @@ export interface JoinRow {
|
|
|
61
81
|
* - `completed` means we've been flushed and `em.flush` has completed
|
|
62
82
|
*/
|
|
63
83
|
op: JoinRowOperation;
|
|
84
|
+
/** The surrogate key for id-ful join tables; always undefined for id-less tables. */
|
|
64
85
|
id: number | undefined;
|
|
65
|
-
|
|
86
|
+
/**
|
|
87
|
+
* Whether this row exists (or is assumed to exist) in the database.
|
|
88
|
+
*
|
|
89
|
+
* This is orthogonal to `op` (the flush lifecycle) and is what distinguishes a pending insert
|
|
90
|
+
* from a pending delete: a `pending` row that is `!persisted` is a pending INSERT (added in
|
|
91
|
+
* memory, not yet in the db), while a `pending` row that is `persisted` is a pending DELETE
|
|
92
|
+
* (in the db, marked `deleted`). `op` alone cannot tell these apart, because both inserts and
|
|
93
|
+
* deletes walk the same `pending -> flushed -> completed` progression.
|
|
94
|
+
*
|
|
95
|
+
* We track this as its own flag rather than inferring it from `id` being set/unset, because
|
|
96
|
+
* id-less join tables (whose PK is just the composite of the two FKs) never have an `id` — so
|
|
97
|
+
* `id === undefined` would be ambiguous. `persisted` is the id-agnostic generalization of the
|
|
98
|
+
* `id`-is-set check that id-ful tables historically relied on.
|
|
99
|
+
*
|
|
100
|
+
* It must survive add/remove/re-add sequences: e.g. loading a row (persisted), removing it
|
|
101
|
+
* (pending delete), then re-adding it (`deleted` flipped back to false, `op` back to `pending`)
|
|
102
|
+
* leaves a `pending && !deleted` row that looks identical to a fresh insert — but it is still in
|
|
103
|
+
* the db, so a subsequent remove must issue a DELETE, which only `persisted` can tell us.
|
|
104
|
+
*/
|
|
105
|
+
persisted: boolean;
|
|
106
|
+
/** Maps each FK column to its value: an `Entity`, or (for `EnumCollection`s) an enum's numeric id. */
|
|
107
|
+
columns: Record<string, JoinColumnValue>;
|
|
66
108
|
created_at?: Date;
|
|
67
109
|
deleted?: boolean;
|
|
68
110
|
}
|
package/build/JoinRows.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JoinRows.d.ts","sourceRoot":"","sources":["../src/JoinRows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,cAAc,EAAuB,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAIrC
|
|
1
|
+
{"version":3,"file":"JoinRows.d.ts","sourceRoot":"","sources":["../src/JoinRows.ts"],"names":[],"mappings":"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"}
|