@@ -32,10 +32,10 @@ extension StorageEngine {
32
32
33
33
func queryAndDeleteTransaction< M: Model > ( _ modelType: M . Type ,
34
34
modelSchema: ModelSchema ,
35
- deleteInput: DeleteInput ) -> DataStoreResult < ( [ M ] , [ Model ] ) > {
35
+ deleteInput: DeleteInput ) -> DataStoreResult < ( [ M ] , [ ModelName : [ Model ] ] ) > {
36
36
var queriedResult : DataStoreResult < [ M ] > ?
37
37
var deletedResult : DataStoreResult < [ M ] > ?
38
- var associatedModels : [ Model ] = [ ]
38
+ var associatedModels : [ ( ModelName , Model ) ] = [ ]
39
39
40
40
let queryCompletionBlock : DataStoreCallback < [ M ] > = { queryResult in
41
41
queriedResult = queryResult
@@ -93,11 +93,11 @@ extension StorageEngine {
93
93
94
94
return collapseResults ( queryResult: queriedResult,
95
95
deleteResult: deletedResult,
96
- associatedModels: associatedModels)
96
+ associatedModelsMap : getAssociatedModelsMap ( associatedModels: associatedModels) )
97
97
}
98
98
99
- func recurseQueryAssociatedModels( modelSchema: ModelSchema , ids: [ Model . Identifier ] ) -> [ Model ] {
100
- var associatedModels : [ Model ] = [ ]
99
+ func recurseQueryAssociatedModels( modelSchema: ModelSchema , ids: [ Model . Identifier ] ) -> [ ( ModelName , Model ) ] {
100
+ var associatedModels : [ ( ModelName , Model ) ] = [ ]
101
101
for (_, modelField) in modelSchema. fields {
102
102
guard modelField. hasAssociation,
103
103
modelField. isOneToOne || modelField. isOneToMany,
@@ -109,57 +109,69 @@ extension StorageEngine {
109
109
let queriedModels = queryAssociatedModels ( modelName: associatedModelName,
110
110
associatedField: associatedField,
111
111
ids: ids)
112
- let associatedModelIds = queriedModels. map { $0. id }
112
+ let associatedModelIds = queriedModels. map { $0. 1 . id }
113
113
associatedModels. append ( contentsOf: queriedModels)
114
- associatedModels. append ( contentsOf: recurseQueryAssociatedModels ( modelSchema: associatedModelSchema, ids: associatedModelIds) )
114
+ associatedModels. append ( contentsOf: recurseQueryAssociatedModels ( modelSchema: associatedModelSchema,
115
+ ids: associatedModelIds) )
115
116
}
116
117
return associatedModels
117
118
}
118
119
119
- func queryAssociatedModels( modelName: ModelName , associatedField: ModelField , ids: [ Model . Identifier ] ) -> [ Model ] {
120
- guard let modelType = ModelRegistry . modelType ( from: modelName) else {
120
+ func queryAssociatedModels( modelName: ModelName ,
121
+ associatedField: ModelField ,
122
+ ids: [ Model . Identifier ] ) -> [ ( ModelName , Model ) ] {
123
+ guard let modelSchema = ModelRegistry . modelSchema ( from: modelName) else {
121
124
log. error ( " Failed to lookup \( modelName) " )
122
125
return [ ]
123
126
}
124
127
125
- var queriedModels : [ Model ] = [ ]
128
+ var queriedModels : [ ( ModelName , Model ) ] = [ ]
126
129
let chunkedArrays = ids. chunked ( into: SQLiteStorageEngineAdapter . maxNumberOfPredicates)
127
130
for chunkedArray in chunkedArrays {
128
131
// TODO: Add conveinence to queryPredicate where we have a list of items, to be all or'ed
129
132
var queryPredicates : [ QueryPredicateOperation ] = [ ]
130
133
for id in chunkedArray {
131
134
queryPredicates. append ( QueryPredicateOperation ( field: associatedField. name, operator: . equals( id) ) )
132
135
}
133
- let groupedQueryPredicates = QueryPredicateGroup ( type: . or, predicates: queryPredicates)
136
+ let groupedQueryPredicates = QueryPredicateGroup ( type: . or, predicates: queryPredicates)
134
137
135
138
let sempahore = DispatchSemaphore ( value: 0 )
136
- storageAdapter. query ( untypedModel : modelType , predicate: groupedQueryPredicates) { result in
139
+ storageAdapter. query ( modelSchema : modelSchema , predicate: groupedQueryPredicates) { result in
137
140
defer {
138
141
sempahore. signal ( )
139
142
}
140
143
switch result {
141
144
case . success( let models) :
142
- queriedModels. append ( contentsOf: models)
143
-
145
+ queriedModels. append ( contentsOf: models. map { model in
146
+ ( modelName, model)
147
+ } )
144
148
case . failure( let error) :
145
- log. error ( " Failed to query \( modelType ) on mutation event generation: \( error) " )
149
+ log. error ( " Failed to query \( modelSchema ) on mutation event generation: \( error) " )
146
150
}
147
151
}
148
152
sempahore. wait ( )
149
153
}
150
154
return queriedModels
151
155
}
152
156
157
+ private func getAssociatedModelsMap( associatedModels: [ ( ModelName , Model ) ] ) -> [ ModelName : [ Model ] ] {
158
+ var associatedModelsMap = [ ModelName: [ Model] ] ( )
159
+ for (modelName, model) in associatedModels {
160
+ associatedModelsMap [ modelName, default: [ ] ] . append ( model)
161
+ }
162
+ return associatedModelsMap
163
+ }
164
+
153
165
private func collapseResults< M: Model > ( queryResult: DataStoreResult < [ M ] > ? ,
154
166
deleteResult: DataStoreResult < [ M ] > ? ,
155
- associatedModels : [ Model ] ) -> DataStoreResult < ( [ M ] , [ Model ] ) > {
167
+ associatedModelsMap : [ ModelName : [ Model ] ] ) -> DataStoreResult < ( [ M ] , [ ModelName : [ Model ] ] ) > {
156
168
if let queryResult = queryResult {
157
169
switch queryResult {
158
170
case . success( let models) :
159
171
if let deleteResult = deleteResult {
160
172
switch deleteResult {
161
173
case . success:
162
- return . success( ( models, associatedModels ) )
174
+ return . success( ( models, associatedModelsMap ) )
163
175
case . failure( let error) :
164
176
return . failure( error)
165
177
}
@@ -174,7 +186,7 @@ extension StorageEngine {
174
186
}
175
187
}
176
188
177
- func collapseMResult< M: Model > ( _ result: DataStoreResult < ( [ M ] , [ Model ] ) > ) -> DataStoreResult < [ M ] > {
189
+ func collapseMResult< M: Model > ( _ result: DataStoreResult < ( [ M ] , [ ModelName : [ Model ] ] ) > ) -> DataStoreResult < [ M ] > {
178
190
switch result {
179
191
case . success( let results) :
180
192
return . success( results. 0 )
@@ -183,12 +195,13 @@ extension StorageEngine {
183
195
}
184
196
}
185
197
186
- func resolveAssociatedModels< M: Model > ( _ result: DataStoreResult < ( [ M ] , [ Model ] ) > ) -> [ Model ] {
198
+ func resolveAssociatedModels< M: Model > (
199
+ _ result: DataStoreResult < ( [ M ] , [ ModelName : [ Model ] ] ) > ) -> [ ModelName : [ Model ] ] {
187
200
switch result {
188
201
case . success( let results) :
189
202
return results. 1
190
203
case . failure:
191
- return [ ]
204
+ return [ : ]
192
205
}
193
206
}
194
207
}
0 commit comments