Explorar o código

add batch delete request for fpus

polscm32 %!s(int64=2) %!d(string=hai) anos
pai
achega
b46fbffc94

+ 2 - 1
FreeAPS/Sources/APS/Storage/CarbsStorage.swift

@@ -168,6 +168,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
     }
 
     private func saveFPUToCoreDataAsBatchInsert(entries: [CarbsEntry]) {
+        let commonFPUID = UUID() // all fpus should only get ONE id per batch insert to be able to delete them referencing the id
         var entrySlice = ArraySlice(entries) // convert to ArraySlice
         let batchInsert = NSBatchInsertRequest(entity: CarbEntryStored.entity()) { (managedObject: NSManagedObject) -> Bool in
             guard let carbEntry = managedObject as? CarbEntryStored, let entry = entrySlice.popFirst() else {
@@ -175,7 +176,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
             }
             carbEntry.date = entry.actualDate
             carbEntry.carbs = Double(truncating: NSDecimalNumber(decimal: entry.carbs))
-            carbEntry.id = UUID()
+            carbEntry.id = commonFPUID
             carbEntry.isFPU = true
             return false // return false to continue
         }

+ 63 - 14
FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift

@@ -64,23 +64,72 @@ extension DataTable {
         }
 
         func deleteCarbs(_ carbEntry: CarbEntryStored) async {
-            do {
-                // TODO: when deleting FPU, do an NSDeleteBatchRequest and remove all entries with same FpuID
-                coredataContext.delete(carbEntry)
-                try coredataContext.save()
-                debugPrint(
-                    "Data Table State: \(#function) \(DebuggingIdentifiers.succeeded) deleted carb entry from core data"
-                )
-            } catch {
-                debugPrint(
-                    "Data Table State: \(#function) \(DebuggingIdentifiers.failed) error while deleting carb entry from core data"
-                )
-            }
+            if carbEntry.isFPU, let fpuID = carbEntry.id {
+                // fetch request for all carb entries with the same id
+                let fetchRequest: NSFetchRequest<NSFetchRequestResult> = CarbEntryStored.fetchRequest()
+                fetchRequest.predicate = NSPredicate(format: "id == %@", fpuID as CVarArg)
+
+                // NSBatchDeleteRequest
+                let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
+                deleteRequest.resultType = .resultTypeCount
+
+                do {
+                    // execute the batch delete request
+                    let result = try coredataContext.execute(deleteRequest) as? NSBatchDeleteResult
+                    debugPrint("\(DebuggingIdentifiers.succeeded) Deleted \(result?.result ?? 0) items with FpuID \(fpuID)")
+
+                    // merge changes from the database operation into the main context
+                    if let objectIDs = (result?.result as? [NSManagedObjectID]) {
+                        NSManagedObjectContext.mergeChanges(
+                            fromRemoteContextSave: [NSDeletedObjectsKey: objectIDs],
+                            into: [coredataContext]
+                        )
+                    }
+
+                    try coredataContext.save()
 
-            provider.deleteCarbs(carbEntry)
-            apsManager.determineBasalSync()
+                    provider.deleteCarbs(carbEntry)
+                    apsManager.determineBasalSync()
+                } catch {
+                    debugPrint("\(DebuggingIdentifiers.failed) Error deleting FPU entries: \(error.localizedDescription)")
+                }
+            } else {
+                do {
+                    coredataContext.delete(carbEntry)
+                    try coredataContext.save()
+                    debugPrint(
+                        "Data Table State: \(#function) \(DebuggingIdentifiers.succeeded) deleted carb entry from core data"
+                    )
+                } catch {
+                    debugPrint(
+                        "Data Table State: \(#function) \(DebuggingIdentifiers.failed) error while deleting carb entry from core data"
+                    )
+                }
+
+                provider.deleteCarbs(carbEntry)
+                apsManager.determineBasalSync()
+            }
         }
 
+//
+//        func deleteCarbs(_ carbEntry: CarbEntryStored) async {
+//            do {
+//                // TODO: when deleting FPU, do an NSDeleteBatchRequest and remove all entries with same FpuID
+//                coredataContext.delete(carbEntry)
+//                try coredataContext.save()
+//                debugPrint(
+//                    "Data Table State: \(#function) \(DebuggingIdentifiers.succeeded) deleted carb entry from core data"
+//                )
+//            } catch {
+//                debugPrint(
+//                    "Data Table State: \(#function) \(DebuggingIdentifiers.failed) error while deleting carb entry from core data"
+//                )
+//            }
+//
+//            provider.deleteCarbs(carbEntry)
+//            apsManager.determineBasalSync()
+//        }
+
         @MainActor func invokeInsulinDeletionTask(_ treatment: PumpEventStored) {
             Task {
                 do {