Skip to content

Commit 7673d25

Browse files
authored
chore(DataStore): Internal Delete API rename (predicate to condition and filter) (#1724)
1 parent ecb7f0f commit 7673d25

File tree

13 files changed

+113
-135
lines changed

13 files changed

+113
-135
lines changed

AmplifyPlugins/DataStore/AWSDataStoreCategoryPlugin/AWSDataStorePlugin+DataStoreBaseBehavior.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ extension AWSDataStorePlugin: DataStoreBaseBehavior {
121121
where predicate: QueryPredicate? = nil,
122122
completion: @escaping DataStoreCallback<Void>) {
123123
initStorageEngineAndStartSync()
124-
storageEngine.delete(modelType, modelSchema: modelSchema, withId: id, predicate: predicate) { result in
124+
storageEngine.delete(modelType, modelSchema: modelSchema, withId: id, condition: predicate) { result in
125125
self.onDeleteCompletion(result: result, modelSchema: modelSchema, completion: completion)
126126
}
127127
}
@@ -140,7 +140,7 @@ extension AWSDataStorePlugin: DataStoreBaseBehavior {
140140
storageEngine.delete(type(of: model),
141141
modelSchema: modelSchema,
142142
withId: model.id,
143-
predicate: predicate) { result in
143+
condition: predicate) { result in
144144
self.onDeleteCompletion(result: result, modelSchema: modelSchema, completion: completion)
145145
}
146146
}
@@ -169,7 +169,7 @@ extension AWSDataStorePlugin: DataStoreBaseBehavior {
169169
}
170170
storageEngine.delete(modelType,
171171
modelSchema: modelSchema,
172-
predicate: predicate,
172+
filter: predicate,
173173
completion: onCompletion)
174174
}
175175

AmplifyPlugins/DataStore/AWSDataStoreCategoryPlugin/Storage/ModelStorageBehavior.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ protocol ModelStorageBehavior {
2424
func delete<M: Model>(_ modelType: M.Type,
2525
modelSchema: ModelSchema,
2626
withId id: Model.Identifier,
27-
predicate: QueryPredicate?,
27+
condition: QueryPredicate?,
2828
completion: @escaping DataStoreCallback<M?>)
2929

3030
func delete<M: Model>(_ modelType: M.Type,
3131
modelSchema: ModelSchema,
32-
predicate: QueryPredicate,
32+
filter: QueryPredicate,
3333
completion: @escaping DataStoreCallback<[M]>)
3434

3535
func query<M: Model>(_ modelType: M.Type,

AmplifyPlugins/DataStore/AWSDataStoreCategoryPlugin/Storage/SQLite/StorageEngineAdapter+SQLite.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -195,14 +195,14 @@ final class SQLiteStorageEngineAdapter: StorageEngineAdapter {
195195

196196
func delete<M: Model>(_ modelType: M.Type,
197197
modelSchema: ModelSchema,
198-
predicate: QueryPredicate,
198+
filter: QueryPredicate,
199199
completion: (DataStoreResult<[M]>) -> Void) {
200200
guard let connection = connection else {
201201
completion(.failure(DataStoreError.nilSQLiteConnection()))
202202
return
203203
}
204204
do {
205-
let statement = DeleteStatement(modelSchema: modelSchema, predicate: predicate)
205+
let statement = DeleteStatement(modelSchema: modelSchema, predicate: filter)
206206
_ = try connection.prepare(statement.stringValue).run(statement.variables)
207207
completion(.success([]))
208208
} catch {
@@ -213,9 +213,9 @@ final class SQLiteStorageEngineAdapter: StorageEngineAdapter {
213213
func delete<M: Model>(_ modelType: M.Type,
214214
modelSchema: ModelSchema,
215215
withId id: Model.Identifier,
216-
predicate: QueryPredicate? = nil,
216+
condition: QueryPredicate? = nil,
217217
completion: (DataStoreResult<M?>) -> Void) {
218-
delete(untypedModelType: modelType, modelSchema: modelSchema, withId: id, predicate: predicate) { result in
218+
delete(untypedModelType: modelType, modelSchema: modelSchema, withId: id, condition: condition) { result in
219219
switch result {
220220
case .success:
221221
completion(.success(nil))
@@ -228,14 +228,14 @@ final class SQLiteStorageEngineAdapter: StorageEngineAdapter {
228228
func delete(untypedModelType modelType: Model.Type,
229229
modelSchema: ModelSchema,
230230
withId id: Model.Identifier,
231-
predicate: QueryPredicate? = nil,
231+
condition: QueryPredicate? = nil,
232232
completion: DataStoreCallback<Void>) {
233233
guard let connection = connection else {
234234
completion(.failure(DataStoreError.nilSQLiteConnection()))
235235
return
236236
}
237237
do {
238-
let statement = DeleteStatement(modelSchema: modelSchema, withId: id, predicate: predicate)
238+
let statement = DeleteStatement(modelSchema: modelSchema, withId: id, predicate: condition)
239239
_ = try connection.prepare(statement.stringValue).run(statement.variables)
240240
completion(.emptyResult)
241241
} catch {

AmplifyPlugins/DataStore/AWSDataStoreCategoryPlugin/Storage/StorageEngine+DeleteTransaction.swift

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,30 @@ extension StorageEngine {
1414

1515
enum DeleteInput {
1616
case withId(id: Model.Identifier)
17-
case withIdAndPredicate(id: Model.Identifier, predicate: QueryPredicate)
18-
case withPredicate(predicate: QueryPredicate)
17+
case withIdAndCondition(id: Model.Identifier, condition: QueryPredicate)
18+
case withFilter(_ filter: QueryPredicate)
1919

2020
/// Returns a computed predicate based on the type of delete scenario it is.
2121
var predicate: QueryPredicate {
2222
switch self {
2323
case .withId(let id):
2424
return field("id").eq(id)
25-
case .withIdAndPredicate(let id, let predicate):
26-
return field("id").eq(id).and(predicate)
27-
case .withPredicate(let predicate):
28-
return predicate
25+
case .withIdAndCondition(let id, let condition):
26+
return field("id").eq(id).and(condition)
27+
case .withFilter(let filter):
28+
return filter
2929
}
3030
}
3131
}
3232

33+
struct QueryAndDeleteResult<M: Model> {
34+
let deletedModels: [M]
35+
let associatedModelsMap: [ModelName: [Model]]
36+
}
37+
3338
func queryAndDeleteTransaction<M: Model>(_ modelType: M.Type,
3439
modelSchema: ModelSchema,
35-
deleteInput: DeleteInput) -> DataStoreResult<([M], [ModelName: [Model]])> {
40+
deleteInput: DeleteInput) -> DataStoreResult<QueryAndDeleteResult<M>> {
3641
var queriedResult: DataStoreResult<[M]>?
3742
var deletedResult: DataStoreResult<[M]>?
3843
var associatedModels: [(ModelName, Model)] = []
@@ -44,7 +49,7 @@ extension StorageEngine {
4449
}
4550

4651
guard !queriedModels.isEmpty else {
47-
guard case .withIdAndPredicate(let id, _) = deleteInput else {
52+
guard case .withIdAndCondition(let id, _) = deleteInput else {
4853
// Query did not return any results, treat this as a successful no-op delete.
4954
deletedResult = .success([M]())
5055
return
@@ -74,7 +79,7 @@ extension StorageEngine {
7479
}
7580
self.storageAdapter.delete(modelType,
7681
modelSchema: modelSchema,
77-
predicate: deleteInput.predicate,
82+
filter: deleteInput.predicate,
7883
completion: deleteCompletionWrapper)
7984
}
8085

@@ -164,14 +169,15 @@ extension StorageEngine {
164169

165170
private func collapseResults<M: Model>(queryResult: DataStoreResult<[M]>?,
166171
deleteResult: DataStoreResult<[M]>?,
167-
associatedModelsMap: [ModelName: [Model]]) -> DataStoreResult<([M], [ModelName: [Model]])> {
172+
associatedModelsMap: [ModelName: [Model]]) -> DataStoreResult<QueryAndDeleteResult<M>> {
168173
if let queryResult = queryResult {
169174
switch queryResult {
170175
case .success(let models):
171176
if let deleteResult = deleteResult {
172177
switch deleteResult {
173178
case .success:
174-
return .success((models, associatedModelsMap))
179+
return .success(QueryAndDeleteResult(deletedModels: models,
180+
associatedModelsMap: associatedModelsMap))
175181
case .failure(let error):
176182
return .failure(error)
177183
}
@@ -185,23 +191,4 @@ extension StorageEngine {
185191
return .failure(.unknown("queryResult not set during transaction", "coding error", nil))
186192
}
187193
}
188-
189-
func collapseMResult<M: Model>(_ result: DataStoreResult<([M], [ModelName: [Model]])>) -> DataStoreResult<[M]> {
190-
switch result {
191-
case .success(let results):
192-
return .success(results.0)
193-
case .failure(let error):
194-
return .failure(error)
195-
}
196-
}
197-
198-
func resolveAssociatedModels<M: Model>(
199-
_ result: DataStoreResult<([M], [ModelName: [Model]])>) -> [ModelName: [Model]] {
200-
switch result {
201-
case .success(let results):
202-
return results.1
203-
case .failure:
204-
return [:]
205-
}
206-
}
207194
}

AmplifyPlugins/DataStore/AWSDataStoreCategoryPlugin/Storage/StorageEngine.swift

Lines changed: 60 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -238,115 +238,106 @@ final class StorageEngine: StorageEngineBehavior {
238238
func delete<M: Model>(_ modelType: M.Type,
239239
modelSchema: ModelSchema,
240240
withId id: Model.Identifier,
241-
predicate: QueryPredicate? = nil,
241+
condition: QueryPredicate? = nil,
242242
completion: @escaping (DataStoreResult<M?>) -> Void) {
243243
var deleteInput = DeleteInput.withId(id: id)
244-
if let predicate = predicate {
245-
deleteInput = .withIdAndPredicate(id: id, predicate: predicate)
244+
if let condition = condition {
245+
deleteInput = .withIdAndCondition(id: id, condition: condition)
246246
}
247247
let transactionResult = queryAndDeleteTransaction(modelType,
248248
modelSchema: modelSchema,
249249
deleteInput: deleteInput)
250-
let modelsFromTransactionResult = collapseMResult(transactionResult)
251-
let associatedModelsFromTransactionResult = resolveAssociatedModels(transactionResult)
252-
253-
let deletedModel: M
254-
switch modelsFromTransactionResult {
255-
case .success(let queriedModels):
256-
guard queriedModels.count <= 1 else {
250+
switch transactionResult {
251+
case .success(let queryAndDeleteResult):
252+
guard queryAndDeleteResult.deletedModels.count <= 1 else {
257253
completion(.failure(.unknown("delete with id returned more than one result", "", nil)))
258254
return
259255
}
260256

261-
guard let first = queriedModels.first else {
257+
guard let deletedModel = queryAndDeleteResult.deletedModels.first else {
262258
completion(.success(nil))
263259
return
264260
}
265-
deletedModel = first
266-
case .failure(let error):
267-
completion(.failure(error))
268-
return
269-
}
270261

271-
guard modelSchema.isSyncable, let syncEngine = self.syncEngine else {
272-
if !modelSchema.isSystem {
273-
log.error("Unable to sync modelType (\(modelType)) where isSyncable is false")
262+
guard modelSchema.isSyncable, let syncEngine = self.syncEngine else {
263+
if !modelSchema.isSystem {
264+
log.error("Unable to sync modelType (\(modelType)) where isSyncable is false")
265+
}
266+
if self.syncEngine == nil {
267+
log.error("Unable to sync because syncEngine is nil")
268+
}
269+
completion(.success(deletedModel))
270+
return
274271
}
275-
if self.syncEngine == nil {
276-
log.error("Unable to sync because syncEngine is nil")
272+
273+
guard #available(iOS 13.0, *) else {
274+
completion(.success(deletedModel))
275+
return
277276
}
278-
completion(.success(deletedModel))
279-
return
280-
}
281277

282-
if #available(iOS 13.0, *) {
283-
let syncCompletionWrapper: DataStoreCallback<Void> = { syncResult in
284-
switch syncResult {
278+
syncDeletions(of: modelType,
279+
modelSchema: modelSchema,
280+
withModels: [deletedModel],
281+
associatedModels: queryAndDeleteResult.associatedModelsMap,
282+
syncEngine: syncEngine) {
283+
switch $0 {
285284
case .success:
286285
completion(.success(deletedModel))
287286
case .failure(let error):
288287
completion(.failure(error))
289288
}
290289
}
291-
self.syncDeletions(of: modelType,
292-
modelSchema: modelSchema,
293-
withModels: [deletedModel],
294-
associatedModels: associatedModelsFromTransactionResult,
295-
syncEngine: syncEngine,
296-
completion: syncCompletionWrapper)
297-
} else {
298-
completion(.success(deletedModel))
290+
case .failure(let error):
291+
completion(.failure(error))
299292
}
300293
}
301294

302295
func delete<M: Model>(_ modelType: M.Type,
303296
modelSchema: ModelSchema,
304-
predicate: QueryPredicate,
297+
filter: QueryPredicate,
305298
completion: @escaping DataStoreCallback<[M]>) {
306299
let transactionResult = queryAndDeleteTransaction(modelType,
307300
modelSchema: modelSchema,
308-
deleteInput: .withPredicate(predicate: predicate))
309-
let modelsFromTransactionResult = collapseMResult(transactionResult)
310-
let associatedModelsFromTransactionResult = resolveAssociatedModels(transactionResult)
311-
312-
guard modelSchema.isSyncable, let syncEngine = self.syncEngine else {
313-
if !modelSchema.isSystem {
314-
log.error("Unable to sync model (\(modelSchema.name)) where isSyncable is false")
301+
deleteInput: .withFilter(filter))
302+
switch transactionResult {
303+
case .success(let queryAndDeleteResult):
304+
guard !queryAndDeleteResult.deletedModels.isEmpty else {
305+
completion(.success(queryAndDeleteResult.deletedModels))
306+
return
315307
}
316-
if self.syncEngine == nil {
317-
log.error("Unable to sync because syncEngine is nil")
308+
309+
guard modelSchema.isSyncable, let syncEngine = self.syncEngine else {
310+
if !modelSchema.isSystem {
311+
log.error("Unable to sync model (\(modelSchema.name)) where isSyncable is false")
312+
}
313+
if self.syncEngine == nil {
314+
log.error("Unable to sync because syncEngine is nil")
315+
}
316+
completion(.success(queryAndDeleteResult.deletedModels))
317+
return
318318
}
319-
completion(modelsFromTransactionResult)
320-
return
321-
}
322319

323-
guard case .success(let queriedModels) = modelsFromTransactionResult else {
324-
completion(modelsFromTransactionResult)
325-
return
326-
}
320+
guard #available(iOS 13.0, *) else {
321+
completion(.success(queryAndDeleteResult.deletedModels))
322+
return
323+
}
327324

328-
if #available(iOS 13.0, *) {
329-
let syncCompletionWrapper: DataStoreCallback<Void> = { syncResult in
330-
switch syncResult {
325+
syncDeletions(of: modelType,
326+
modelSchema: modelSchema,
327+
withModels: queryAndDeleteResult.deletedModels,
328+
predicate: filter,
329+
associatedModels: queryAndDeleteResult.associatedModelsMap,
330+
syncEngine: syncEngine) {
331+
switch $0 {
331332
case .success:
332-
completion(modelsFromTransactionResult)
333+
completion(.success(queryAndDeleteResult.deletedModels))
333334
case .failure(let error):
334335
completion(.failure(error))
335336
}
336337
}
337-
if queriedModels.isEmpty {
338-
completion(modelsFromTransactionResult)
339-
} else {
340-
self.syncDeletions(of: modelType,
341-
modelSchema: modelSchema,
342-
withModels: queriedModels,
343-
predicate: predicate,
344-
associatedModels: associatedModelsFromTransactionResult,
345-
syncEngine: syncEngine,
346-
completion: syncCompletionWrapper)
347-
}
348-
} else {
349-
completion(modelsFromTransactionResult)
338+
339+
case .failure(let error):
340+
completion(.failure(error))
350341
}
351342
}
352343

0 commit comments

Comments
 (0)