Commit 549f63b

derdilla <derdilla06@gmail.com>
2023-06-02 18:33:06
refactor analysis code
1 parent 0d6a734
lib/model/blood_pressure.dart
@@ -49,11 +49,9 @@ class BloodPressureModel extends ChangeNotifier {
 
   /// Adds a new measurement at the correct chronological position in the List.
   Future<void> add(BloodPressureRecord measurement) async {
-    assert(_database.isOpen);
-
-    var existing = _database.query('bloodPressureModel', where: 'timestamp = ?',
+    final existing = await _database.query('bloodPressureModel', where: 'timestamp = ?',
         whereArgs: [measurement.creationTime.millisecondsSinceEpoch]);
-    if ((await existing).isNotEmpty) {
+    if (existing.isNotEmpty) {
         await _database.update('bloodPressureModel', {
           'systolic': measurement.systolic,
           'diastolic': measurement.diastolic,
@@ -70,34 +68,27 @@ class BloodPressureModel extends ChangeNotifier {
         'notes': measurement.notes
       });
     }
+    notifyListeners();
+  }
 
+  Future<void> delete(DateTime timestamp) async {
+    _database.delete('bloodPressureModel', where: 'timestamp = ?', whereArgs: [timestamp.millisecondsSinceEpoch]);
     notifyListeners();
   }
 
   /// Returns all recordings in saved in a range in ascending order
   Future<UnmodifiableListView<BloodPressureRecord>> getInTimeRange(DateTime from, DateTime to) async {
-    var dbEntries = await _database.query('bloodPressureModel',
+    final dbEntries = await _database.query('bloodPressureModel',
       orderBy: 'timestamp DESC',
       where: 'timestamp BETWEEN ? AND ?',
       whereArgs: [from.millisecondsSinceEpoch, to.millisecondsSinceEpoch]
     ); // descending
-    // synchronous part
-    List<BloodPressureRecord> recordsInRange = [];
-    for (var e in dbEntries) {
-      recordsInRange.add(BloodPressureRecord(
-          DateTime.fromMillisecondsSinceEpoch(e['timestamp']as int),
-          e['systolic'] as int,
-          e['diastolic'] as int,
-          e['pulse'] as int,
-          e['notes'].toString())
-      );
-    }
+    List<BloodPressureRecord> recordsInRange = _convert(dbEntries);
     return UnmodifiableListView(recordsInRange);
   }
 
-  Future<void> delete(DateTime timestamp) async {
-    _database.delete('bloodPressureModel', where: 'timestamp = ?', whereArgs: [timestamp.millisecondsSinceEpoch]);
-    notifyListeners();
+  Future<List<Map<String, Object?>>> get bloodPressureModel {
+    return _database.query('bloodPressureModel', columns: ['*']);
   }
   
   Future<int> get count async {
@@ -229,6 +220,20 @@ class BloodPressureModel extends ChangeNotifier {
       return (v as double?)?.toInt();
     }
   }
+
+  List<BloodPressureRecord> _convert(List<Map<String, Object?>> dbResult) {
+    List<BloodPressureRecord> records = [];
+    for (var e in dbResult) {
+      records.add(BloodPressureRecord(
+          DateTime.fromMillisecondsSinceEpoch(e['timestamp']as int),
+          e['systolic'] as int,
+          e['diastolic'] as int,
+          e['pulse'] as int,
+          e['notes'].toString())
+      );
+    }
+    return records;
+  }
 }
 
 @immutable
lib/model/blood_pressure_analyzer.dart
@@ -1,4 +1,5 @@
 import 'package:blood_pressure_app/model/blood_pressure.dart';
+import 'package:collection/collection.dart';
 
 class BloodPressureAnalyser {
   final BloodPressureModel _model;
@@ -31,7 +32,7 @@ class BloodPressureAnalyser {
     List<List<int>> allPulValuesRelativeToTime = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]];
 
     // sort all data
-    final dbRes = await _database.query('bloodPressureModel', columns: ['*']);
+    final dbRes = await _model.bloodPressureModel;
     for (var entry in dbRes) {
       DateTime ts = DateTime.fromMillisecondsSinceEpoch(entry['timestamp'] as int);
       allDiaValuesRelativeToTime[ts.hour].add(entry['diastolic'] as int);
@@ -40,13 +41,13 @@ class BloodPressureAnalyser {
     }
     for(int i = 0; i < 24; i++) {
       if (allDiaValuesRelativeToTime[i].isEmpty) {
-        allDiaValuesRelativeToTime[i].add(await avgDia);
+        allDiaValuesRelativeToTime[i].add(await _model.avgDia);
       }
       if (allSysValuesRelativeToTime[i].isEmpty) {
-        allSysValuesRelativeToTime[i].add(await avgSys);
+        allSysValuesRelativeToTime[i].add(await _model.avgSys);
       }
       if (allPulValuesRelativeToTime[i].isEmpty) {
-        allPulValuesRelativeToTime[i].add(await avgPul);
+        allPulValuesRelativeToTime[i].add(await _model.avgPul);
       }
     }
 
lib/screens/statistics.dart
@@ -1,4 +1,5 @@
 import 'package:blood_pressure_app/model/blood_pressure.dart';
+import 'package:blood_pressure_app/model/blood_pressure_analyzer.dart';
 import 'package:blood_pressure_app/model/settings_store.dart';
 import 'package:fl_chart/fl_chart.dart';
 import 'package:flutter/material.dart';
@@ -38,7 +39,7 @@ class StatisticsPage extends StatelessWidget {
                     ),
                     Statistic(
                         caption: const Text('Measurements per Day'),
-                        child: futureInt(model.measurementsPerDay)
+                        child: futureInt(BloodPressureAnalyser(model).measurementsPerDay)
                     ),
                     StatisticsRow(
                       caption2: Text('Diastolic min.',
@@ -66,7 +67,7 @@ class StatisticsPage extends StatelessWidget {
                     Statistic(
                       caption: const Text('Time-Resolved Metrics'),
                       child: FutureBuilder<List<List<int>>>(
-                          future: model.allAvgsRelativeToDaytime,
+                          future: BloodPressureAnalyser(model).allAvgsRelativeToDaytime,
                           builder: (BuildContext context, AsyncSnapshot<List<
                               List<int>>> snapshot) {
                             switch (snapshot.connectionState) {