Skip to content

Commit 24903df

Browse files
authored
fix(store): Fixed storeAlias not storing relationships (#59)
1 parent 534112b commit 24903df

File tree

3 files changed

+47
-30
lines changed

3 files changed

+47
-30
lines changed

Sources/CohesionKit/Identity/IdentityStore.swift

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,8 @@ public class IdentityMap {
147147
}
148148
}
149149

150-
func nodeStore<T: Identifiable>(entity: T, modifiedAt: Stamp?) -> EntityNode<T> {
151-
let node = storage[entity, new: EntityNode(entity, modifiedAt: nil) { [registry] in
150+
func nodeStore<T: Identifiable>(in node: EntityNode<T>? = nil, entity: T, modifiedAt: Stamp?) -> EntityNode<T> {
151+
let node = node ?? storage[entity, new: EntityNode(entity, modifiedAt: nil) { [registry] in
152152
registry.enqueueChange(for: $0)
153153
}]
154154

@@ -167,8 +167,8 @@ public class IdentityMap {
167167
return node
168168
}
169169

170-
func nodeStore<T: Aggregate>(entity: T, modifiedAt: Stamp?) -> EntityNode<T> {
171-
let node = storage[entity, new: EntityNode(entity, modifiedAt: nil) { [registry] in
170+
func nodeStore<T: Aggregate>(in node: EntityNode<T>? = nil, entity: T, modifiedAt: Stamp?) -> EntityNode<T> {
171+
let node = node ?? storage[entity, new: EntityNode(entity, modifiedAt: nil) { [registry] in
172172
registry.enqueueChange(for: $0)
173173
}]
174174

@@ -196,16 +196,12 @@ public class IdentityMap {
196196

197197
private func storeAlias<T>(content: T, key: AliasKey<T>, modifiedAt: Stamp?) {
198198
let aliasNode = refAliases[safe: key]
199+
let aliasContainer = AliasContainer(key: key, content: content)
199200

200-
do {
201-
try aliasNode.updateEntity(AliasContainer(key: key, content: content), modifiedAt: modifiedAt)
201+
_ = nodeStore(in: aliasNode, entity: aliasContainer, modifiedAt: modifiedAt)
202202

203-
registry.enqueueChange(for: aliasNode)
204-
logger?.didRegisterAlias(key)
205-
}
206-
catch {
207-
208-
}
203+
registry.enqueueChange(for: aliasNode)
204+
logger?.didRegisterAlias(key)
209205
}
210206

211207
private func transaction<T>(_ body: () -> T) -> T {

Sources/CohesionKit/Storage/AliasContainer.swift

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,36 @@ struct AliasContainer<T>: Identifiable, Aggregate {
88
var content: T?
99
}
1010

11-
extension AliasContainer where T: Aggregate {
12-
var nestedEntitiesKeyPaths: [PartialIdentifiableKeyPath<AliasContainer<T>>] {
13-
[.init(\.content)]
11+
extension AliasContainer {
12+
var nestedEntitiesKeyPaths: [PartialIdentifiableKeyPath<Self>] {
13+
if let self = self as? IdentifiableKeyPathsEraser {
14+
return self.erasedEntitiesKeyPaths as! [PartialIdentifiableKeyPath<Self>]
15+
}
16+
17+
if let self = self as? CollectionIdentifiableKeyPathsEraser {
18+
return self.erasedEntitiesKeyPaths as! [PartialIdentifiableKeyPath<Self>]
19+
}
20+
21+
return []
1422
}
1523
}
1624

17-
extension AliasContainer where T: Identifiable {
18-
var nestedEntitiesKeyPaths: [PartialIdentifiableKeyPath<AliasContainer<T>>] {
19-
[.init(\.content)]
20-
}
25+
private protocol IdentifiableKeyPathsEraser {
26+
var erasedEntitiesKeyPaths: [Any] { get }
2127
}
2228

23-
extension AliasContainer where T: MutableCollection, T.Element: Aggregate, T.Index: Hashable {
24-
var nestedEntitiesKeyPaths: [PartialIdentifiableKeyPath<AliasContainer<T>>] {
25-
[.init(\.content)]
29+
extension AliasContainer: IdentifiableKeyPathsEraser where T: Identifiable {
30+
var erasedEntitiesKeyPaths: [Any] {
31+
[PartialIdentifiableKeyPath<Self>(\.content)]
2632
}
2733
}
2834

29-
extension AliasContainer where T: MutableCollection, T.Element: Identifiable, T.Index: Hashable {
30-
var nestedEntitiesKeyPaths: [PartialIdentifiableKeyPath<AliasContainer<T>>] {
31-
[.init(\.content)]
32-
}
35+
private protocol CollectionIdentifiableKeyPathsEraser {
36+
var erasedEntitiesKeyPaths: [Any] { get }
3337
}
3438

35-
extension AliasContainer {
36-
var nestedEntitiesKeyPaths: [PartialIdentifiableKeyPath<AliasContainer<T>>] {
37-
[]
39+
extension AliasContainer: CollectionIdentifiableKeyPathsEraser where T: MutableCollection, T.Element: Identifiable, T.Index: Hashable {
40+
var erasedEntitiesKeyPaths: [Any] {
41+
[PartialIdentifiableKeyPath<Self>(\.content)]
3842
}
3943
}

Tests/CohesionKitTests/IdentityMapTests.swift

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ class IdentityMapTests: XCTestCase {
141141
wait(for: [expectation], timeout: 0)
142142
}
143143

144-
func test_storeAlias_itEnqueuesAliasInRegistry() {
144+
func test_storeAggregate_named_itEnqueuesAliasInRegistry() {
145145
let root = SingleNodeFixture(id: 1)
146146
let registry = ObserverRegistryStub()
147147
let identityMap = IdentityMap(registry: registry)
@@ -218,6 +218,23 @@ extension IdentityMapTests {
218218
}
219219
}
220220

221+
func test_find_storedByAliasCollection_itReturnsEntity() {
222+
let identityMap = IdentityMap()
223+
224+
_ = identityMap.store(entities: [SingleNodeFixture(id: 1)], named: .listOfNodes)
225+
226+
XCTAssertNotNil(identityMap.find(SingleNodeFixture.self, id: 1))
227+
}
228+
229+
func test_find_storedByAliasAggregate_itReturnsEntity() {
230+
let identityMap = IdentityMap()
231+
let aggregate = RootFixture(id: 1, primitive: "", singleNode: SingleNodeFixture(id: 1), listNodes: [])
232+
233+
_ = identityMap.store(entity: aggregate, named: .root)
234+
235+
XCTAssertNotNil(identityMap.find(SingleNodeFixture.self, id: 1))
236+
}
237+
221238
func test_findNamed_entityStored_noObserver_returnValue() {
222239
let identityMap = IdentityMap()
223240
let entity = SingleNodeFixture(id: 1)

0 commit comments

Comments
 (0)