Skip to content

Commit fe8c93a

Browse files
authored
enhance: Optimize normalize call construction (#3432)
1 parent 1cac472 commit fe8c93a

File tree

2 files changed

+29
-32
lines changed

2 files changed

+29
-32
lines changed

packages/normalizr/src/normalize/addEntities.ts

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,51 @@
11
import { INVALID } from '../denormalize/symbol.js';
22
import type { EntityInterface } from '../interface.js';
33

4-
export const addEntities =
5-
(
6-
newEntities: Map<string, Map<string, any>>,
7-
newIndexes: Map<string, Map<string, any>>,
8-
entitiesCopy: Record<string, any>,
9-
indexesCopy: Record<string, any>,
10-
entityMetaCopy: {
4+
export const addEntities = (
5+
{
6+
entities,
7+
indexes,
8+
entityMeta,
9+
}: {
10+
entities: Record<string, any>;
11+
indexes: Record<string, any>;
12+
entityMeta: {
1113
[entityKey: string]: {
1214
[pk: string]: {
1315
date: number;
1416
expiresAt: number;
1517
fetchedAt: number;
1618
};
1719
};
18-
},
19-
actionMeta: { fetchedAt: number; date: number; expiresAt: number },
20-
) =>
21-
(schema: EntityInterface, processedEntity: any, id: string) => {
20+
};
21+
},
22+
actionMeta: { fetchedAt: number; date: number; expiresAt: number },
23+
) => {
24+
const newEntities = new Map<string, Map<string, any>>();
25+
const newIndexes = new Map<string, Map<string, any>>();
26+
return (schema: EntityInterface, processedEntity: any, id: string) => {
2227
const schemaKey = schema.key;
2328
// first time we come across this type of entity
2429
if (!newEntities.has(schemaKey)) {
2530
newEntities.set(schemaKey, new Map());
2631
// we will be editing these, so we need to clone them first
27-
entitiesCopy[schemaKey] = { ...entitiesCopy[schemaKey] };
28-
entityMetaCopy[schemaKey] = { ...entityMetaCopy[schemaKey] };
32+
entities[schemaKey] = { ...entities[schemaKey] };
33+
entityMeta[schemaKey] = { ...entityMeta[schemaKey] };
2934
}
3035

3136
const newEntitiesKey = newEntities.get(schemaKey) as Map<string, any>;
3237
const existingEntity = newEntitiesKey.get(id);
3338
if (existingEntity) {
3439
newEntitiesKey.set(id, schema.merge(existingEntity, processedEntity));
3540
} else {
36-
const inStoreEntity = entitiesCopy[schemaKey][id];
41+
const inStoreEntity = entities[schemaKey][id];
3742
let inStoreMeta: {
3843
date: number;
3944
expiresAt: number;
4045
fetchedAt: number;
4146
};
4247
// this case we already have this entity in store
43-
if (inStoreEntity && (inStoreMeta = entityMetaCopy[schemaKey][id])) {
48+
if (inStoreEntity && (inStoreMeta = entityMeta[schemaKey][id])) {
4449
newEntitiesKey.set(
4550
id,
4651
schema.mergeWithStore(
@@ -50,36 +55,37 @@ export const addEntities =
5055
processedEntity,
5156
),
5257
);
53-
entityMetaCopy[schemaKey][id] = schema.mergeMetaWithStore(
58+
entityMeta[schemaKey][id] = schema.mergeMetaWithStore(
5459
inStoreMeta,
5560
actionMeta,
5661
inStoreEntity,
5762
processedEntity,
5863
);
5964
} else {
6065
newEntitiesKey.set(id, processedEntity);
61-
entityMetaCopy[schemaKey][id] = actionMeta;
66+
entityMeta[schemaKey][id] = actionMeta;
6267
}
6368
}
6469

6570
// update index
6671
if (schema.indexes) {
6772
if (!newIndexes.has(schemaKey)) {
6873
newIndexes.set(schemaKey, new Map());
69-
indexesCopy[schemaKey] = { ...indexesCopy[schemaKey] };
74+
indexes[schemaKey] = { ...indexes[schemaKey] };
7075
}
7176
handleIndexes(
7277
id,
7378
schema.indexes,
7479
newIndexes.get(schemaKey) as Map<string, any>,
75-
indexesCopy[schemaKey],
80+
indexes[schemaKey],
7681
newEntitiesKey.get(id),
77-
entitiesCopy[schemaKey],
82+
entities[schemaKey],
7883
);
7984
}
8085
// set this after index updates so we know what indexes to remove from
81-
entitiesCopy[schemaKey][id] = newEntitiesKey.get(id);
86+
entities[schemaKey][id] = newEntitiesKey.get(id);
8287
};
88+
};
8389

8490
function handleIndexes(
8591
id: string,

packages/normalizr/src/normalize/normalize.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { addEntities } from './addEntities.js';
22
import { getVisit } from './getVisit.js';
3-
import type { Schema, NormalizedIndex } from '../interface.js';
3+
import type { Schema } from '../interface.js';
44
import { createGetEntity } from '../memo/MemoCache.js';
55
import type {
66
NormalizeMeta,
@@ -80,22 +80,13 @@ See https://dataclient.io/rest/api/RestEndpoint#parseResponse for more informati
8080
}
8181
}
8282

83-
const newEntities = new Map<string, Map<string, any>>();
84-
const newIndexes = new Map<string, Map<string, any>>();
8583
const ret: NormalizedSchema<E, R> = {
8684
result: '' as any,
8785
entities: { ...entities },
8886
indexes: { ...indexes },
8987
entityMeta: { ...entityMeta },
9088
};
91-
const addEntity = addEntities(
92-
newEntities,
93-
newIndexes,
94-
ret.entities,
95-
ret.indexes,
96-
ret.entityMeta,
97-
meta,
98-
);
89+
const addEntity = addEntities(ret, meta);
9990

10091
const visit = getVisit(addEntity, createGetEntity(entities));
10192
ret.result = visit(schema, input, input, undefined, args);

0 commit comments

Comments
 (0)