|
...
|
...
|
@@ -2110,7 +2110,7 @@ class HealthRawStressLocalStore { |
|
|
|
final db = await factory.openDatabase(
|
|
|
|
path,
|
|
|
|
options: OpenDatabaseOptions(
|
|
|
|
version: 8,
|
|
|
|
version: 9,
|
|
|
|
onCreate: (db, version) async {
|
|
|
|
await _createTables(db);
|
|
|
|
},
|
|
...
|
...
|
@@ -2137,6 +2137,9 @@ class HealthRawStressLocalStore { |
|
|
|
if (oldVersion < 8) {
|
|
|
|
await _addUpdateTimeColumns(db);
|
|
|
|
}
|
|
|
|
if (oldVersion < 9) {
|
|
|
|
await _addDateKeyColumns(db);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
),
|
|
|
|
);
|
|
...
|
...
|
@@ -2148,6 +2151,7 @@ class HealthRawStressLocalStore { |
|
|
|
await db.execute('''
|
|
|
|
CREATE TABLE IF NOT EXISTS $hrvResultsTable (
|
|
|
|
raw_end_time INTEGER PRIMARY KEY,
|
|
|
|
date_key INTEGER NOT NULL DEFAULT 0,
|
|
|
|
user_id INTEGER NOT NULL,
|
|
|
|
raw_hrv REAL NOT NULL DEFAULT 0,
|
|
|
|
result REAL NOT NULL,
|
|
...
|
...
|
@@ -2169,6 +2173,7 @@ CREATE TABLE IF NOT EXISTS $hrvResultsTable ( |
|
|
|
await db.execute('''
|
|
|
|
CREATE TABLE IF NOT EXISTS $realtimeStressResultsTable (
|
|
|
|
raw_end_time INTEGER PRIMARY KEY,
|
|
|
|
date_key INTEGER NOT NULL DEFAULT 0,
|
|
|
|
user_id INTEGER NOT NULL,
|
|
|
|
raw_hr REAL NOT NULL DEFAULT 0,
|
|
|
|
result REAL NOT NULL,
|
|
...
|
...
|
@@ -2190,6 +2195,7 @@ CREATE TABLE IF NOT EXISTS $realtimeStressResultsTable ( |
|
|
|
await db.execute('''
|
|
|
|
CREATE TABLE IF NOT EXISTS $dailyStressResultsTable (
|
|
|
|
date INTEGER PRIMARY KEY,
|
|
|
|
date_key INTEGER NOT NULL DEFAULT 0,
|
|
|
|
user_id INTEGER NOT NULL,
|
|
|
|
stress_value REAL NOT NULL,
|
|
|
|
stress_score INTEGER NOT NULL,
|
|
...
|
...
|
@@ -2205,6 +2211,7 @@ CREATE TABLE IF NOT EXISTS $dailyStressResultsTable ( |
|
|
|
await db.execute('''
|
|
|
|
CREATE TABLE IF NOT EXISTS $sleepResultsTable (
|
|
|
|
date INTEGER PRIMARY KEY,
|
|
|
|
date_key INTEGER NOT NULL DEFAULT 0,
|
|
|
|
user_id INTEGER NOT NULL,
|
|
|
|
start_date INTEGER NOT NULL,
|
|
|
|
sleep_score INTEGER NOT NULL,
|
|
...
|
...
|
@@ -2235,6 +2242,44 @@ CREATE TABLE IF NOT EXISTS $sleepResultsTable ( |
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> _backfillDateKey(DatabaseExecutor db, String table) async {
|
|
|
|
final timeColumn = switch (table) {
|
|
|
|
hrvResultsTable || realtimeStressResultsTable => 'raw_end_time',
|
|
|
|
dailyStressResultsTable || sleepResultsTable => 'date',
|
|
|
|
_ => null,
|
|
|
|
};
|
|
|
|
if (timeColumn == null) return;
|
|
|
|
if (table == dailyStressResultsTable) {
|
|
|
|
await db.execute(
|
|
|
|
'UPDATE $table SET date_key = date WHERE date_key = 0 AND date > 0',
|
|
|
|
);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
await db.execute(
|
|
|
|
"UPDATE $table SET date_key = CAST(strftime('%Y%m%d', "
|
|
|
|
"$timeColumn, 'unixepoch', 'localtime') AS INTEGER) "
|
|
|
|
'WHERE date_key = 0 AND $timeColumn > 0',
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> _addDateKeyColumns(DatabaseExecutor db) async {
|
|
|
|
for (final table in const [
|
|
|
|
hrvResultsTable,
|
|
|
|
realtimeStressResultsTable,
|
|
|
|
dailyStressResultsTable,
|
|
|
|
sleepResultsTable,
|
|
|
|
]) {
|
|
|
|
try {
|
|
|
|
await db.execute(
|
|
|
|
'ALTER TABLE $table ADD COLUMN date_key INTEGER NOT NULL DEFAULT 0',
|
|
|
|
);
|
|
|
|
} on DatabaseException catch (error) {
|
|
|
|
if (!error.isDuplicateColumnError()) rethrow;
|
|
|
|
}
|
|
|
|
await _backfillDateKey(db, table);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> _addFlagColumns(DatabaseExecutor db, String table) async {
|
|
|
|
for (final column in const [
|
|
|
|
'is_workout',
|
|
...
|
...
|
@@ -2381,9 +2426,15 @@ CREATE TABLE IF NOT EXISTS $sleepResultsTable ( |
|
|
|
return now.year * 10000 + now.month * 100 + now.day;
|
|
|
|
}
|
|
|
|
|
|
|
|
int _dateKeyFromUnixSeconds(int seconds) {
|
|
|
|
final date = DateTime.fromMillisecondsSinceEpoch(seconds * 1000);
|
|
|
|
return date.year * 10000 + date.month * 100 + date.day;
|
|
|
|
}
|
|
|
|
|
|
|
|
Map<String, Object?> _hrvRow(HealthRawHrvStressPoint point) {
|
|
|
|
return <String, Object?>{
|
|
|
|
'raw_end_time': point.rawEndTime,
|
|
|
|
'date_key': _dateKeyFromUnixSeconds(point.rawEndTime),
|
|
|
|
'user_id': point.userId,
|
|
|
|
'raw_hrv': point.rawHrv,
|
|
|
|
'result': _integerDouble(point.result),
|
|
...
|
...
|
@@ -2403,6 +2454,7 @@ CREATE TABLE IF NOT EXISTS $sleepResultsTable ( |
|
|
|
Map<String, Object?> _realtimeRow(HealthRawRealtimeStressPoint point) {
|
|
|
|
return <String, Object?>{
|
|
|
|
'raw_end_time': point.rawEndTime,
|
|
|
|
'date_key': _dateKeyFromUnixSeconds(point.rawEndTime),
|
|
|
|
'user_id': point.userId,
|
|
|
|
'raw_hr': point.rawHr,
|
|
|
|
'result': _integerDouble(point.result),
|
|
...
|
...
|
@@ -2417,6 +2469,7 @@ CREATE TABLE IF NOT EXISTS $sleepResultsTable ( |
|
|
|
Map<String, Object?> _dailyStressRow(HealthRawDailyStressPoint point) {
|
|
|
|
return <String, Object?>{
|
|
|
|
'date': point.date,
|
|
|
|
'date_key': point.date,
|
|
|
|
'user_id': point.userId,
|
|
|
|
'stress_value': _integerDouble(point.stressValue),
|
|
|
|
'stress_score': point.stressScore,
|
|
...
|
...
|
@@ -2430,6 +2483,7 @@ CREATE TABLE IF NOT EXISTS $sleepResultsTable ( |
|
|
|
Map<String, Object?> _sleepRow(HealthRawSleepResult result) {
|
|
|
|
return <String, Object?>{
|
|
|
|
'date': result.date,
|
|
|
|
'date_key': _dateKeyFromUnixSeconds(result.date),
|
|
|
|
'user_id': result.userId,
|
|
|
|
'start_date': result.startDate,
|
|
|
|
'sleep_score': result.sleepScore,
|
|
...
|
...
|
@@ -2487,6 +2541,7 @@ CREATE TABLE IF NOT EXISTS $sleepResultsTable ( |
|
|
|
table,
|
|
|
|
<String, Object?>{
|
|
|
|
'user_id': row['user_id'],
|
|
|
|
'date_key': row['date_key'],
|
|
|
|
if (row.containsKey('raw_hrv')) 'raw_hrv': row['raw_hrv'],
|
|
|
|
if (row.containsKey('raw_hr')) 'raw_hr': row['raw_hr'],
|
|
|
|
'result': row['result'],
|
|
...
|
...
|
@@ -2586,6 +2641,7 @@ CREATE TABLE IF NOT EXISTS $sleepResultsTable ( |
|
|
|
dailyStressResultsTable,
|
|
|
|
<String, Object?>{
|
|
|
|
'user_id': row['user_id'],
|
|
|
|
'date_key': row['date_key'],
|
|
|
|
'stress_value': row['stress_value'],
|
|
|
|
'stress_score': row['stress_score'],
|
|
|
|
'state': row['state'],
|
|
...
|
...
|
@@ -2644,6 +2700,7 @@ CREATE TABLE IF NOT EXISTS $sleepResultsTable ( |
|
|
|
sleepResultsTable,
|
|
|
|
<String, Object?>{
|
|
|
|
'user_id': row['user_id'],
|
|
|
|
'date_key': row['date_key'],
|
|
|
|
'start_date': row['start_date'],
|
|
|
|
'sleep_score': row['sleep_score'],
|
|
|
|
'sleep_state': row['sleep_state'],
|
|
...
|
...
|
@@ -2693,6 +2750,7 @@ CREATE TABLE IF NOT EXISTS $sleepResultsTable ( |
|
|
|
List<String> _rawResultStoredValueKeys(Map<String, Object?> row) {
|
|
|
|
return <String>[
|
|
|
|
'user_id',
|
|
|
|
'date_key',
|
|
|
|
if (row.containsKey('raw_hrv')) 'raw_hrv',
|
|
|
|
if (row.containsKey('raw_hr')) 'raw_hr',
|
|
|
|
'result',
|
...
|
...
|
|