-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
Copy pathmerge-identifier.ts
72 lines (65 loc) · 2.4 KB
/
merge-identifier.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import type { MergeOperation } from '@ember-data/types/q/cache';
import { forAllRelatedIdentifiers, isBelongsTo, isHasMany, notifyChange } from '../-utils';
import type { CollectionEdge } from '../edges/collection';
import type { ImplicitEdge } from '../edges/implicit';
import type { ResourceEdge } from '../edges/resource';
import type { Graph, GraphEdge } from '../graph';
export function mergeIdentifier(graph: Graph, op: MergeOperation, relationships: Record<string, GraphEdge>) {
Object.keys(relationships).forEach((key) => {
const rel = relationships[key];
if (!rel) {
return;
}
mergeIdentifierForRelationship(graph, op, rel);
});
}
function mergeIdentifierForRelationship(graph: Graph, op: MergeOperation, rel: GraphEdge): void {
rel.identifier = op.value;
forAllRelatedIdentifiers(rel, (identifier) => {
const inverse = graph.get(identifier, rel.definition.inverseKey);
mergeInRelationship(graph, inverse, op);
});
}
function mergeInRelationship(graph: Graph, rel: GraphEdge, op: MergeOperation): void {
if (isBelongsTo(rel)) {
mergeBelongsTo(graph, rel, op);
} else if (isHasMany(rel)) {
mergeHasMany(graph, rel, op);
} else {
mergeImplicit(graph, rel, op);
}
}
function mergeBelongsTo(graph: Graph, rel: ResourceEdge, op: MergeOperation): void {
if (rel.remoteState === op.record) {
rel.remoteState = op.value;
}
if (rel.localState === op.record) {
rel.localState = op.record;
notifyChange(graph, rel.identifier, rel.definition.key);
}
}
function mergeHasMany(graph: Graph, rel: CollectionEdge, op: MergeOperation): void {
if (rel.remoteMembers.has(op.record)) {
rel.remoteMembers.delete(op.record);
rel.remoteMembers.add(op.value);
const index = rel.remoteState.indexOf(op.record);
rel.remoteState.splice(index, 1, op.value);
}
if (rel.localMembers.has(op.record)) {
rel.localMembers.delete(op.record);
rel.localMembers.add(op.value);
const index = rel.localState.indexOf(op.record);
rel.localState.splice(index, 1, op.value);
notifyChange(graph, rel.identifier, rel.definition.key);
}
}
function mergeImplicit(graph: Graph, rel: ImplicitEdge, op: MergeOperation): void {
if (rel.remoteMembers.has(op.record)) {
rel.remoteMembers.delete(op.record);
rel.remoteMembers.add(op.value);
}
if (rel.localMembers.has(op.record)) {
rel.localMembers.delete(op.record);
rel.localMembers.add(op.value);
}
}