From 493e98f9abe6a770d097ea132b9f81fa33239335 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sun, 22 Aug 2021 22:19:37 +0200
Subject: [PATCH] #9 - refactoring

---
 src/logic/database/DatabaseCleaner.py | 52 +++++++++++++++------------
 1 file changed, 29 insertions(+), 23 deletions(-)

diff --git a/src/logic/database/DatabaseCleaner.py b/src/logic/database/DatabaseCleaner.py
index 3cb0200..97f8892 100644
--- a/src/logic/database/DatabaseCleaner.py
+++ b/src/logic/database/DatabaseCleaner.py
@@ -29,35 +29,41 @@ class DatabaseCleaner:
             for sensor in allSensors:
                 LOGGER.debug(f'Cleaning measurements for sensor "{sensor.name}" '
                              f'(id: {sensor.id}, device_id: {sensor.device_id})')
+                self._cleanup_measurements_for_sensor(sensor, db, policy, policyStart)
 
-                firstMeasurement = Crud.get_first_measurement_for_sensor(db=db, sensorId=sensor.id)
-                if firstMeasurement is None:
-                    continue
-
-                minDate = datetime.strptime(firstMeasurement.timestamp, Crud.DATE_FORMAT).date()
-
-                processedDate = policyStart
-                while processedDate > minDate:
-                    LOGGER.debug(f'Cleaning {processedDate.strftime("%Y-%m-%d")}...')
-                    measurementIds, idsToDelete = DatabaseCleaner._categorize_measurements_for_day(db,
-                                                                                                   date=processedDate,
-                                                                                                   policy=policy,
-                                                                                                   sensorId=sensor.id)
-
-                    processedDate = processedDate - timedelta(days=1)
+        LOGGER.info('Database cleanup done')
 
-                    if not idsToDelete:
-                        continue
+        # TODO: force backup?
 
-                    LOGGER.debug(
-                        f'Scheduled {len(idsToDelete)} measurements for deletion (keeping: {len(measurementIds)}, '
-                        f'max allowed: {policy.numberOfMeasurementsPerDay})')
+    @staticmethod
+    def _cleanup_measurements_for_sensor(sensor: Schemas.Sensor, db: Session,
+                                         policy: RetentionPolicy, policyStart: datetime.date):
+        firstMeasurement = Crud.get_first_measurement_for_sensor(db=db, sensorId=sensor.id)
+        if firstMeasurement is None:
+            return
 
-                    Crud.delete_multiple_measurements(db, idsToDelete)
+        minDate = datetime.strptime(firstMeasurement.timestamp, Crud.DATE_FORMAT).date()
 
-        LOGGER.info('Database cleanup done')
+        processedDate = policyStart
+        while processedDate > minDate:
+            LOGGER.debug(f'Cleaning {processedDate.strftime("%Y-%m-%d")}...')
+            DatabaseCleaner._cleanup_measurements_for_day(db, processedDate, policy, sensor.id)
+            processedDate = processedDate - timedelta(days=1)
 
-        # TODO: force backup?
+    @staticmethod
+    def _cleanup_measurements_for_day(db: Session, date: datetime.date,
+                                      policy: RetentionPolicy, sensor_id: int):
+        measurementIds, idsToDelete = DatabaseCleaner._categorize_measurements_for_day(db,
+                                                                                       date=date,
+                                                                                       policy=policy,
+                                                                                       sensorId=sensor_id)
+
+        if not idsToDelete:
+            return
+
+        LOGGER.debug(f'Scheduled {len(idsToDelete)} measurements for deletion '
+                     f'(keeping: {len(measurementIds)}, max allowed: {policy.numberOfMeasurementsPerDay})')
+        Crud.delete_multiple_measurements(db, idsToDelete)
 
     @staticmethod
     def _categorize_measurements_for_day(db: Session, date: datetime.date,
-- 
GitLab