@belopash/typeorm-store 1.2.2 → 1.4.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/lib/cacheMap.d.ts +7 -9
- package/lib/cacheMap.d.ts.map +1 -1
- package/lib/cacheMap.js +8 -23
- package/lib/cacheMap.js.map +1 -1
- package/lib/database.d.ts +1 -0
- package/lib/database.d.ts.map +1 -1
- package/lib/database.js +4 -0
- package/lib/database.js.map +1 -1
- package/lib/deferList.d.ts +18 -0
- package/lib/deferList.d.ts.map +1 -0
- package/lib/{deferQueue.js → deferList.js} +8 -11
- package/lib/deferList.js.map +1 -0
- package/lib/store.d.ts +4 -2
- package/lib/store.d.ts.map +1 -1
- package/lib/store.js +111 -65
- package/lib/store.js.map +1 -1
- package/lib/updatesMap.d.ts +22 -0
- package/lib/updatesMap.d.ts.map +1 -0
- package/lib/{changeTracker.js → updatesMap.js} +23 -26
- package/lib/updatesMap.js.map +1 -0
- package/package.json +11 -10
- package/src/cacheMap.ts +9 -24
- package/src/database.ts +5 -0
- package/src/{deferQueue.ts → deferList.ts} +6 -9
- package/src/store.ts +135 -67
- package/src/updatesMap.ts +78 -0
- package/lib/changeTracker.d.ts +0 -24
- package/lib/changeTracker.d.ts.map +0 -1
- package/lib/changeTracker.js.map +0 -1
- package/lib/deferQueue.d.ts +0 -19
- package/lib/deferQueue.d.ts.map +0 -1
- package/lib/deferQueue.js.map +0 -1
- package/src/changeTracker.ts +0 -82
package/lib/cacheMap.d.ts
CHANGED
|
@@ -1,26 +1,24 @@
|
|
|
1
1
|
import { Entity } from '@subsquid/typeorm-store';
|
|
2
|
-
import {
|
|
2
|
+
import { EntityMetadata } from 'typeorm';
|
|
3
3
|
import { Logger } from '@subsquid/logger';
|
|
4
4
|
export declare class CachedEntity<E extends Entity> {
|
|
5
5
|
value: E | null;
|
|
6
6
|
constructor();
|
|
7
7
|
}
|
|
8
8
|
export declare class CacheMap {
|
|
9
|
-
private em;
|
|
10
9
|
private opts;
|
|
11
10
|
private map;
|
|
12
11
|
private logger;
|
|
13
|
-
constructor(
|
|
12
|
+
constructor(opts: {
|
|
14
13
|
logger: Logger;
|
|
15
14
|
});
|
|
16
|
-
exist
|
|
17
|
-
get<E extends Entity>(
|
|
18
|
-
ensure
|
|
19
|
-
delete
|
|
15
|
+
exist(metadata: EntityMetadata, id: string): boolean;
|
|
16
|
+
get<E extends Entity>(metadata: EntityMetadata, id: string): CachedEntity<E> | undefined;
|
|
17
|
+
ensure(metadata: EntityMetadata, id: string): void;
|
|
18
|
+
delete(metadata: EntityMetadata, id: string): void;
|
|
20
19
|
clear(): void;
|
|
21
|
-
add<E extends Entity>(
|
|
20
|
+
add<E extends Entity>(metadata: EntityMetadata, entity: E, isNew?: boolean): void;
|
|
22
21
|
private cacheEntity;
|
|
23
22
|
private getEntityCache;
|
|
24
|
-
private getEntityMetadata;
|
|
25
23
|
}
|
|
26
24
|
//# sourceMappingURL=cacheMap.d.ts.map
|
package/lib/cacheMap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cacheMap.d.ts","sourceRoot":"","sources":["../src/cacheMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAA;AAC9C,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"cacheMap.d.ts","sourceRoot":"","sources":["../src/cacheMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAA;AAC9C,OAAO,EAAC,cAAc,EAAC,MAAM,SAAS,CAAA;AAEtC,OAAO,EAAC,MAAM,EAAC,MAAM,kBAAkB,CAAA;AAEvC,qBAAa,YAAY,CAAC,CAAC,SAAS,MAAM;IACtC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;;CAKlB;AAED,qBAAa,QAAQ;IAIL,OAAO,CAAC,IAAI;IAHxB,OAAO,CAAC,GAAG,CAAiE;IAC5E,OAAO,CAAC,MAAM,CAAQ;gBAEF,IAAI,EAAE;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC;IAI1C,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM;IAM1C,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM;IAK1D,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM;IAS3C,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM;IAM3C,KAAK;IAUL,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO;IAI1E,OAAO,CAAC,WAAW;IA8CnB,OAAO,CAAC,cAAc;CASzB"}
|
package/lib/cacheMap.js
CHANGED
|
@@ -9,33 +9,28 @@ class CachedEntity {
|
|
|
9
9
|
}
|
|
10
10
|
exports.CachedEntity = CachedEntity;
|
|
11
11
|
class CacheMap {
|
|
12
|
-
constructor(
|
|
13
|
-
this.em = em;
|
|
12
|
+
constructor(opts) {
|
|
14
13
|
this.opts = opts;
|
|
15
14
|
this.map = new Map();
|
|
16
15
|
this.logger = this.opts.logger.child('cache');
|
|
17
16
|
}
|
|
18
|
-
exist(
|
|
19
|
-
const metadata = this.getEntityMetadata(entityClass);
|
|
17
|
+
exist(metadata, id) {
|
|
20
18
|
const cacheMap = this.getEntityCache(metadata);
|
|
21
19
|
const cachedEntity = cacheMap.get(id);
|
|
22
20
|
return !!cachedEntity?.value;
|
|
23
21
|
}
|
|
24
|
-
get(
|
|
25
|
-
const metadata = this.getEntityMetadata(entityClass);
|
|
22
|
+
get(metadata, id) {
|
|
26
23
|
const cacheMap = this.getEntityCache(metadata);
|
|
27
24
|
return cacheMap.get(id);
|
|
28
25
|
}
|
|
29
|
-
ensure(
|
|
30
|
-
const metadata = this.getEntityMetadata(entityClass);
|
|
26
|
+
ensure(metadata, id) {
|
|
31
27
|
const cacheMap = this.getEntityCache(metadata);
|
|
32
28
|
if (cacheMap.has(id))
|
|
33
29
|
return;
|
|
34
30
|
cacheMap.set(id, new CachedEntity());
|
|
35
31
|
this.logger.debug(`added empty entity ${metadata.name} ${id}`);
|
|
36
32
|
}
|
|
37
|
-
delete(
|
|
38
|
-
const metadata = this.getEntityMetadata(entityClass);
|
|
33
|
+
delete(metadata, id) {
|
|
39
34
|
const cacheMap = this.getEntityCache(metadata);
|
|
40
35
|
cacheMap.set(id, new CachedEntity());
|
|
41
36
|
this.logger.debug(`deleted entity ${metadata.name} ${id}`);
|
|
@@ -49,16 +44,10 @@ class CacheMap {
|
|
|
49
44
|
}
|
|
50
45
|
this.map.clear();
|
|
51
46
|
}
|
|
52
|
-
add(
|
|
53
|
-
|
|
54
|
-
if (entities.length === 0)
|
|
55
|
-
return;
|
|
56
|
-
for (const entity of entities) {
|
|
57
|
-
this.cacheEntity(entity, isNew);
|
|
58
|
-
}
|
|
47
|
+
add(metadata, entity, isNew) {
|
|
48
|
+
this.cacheEntity(metadata, entity, isNew);
|
|
59
49
|
}
|
|
60
|
-
cacheEntity(entity, isNew = false) {
|
|
61
|
-
const metadata = this.getEntityMetadata(entity.constructor);
|
|
50
|
+
cacheEntity(metadata, entity, isNew = false) {
|
|
62
51
|
const cacheMap = this.getEntityCache(metadata);
|
|
63
52
|
let cached = cacheMap.get(entity.id);
|
|
64
53
|
if (cached == null) {
|
|
@@ -105,10 +94,6 @@ class CacheMap {
|
|
|
105
94
|
}
|
|
106
95
|
return map;
|
|
107
96
|
}
|
|
108
|
-
getEntityMetadata(entityClass) {
|
|
109
|
-
const em = this.em();
|
|
110
|
-
return em.connection.getMetadata(entityClass);
|
|
111
|
-
}
|
|
112
97
|
}
|
|
113
98
|
exports.CacheMap = CacheMap;
|
|
114
99
|
//# sourceMappingURL=cacheMap.js.map
|
package/lib/cacheMap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cacheMap.js","sourceRoot":"","sources":["../src/cacheMap.ts"],"names":[],"mappings":";;;AAEA,mCAA4B;AAG5B,MAAa,YAAY;IAGrB;QACI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;IACrB,CAAC;CACJ;AAND,oCAMC;AAED,MAAa,QAAQ;IAIjB,YAAoB,
|
|
1
|
+
{"version":3,"file":"cacheMap.js","sourceRoot":"","sources":["../src/cacheMap.ts"],"names":[],"mappings":"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"}
|
package/lib/database.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export { IsolationLevel, TypeormDatabaseOptions };
|
|
|
5
5
|
export declare class TypeormDatabaseWithCache extends TypeormDatabase {
|
|
6
6
|
transact(info: FinalTxInfo, cb: (store: StoreWithCache) => Promise<void>): Promise<void>;
|
|
7
7
|
transactHot(info: HotTxInfo, cb: (store: StoreWithCache, block: HashAndHeight) => Promise<void>): Promise<void>;
|
|
8
|
+
transactHot2(info: HotTxInfo, cb: (store: StoreWithCache, sliceBeg: number, sliceEnd: number) => Promise<void>): Promise<void>;
|
|
8
9
|
private performUpdates;
|
|
9
10
|
}
|
|
10
11
|
//# sourceMappingURL=database.d.ts.map
|
package/lib/database.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,eAAe,EAAE,sBAAsB,EAAC,MAAM,yBAAyB,CAAA;AAE/F,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,aAAa,EAAC,MAAM,wCAAwC,CAAA;AAG5F,OAAO,EAAC,cAAc,EAAC,MAAM,SAAS,CAAA;AAEtC,OAAO,EAAC,cAAc,EAAE,sBAAsB,EAAC,CAAA;AAG/C,qBAAa,wBAAyB,SAAQ,eAAe;IAEzD,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxF,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,eAAe,EAAE,sBAAsB,EAAC,MAAM,yBAAyB,CAAA;AAE/F,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,aAAa,EAAC,MAAM,wCAAwC,CAAA;AAG5F,OAAO,EAAC,cAAc,EAAC,MAAM,SAAS,CAAA;AAEtC,OAAO,EAAC,cAAc,EAAE,sBAAsB,EAAC,CAAA;AAG/C,qBAAa,wBAAyB,SAAQ,eAAe;IAEzD,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxF,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/G,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAIhH,cAAc;CAmB/B"}
|
package/lib/database.js
CHANGED
|
@@ -17,6 +17,10 @@ class TypeormDatabaseWithCache extends typeorm_store_1.TypeormDatabase {
|
|
|
17
17
|
transactHot(info, cb) {
|
|
18
18
|
return super.transactHot(info, cb);
|
|
19
19
|
}
|
|
20
|
+
// @ts-ignore
|
|
21
|
+
transactHot2(info, cb) {
|
|
22
|
+
return super.transactHot2(info, cb);
|
|
23
|
+
}
|
|
20
24
|
async performUpdates(cb, em, changeTracker) {
|
|
21
25
|
let running = true;
|
|
22
26
|
let store = new store_1.StoreWithCache(() => {
|
package/lib/database.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":";;;;;;AAAA,2DAA+F;AAG/F,oDAA2B;AAE3B,mCAAsC;AAItC,aAAa;AACb,MAAa,wBAAyB,SAAQ,+BAAe;IACzD,aAAa;IACb,QAAQ,CAAC,IAAiB,EAAE,EAA4C;QACpE,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAS,CAAC,CAAA;IAC1C,CAAC;IAED,aAAa;IACb,WAAW,CAAC,IAAe,EAAE,EAAkE;QAC3F,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,EAAS,CAAC,CAAA;IAC7C,CAAC;IAEO,KAAK,CAAC,cAAc,CACxB,EAA4C,EAC5C,EAAiB,EACjB,aAA6B;QAE7B,IAAI,OAAO,GAAG,IAAI,CAAA;QAElB,IAAI,KAAK,GAAG,IAAI,sBAAc,CAAC,GAAG,EAAE;YAChC,IAAA,gBAAM,EAAC,OAAO,EAAE,mFAAmF,CAAC,CAAA;YACpG,OAAO,EAAE,CAAA;QACb,CAAC,EAAE,aAAa,CAAC,CAAA;QAEjB,IAAI,CAAC;YACD,MAAM,EAAE,CAAC,KAAK,CAAC,CAAA;YACf,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;QACvB,CAAC;gBAAS,CAAC;YACP,OAAO,GAAG,KAAK,CAAA;QACnB,CAAC;IACL,CAAC;CACJ;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":";;;;;;AAAA,2DAA+F;AAG/F,oDAA2B;AAE3B,mCAAsC;AAItC,aAAa;AACb,MAAa,wBAAyB,SAAQ,+BAAe;IACzD,aAAa;IACb,QAAQ,CAAC,IAAiB,EAAE,EAA4C;QACpE,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAS,CAAC,CAAA;IAC1C,CAAC;IAED,aAAa;IACb,WAAW,CAAC,IAAe,EAAE,EAAkE;QAC3F,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,EAAS,CAAC,CAAA;IAC7C,CAAC;IAED,aAAa;IACb,YAAY,CAAC,IAAe,EAAE,EAAgF;QAC1G,OAAO,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAS,CAAC,CAAA;IAC9C,CAAC;IAEO,KAAK,CAAC,cAAc,CACxB,EAA4C,EAC5C,EAAiB,EACjB,aAA6B;QAE7B,IAAI,OAAO,GAAG,IAAI,CAAA;QAElB,IAAI,KAAK,GAAG,IAAI,sBAAc,CAAC,GAAG,EAAE;YAChC,IAAA,gBAAM,EAAC,OAAO,EAAE,mFAAmF,CAAC,CAAA;YACpG,OAAO,EAAE,CAAA;QACb,CAAC,EAAE,aAAa,CAAC,CAAA;QAEjB,IAAI,CAAC;YACD,MAAM,EAAE,CAAC,KAAK,CAAC,CAAA;YACf,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;QACvB,CAAC;gBAAS,CAAC;YACP,OAAO,GAAG,KAAK,CAAA;QACnB,CAAC;IACL,CAAC;CACJ;AAnCD,4DAmCC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Entity } from '@subsquid/typeorm-store';
|
|
2
|
+
import { EntityMetadata, EntityTarget, FindOptionsRelations } from 'typeorm';
|
|
3
|
+
export type DeferData = {
|
|
4
|
+
ids: Set<string>;
|
|
5
|
+
relations: FindOptionsRelations<any>;
|
|
6
|
+
};
|
|
7
|
+
export declare class DeferList {
|
|
8
|
+
private deferMap;
|
|
9
|
+
constructor();
|
|
10
|
+
add<E extends Entity>(metadata: EntityMetadata, id: string, relations?: FindOptionsRelations<E>): void;
|
|
11
|
+
getData(metadata: EntityMetadata): DeferData;
|
|
12
|
+
values(): {
|
|
13
|
+
target: EntityTarget<any>;
|
|
14
|
+
data: DeferData;
|
|
15
|
+
}[];
|
|
16
|
+
clear(): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=deferList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deferList.d.ts","sourceRoot":"","sources":["../src/deferList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAA;AAC9C,OAAO,EAAC,cAAc,EAAE,YAAY,EAAE,oBAAoB,EAAC,MAAM,SAAS,CAAA;AAG1E,MAAM,MAAM,SAAS,GAAG;IACpB,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAChB,SAAS,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAA;CACvC,CAAA;AAED,qBAAa,SAAS;IAClB,OAAO,CAAC,QAAQ,CAA+C;;IAI/D,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAS/F,OAAO,CAAC,QAAQ,EAAE,cAAc;IAUhC,MAAM;;;;IAIN,KAAK;CAGR"}
|
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.DeferList = void 0;
|
|
4
4
|
const utils_1 = require("./utils");
|
|
5
|
-
class
|
|
6
|
-
constructor(
|
|
7
|
-
this.em = em;
|
|
5
|
+
class DeferList {
|
|
6
|
+
constructor() {
|
|
8
7
|
this.deferMap = new Map();
|
|
9
8
|
}
|
|
10
|
-
add(
|
|
11
|
-
const data = this.getData(
|
|
9
|
+
add(metadata, id, relations) {
|
|
10
|
+
const data = this.getData(metadata);
|
|
12
11
|
data.ids.add(id);
|
|
13
12
|
if (relations != null) {
|
|
14
13
|
data.relations = (0, utils_1.mergeRelataions)(data.relations, relations);
|
|
15
14
|
}
|
|
16
15
|
}
|
|
17
|
-
getData(
|
|
18
|
-
const em = this.em();
|
|
19
|
-
const metadata = em.connection.getMetadata(entityClass);
|
|
16
|
+
getData(metadata) {
|
|
20
17
|
let list = this.deferMap.get(metadata.target);
|
|
21
18
|
if (list == null) {
|
|
22
19
|
list = { ids: new Set(), relations: {} };
|
|
@@ -31,5 +28,5 @@ class DeferQueue {
|
|
|
31
28
|
this.deferMap.clear();
|
|
32
29
|
}
|
|
33
30
|
}
|
|
34
|
-
exports.
|
|
35
|
-
//# sourceMappingURL=
|
|
31
|
+
exports.DeferList = DeferList;
|
|
32
|
+
//# sourceMappingURL=deferList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deferList.js","sourceRoot":"","sources":["../src/deferList.ts"],"names":[],"mappings":";;;AAEA,mCAAuC;AAOvC,MAAa,SAAS;IAGlB;QAFQ,aAAQ,GAAsC,IAAI,GAAG,EAAE,CAAA;IAEhD,CAAC;IAEhB,GAAG,CAAmB,QAAwB,EAAE,EAAU,EAAE,SAAmC;QAC3F,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACnC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAEhB,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,SAAS,GAAG,IAAA,uBAAe,EAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAC/D,CAAC;IACL,CAAC;IAED,OAAO,CAAC,QAAwB;QAC5B,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAC7C,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACf,IAAI,GAAG,EAAC,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,EAAC,CAAA;YACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAC5C,CAAC;QAED,OAAO,IAAI,CAAA;IACf,CAAC;IAED,MAAM;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC,CAAA;IACjF,CAAC;IAED,KAAK;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IACzB,CAAC;CACJ;AA/BD,8BA+BC"}
|
package/lib/store.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export type ChangeSet<E extends Entity> = {
|
|
|
6
6
|
metadata: EntityMetadata;
|
|
7
7
|
inserts: E[];
|
|
8
8
|
upserts: E[];
|
|
9
|
-
removes:
|
|
9
|
+
removes: string[];
|
|
10
10
|
extraUpserts: E[];
|
|
11
11
|
};
|
|
12
12
|
export interface GetOptions<Entity = any> {
|
|
@@ -16,9 +16,10 @@ export interface GetOptions<Entity = any> {
|
|
|
16
16
|
export declare class StoreWithCache extends Store {
|
|
17
17
|
private em;
|
|
18
18
|
private updates;
|
|
19
|
-
private
|
|
19
|
+
private defers;
|
|
20
20
|
private cache;
|
|
21
21
|
private logger;
|
|
22
|
+
private currentCommit;
|
|
22
23
|
constructor(em: () => EntityManager, changes?: ChangeTracker);
|
|
23
24
|
insert<E extends _Entity>(entity: E): Promise<void>;
|
|
24
25
|
insert<E extends _Entity>(entities: E[]): Promise<void>;
|
|
@@ -62,6 +63,7 @@ export declare class StoreWithCache extends Store {
|
|
|
62
63
|
private cloneEntity;
|
|
63
64
|
private traverseEntity;
|
|
64
65
|
private getEntityMetadata;
|
|
66
|
+
private getEntityPkHash;
|
|
65
67
|
private saveMany;
|
|
66
68
|
private getFkSignature;
|
|
67
69
|
private upsertMany;
|
package/lib/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,IAAI,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,EAAC,MAAM,yBAAyB,CAAA;AACtH,OAAO,EAAC,aAAa,EAAC,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/lib/store.js
CHANGED
|
@@ -17,62 +17,70 @@ const logger_1 = require("@subsquid/logger");
|
|
|
17
17
|
const typeorm_store_1 = require("@subsquid/typeorm-store");
|
|
18
18
|
const util_internal_1 = require("@subsquid/util-internal");
|
|
19
19
|
const assert_1 = __importDefault(require("assert"));
|
|
20
|
+
const async_mutex_1 = require("async-mutex");
|
|
20
21
|
const typeorm_1 = require("typeorm");
|
|
21
22
|
const cacheMap_1 = require("./cacheMap");
|
|
22
|
-
const
|
|
23
|
-
const deferQueue_1 = require("./deferQueue");
|
|
23
|
+
const deferList_1 = require("./deferList");
|
|
24
24
|
const relationGraph_1 = require("./relationGraph");
|
|
25
|
+
const updatesMap_1 = require("./updatesMap");
|
|
25
26
|
const utils_1 = require("./utils");
|
|
26
27
|
// @ts-ignore
|
|
27
28
|
class StoreWithCache extends typeorm_store_1.Store {
|
|
28
29
|
constructor(em, changes) {
|
|
29
30
|
super(em, changes);
|
|
30
31
|
this.em = em;
|
|
32
|
+
this.currentCommit = new async_mutex_1.Mutex();
|
|
31
33
|
this.logger = (0, logger_1.createLogger)('sqd:store');
|
|
32
|
-
this.cache = new cacheMap_1.CacheMap(
|
|
33
|
-
this.updates = new
|
|
34
|
-
this.
|
|
34
|
+
this.cache = new cacheMap_1.CacheMap({ logger: this.logger });
|
|
35
|
+
this.updates = new updatesMap_1.UpdatesMap();
|
|
36
|
+
this.defers = new deferList_1.DeferList();
|
|
35
37
|
}
|
|
36
38
|
async insert(e) {
|
|
39
|
+
await this.currentCommit.waitForUnlock();
|
|
37
40
|
const entities = Array.isArray(e) ? e : [e];
|
|
38
41
|
if (entities.length == 0)
|
|
39
42
|
return;
|
|
40
43
|
for (const entity of entities) {
|
|
41
|
-
this.
|
|
42
|
-
this.
|
|
44
|
+
const md = this.getEntityMetadata(entity.constructor);
|
|
45
|
+
this.updates.insert(md, entity.id);
|
|
46
|
+
this.cache.add(md, entity, true);
|
|
43
47
|
}
|
|
44
48
|
}
|
|
45
49
|
async upsert(e) {
|
|
50
|
+
await this.currentCommit.waitForUnlock();
|
|
46
51
|
let entities = Array.isArray(e) ? e : [e];
|
|
47
52
|
if (entities.length == 0)
|
|
48
53
|
return;
|
|
49
54
|
for (const entity of entities) {
|
|
50
|
-
this.
|
|
51
|
-
this.
|
|
55
|
+
const md = this.getEntityMetadata(entity.constructor);
|
|
56
|
+
const isNew = this.updates.get(md, entity.id) === updatesMap_1.UpdateType.Remove;
|
|
57
|
+
this.updates.upsert(md, entity.id);
|
|
58
|
+
this.cache.add(md, entity, isNew);
|
|
52
59
|
}
|
|
53
60
|
}
|
|
54
61
|
async save(e) {
|
|
55
62
|
return await this.upsert(e);
|
|
56
63
|
}
|
|
57
64
|
async remove(e, id) {
|
|
65
|
+
await this.currentCommit.waitForUnlock();
|
|
58
66
|
if (id == null) {
|
|
59
67
|
const entities = Array.isArray(e) ? e : [e];
|
|
60
68
|
if (entities.length == 0)
|
|
61
69
|
return;
|
|
62
70
|
for (const entity of entities) {
|
|
63
|
-
const
|
|
64
|
-
this.updates.remove(
|
|
65
|
-
this.cache.delete(
|
|
71
|
+
const md = this.getEntityMetadata(entity.constructor);
|
|
72
|
+
this.updates.remove(md, entity.id);
|
|
73
|
+
this.cache.delete(md, entity.id);
|
|
66
74
|
}
|
|
67
75
|
}
|
|
68
76
|
else {
|
|
69
77
|
const ids = Array.isArray(id) ? id : [id];
|
|
70
78
|
if (ids.length == 0)
|
|
71
79
|
return;
|
|
72
|
-
const
|
|
80
|
+
const md = this.getEntityMetadata(e);
|
|
73
81
|
for (const id of ids) {
|
|
74
|
-
this.updates.remove(
|
|
75
|
-
this.cache.delete(
|
|
82
|
+
this.updates.remove(md, id);
|
|
83
|
+
this.cache.delete(md, id);
|
|
76
84
|
}
|
|
77
85
|
}
|
|
78
86
|
}
|
|
@@ -88,7 +96,10 @@ class StoreWithCache extends typeorm_store_1.Store {
|
|
|
88
96
|
await this.commit();
|
|
89
97
|
const res = await super.find(entityClass, options);
|
|
90
98
|
for (const entity of res) {
|
|
91
|
-
this.traverseEntity(entity, options.relations || null, (e) =>
|
|
99
|
+
this.traverseEntity(entity, options.relations || null, (e) => {
|
|
100
|
+
const md = this.getEntityMetadata(e.constructor);
|
|
101
|
+
this.cache.add(md, e);
|
|
102
|
+
});
|
|
92
103
|
}
|
|
93
104
|
return res;
|
|
94
105
|
}
|
|
@@ -96,7 +107,10 @@ class StoreWithCache extends typeorm_store_1.Store {
|
|
|
96
107
|
await this.commit();
|
|
97
108
|
const res = await super.findBy(entityClass, where);
|
|
98
109
|
for (const entity of res) {
|
|
99
|
-
this.traverseEntity(entity, null, (e) =>
|
|
110
|
+
this.traverseEntity(entity, null, (e) => {
|
|
111
|
+
const md = this.getEntityMetadata(entityClass);
|
|
112
|
+
this.cache.add(md, e);
|
|
113
|
+
});
|
|
100
114
|
}
|
|
101
115
|
return res;
|
|
102
116
|
}
|
|
@@ -104,28 +118,40 @@ class StoreWithCache extends typeorm_store_1.Store {
|
|
|
104
118
|
await this.commit();
|
|
105
119
|
const res = await super.findOne(entityClass, options);
|
|
106
120
|
if (res != null) {
|
|
107
|
-
this.traverseEntity(res, options.relations || null, (e) =>
|
|
121
|
+
this.traverseEntity(res, options.relations || null, (e) => {
|
|
122
|
+
const md = this.getEntityMetadata(e.constructor);
|
|
123
|
+
this.cache.add(md, e);
|
|
124
|
+
});
|
|
108
125
|
}
|
|
109
126
|
return res;
|
|
110
127
|
}
|
|
111
128
|
async findOneOrFail(entityClass, options) {
|
|
112
129
|
await this.commit();
|
|
113
130
|
const res = await super.findOneOrFail(entityClass, options);
|
|
114
|
-
this.traverseEntity(res, options.relations || null, (e) =>
|
|
131
|
+
this.traverseEntity(res, options.relations || null, (e) => {
|
|
132
|
+
const md = this.getEntityMetadata(e.constructor);
|
|
133
|
+
this.cache.add(md, e);
|
|
134
|
+
});
|
|
115
135
|
return res;
|
|
116
136
|
}
|
|
117
137
|
async findOneBy(entityClass, where) {
|
|
118
138
|
await this.commit();
|
|
119
139
|
const res = await super.findOneBy(entityClass, where);
|
|
120
140
|
if (res != null) {
|
|
121
|
-
this.traverseEntity(res, null, (e) =>
|
|
141
|
+
this.traverseEntity(res, null, (e) => {
|
|
142
|
+
const md = this.getEntityMetadata(e.constructor);
|
|
143
|
+
this.cache.add(md, e);
|
|
144
|
+
});
|
|
122
145
|
}
|
|
123
146
|
return res;
|
|
124
147
|
}
|
|
125
148
|
async findOneByOrFail(entityClass, where) {
|
|
126
149
|
await this.commit();
|
|
127
150
|
const res = await super.findOneByOrFail(entityClass, where);
|
|
128
|
-
this.traverseEntity(res, null, (e) =>
|
|
151
|
+
this.traverseEntity(res, null, (e) => {
|
|
152
|
+
const md = this.getEntityMetadata(e.constructor);
|
|
153
|
+
this.cache.add(md, e);
|
|
154
|
+
});
|
|
129
155
|
return res;
|
|
130
156
|
}
|
|
131
157
|
async get(entityClass, idOrOptions) {
|
|
@@ -164,8 +190,9 @@ class StoreWithCache extends typeorm_store_1.Store {
|
|
|
164
190
|
return this.getOrInsert(entityClass, idOrOptions, create);
|
|
165
191
|
}
|
|
166
192
|
defer(entityClass, idOrOptions) {
|
|
193
|
+
const md = this.getEntityMetadata(entityClass);
|
|
167
194
|
const options = parseGetOptions(idOrOptions);
|
|
168
|
-
this.
|
|
195
|
+
this.defers.add(md, options.id, options.relations);
|
|
169
196
|
return new DeferredEntity({
|
|
170
197
|
get: async () => this.get(entityClass, options),
|
|
171
198
|
getOrFail: async () => this.getOrFail(entityClass, options),
|
|
@@ -173,37 +200,39 @@ class StoreWithCache extends typeorm_store_1.Store {
|
|
|
173
200
|
});
|
|
174
201
|
}
|
|
175
202
|
async commit() {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
const
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
for (const { metadata, inserts, upserts } of changeSets) {
|
|
184
|
-
if (upserts.length > 0) {
|
|
185
|
-
log.debug(`commit upserts for ${metadata.name} (${upserts.length})`);
|
|
186
|
-
await super.upsert(upserts);
|
|
203
|
+
await this.currentCommit.runExclusive(async () => {
|
|
204
|
+
const log = this.logger.child('commit');
|
|
205
|
+
const entityOrder = this.getCommitOrder();
|
|
206
|
+
const changeSets = [];
|
|
207
|
+
for (const metadata of entityOrder) {
|
|
208
|
+
const changeSet = this.getChangeSet(metadata.target);
|
|
209
|
+
changeSets.push(changeSet);
|
|
187
210
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
211
|
+
for (const { metadata, inserts, upserts } of changeSets) {
|
|
212
|
+
if (upserts.length > 0) {
|
|
213
|
+
log.debug(`commit upserts for ${metadata.name} (${upserts.length})`);
|
|
214
|
+
await super.upsert(upserts);
|
|
215
|
+
}
|
|
216
|
+
if (inserts.length) {
|
|
217
|
+
log.debug(`commit inserts for ${metadata.name} (${inserts.length})`);
|
|
218
|
+
await super.insert(inserts);
|
|
219
|
+
}
|
|
191
220
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
221
|
+
const changeSetsReversed = [...changeSets].reverse();
|
|
222
|
+
for (const { metadata, removes } of changeSetsReversed) {
|
|
223
|
+
if (removes.length > 0) {
|
|
224
|
+
log.debug(`commit removes for ${metadata.name} (${removes.length})`);
|
|
225
|
+
await super.remove(metadata.target, removes);
|
|
226
|
+
}
|
|
198
227
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
228
|
+
for (const { metadata, extraUpserts } of changeSets) {
|
|
229
|
+
if (extraUpserts.length) {
|
|
230
|
+
log.debug(`commit extra upserts for ${metadata.name} (${extraUpserts.length})`);
|
|
231
|
+
await super.upsert(extraUpserts);
|
|
232
|
+
}
|
|
204
233
|
}
|
|
205
|
-
|
|
206
|
-
|
|
234
|
+
this.updates.clear();
|
|
235
|
+
});
|
|
207
236
|
}
|
|
208
237
|
clear() {
|
|
209
238
|
this.cache.clear();
|
|
@@ -218,11 +247,11 @@ class StoreWithCache extends typeorm_store_1.Store {
|
|
|
218
247
|
const upserts = [];
|
|
219
248
|
const removes = [];
|
|
220
249
|
const extraUpserts = [];
|
|
221
|
-
const updates = this.updates.getUpdates(metadata
|
|
250
|
+
const updates = this.updates.getUpdates(metadata);
|
|
222
251
|
for (const [id, type] of updates) {
|
|
223
|
-
const cached = this.cache.get(metadata
|
|
252
|
+
const cached = this.cache.get(metadata, id);
|
|
224
253
|
switch (type) {
|
|
225
|
-
case
|
|
254
|
+
case updatesMap_1.UpdateType.Insert: {
|
|
226
255
|
(0, assert_1.default)(cached?.value != null);
|
|
227
256
|
inserts.push(cached.value);
|
|
228
257
|
const extraUpsert = this.extractExtraUpsert(cached.value);
|
|
@@ -231,7 +260,7 @@ class StoreWithCache extends typeorm_store_1.Store {
|
|
|
231
260
|
}
|
|
232
261
|
break;
|
|
233
262
|
}
|
|
234
|
-
case
|
|
263
|
+
case updatesMap_1.UpdateType.Upsert: {
|
|
235
264
|
(0, assert_1.default)(cached?.value != null);
|
|
236
265
|
upserts.push(cached.value);
|
|
237
266
|
const extraUpsert = this.extractExtraUpsert(cached.value);
|
|
@@ -240,10 +269,8 @@ class StoreWithCache extends typeorm_store_1.Store {
|
|
|
240
269
|
}
|
|
241
270
|
break;
|
|
242
271
|
}
|
|
243
|
-
case
|
|
244
|
-
|
|
245
|
-
e.id = id;
|
|
246
|
-
removes.push(e);
|
|
272
|
+
case updatesMap_1.UpdateType.Remove: {
|
|
273
|
+
removes.push(id);
|
|
247
274
|
break;
|
|
248
275
|
}
|
|
249
276
|
}
|
|
@@ -251,21 +278,23 @@ class StoreWithCache extends typeorm_store_1.Store {
|
|
|
251
278
|
return { metadata, inserts, upserts, extraUpserts, removes };
|
|
252
279
|
}
|
|
253
280
|
async load() {
|
|
254
|
-
for (const { target, data } of this.
|
|
281
|
+
for (const { target, data } of this.defers.values()) {
|
|
255
282
|
const metadata = this.getEntityMetadata(target);
|
|
256
|
-
|
|
257
|
-
|
|
283
|
+
const ids = Array.from(data.ids);
|
|
284
|
+
for (const id of ids) {
|
|
285
|
+
this.cache.ensure(metadata, id);
|
|
258
286
|
}
|
|
259
|
-
for (let batch of (0, utils_1.splitIntoBatches)(
|
|
287
|
+
for (let batch of (0, utils_1.splitIntoBatches)(ids, 30000)) {
|
|
260
288
|
if (batch.length == 0)
|
|
261
289
|
continue;
|
|
262
290
|
await this.find(metadata.target, { where: { id: (0, typeorm_1.In)(batch) }, relations: data.relations });
|
|
263
291
|
}
|
|
264
292
|
}
|
|
265
|
-
this.
|
|
293
|
+
this.defers.clear();
|
|
266
294
|
}
|
|
267
295
|
getCached(entityClass, id, mask) {
|
|
268
|
-
const
|
|
296
|
+
const md = this.getEntityMetadata(entityClass);
|
|
297
|
+
const cached = this.cache.get(md, id);
|
|
269
298
|
if (cached == null) {
|
|
270
299
|
return undefined;
|
|
271
300
|
}
|
|
@@ -293,8 +322,8 @@ class StoreWithCache extends typeorm_store_1.Store {
|
|
|
293
322
|
if (invCommitOrderIndex < commitOrderIndex)
|
|
294
323
|
continue;
|
|
295
324
|
(0, assert_1.default)(relation.isNullable);
|
|
296
|
-
const invUpdateType = this.updates.get(inverseMetadata
|
|
297
|
-
if (invUpdateType ===
|
|
325
|
+
const invUpdateType = this.updates.get(inverseMetadata, inverseEntity.id);
|
|
326
|
+
if (invUpdateType === updatesMap_1.UpdateType.Insert) {
|
|
298
327
|
if (extraUpsert == null) {
|
|
299
328
|
extraUpsert = metadata.create();
|
|
300
329
|
extraUpsert.id = entity.id;
|
|
@@ -378,6 +407,23 @@ class StoreWithCache extends typeorm_store_1.Store {
|
|
|
378
407
|
const em = this.em();
|
|
379
408
|
return em.connection.getMetadata(entityClass);
|
|
380
409
|
}
|
|
410
|
+
getEntityPkHash(metadata, entity) {
|
|
411
|
+
const columns = metadata.primaryColumns;
|
|
412
|
+
if (columns.length === 1) {
|
|
413
|
+
const pk = columns[0].getEntityValue(entity);
|
|
414
|
+
(0, assert_1.default)(pk != null);
|
|
415
|
+
return String(pk);
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
return columns
|
|
419
|
+
.map((c) => {
|
|
420
|
+
const pk = c.getEntityValue(entity);
|
|
421
|
+
(0, assert_1.default)(pk != null);
|
|
422
|
+
return String(pk);
|
|
423
|
+
})
|
|
424
|
+
.join(':');
|
|
425
|
+
}
|
|
426
|
+
}
|
|
381
427
|
// @ts-ignore
|
|
382
428
|
async saveMany(entityClass, entities) {
|
|
383
429
|
(0, assert_1.default)(entities.length > 0);
|