Skip to content

Commit

Permalink
Merge pull request #14 from drpeterrohde/optimising-backend-(parsing-…
Browse files Browse the repository at this point in the history
…MoodSnaps])

Optimising backend (parsing mood snaps])
  • Loading branch information
drpeterrohde committed Dec 29, 2022
2 parents 5ba5e4c + f23616e commit 41a1982
Show file tree
Hide file tree
Showing 17 changed files with 57 additions and 60 deletions.
8 changes: 4 additions & 4 deletions MoodSnap/Base/DateConverters.swift
Original file line number Diff line number Diff line change
Expand Up @@ -91,18 +91,18 @@ extension Calendar {
/**
Get date range of `moodSnaps` in days.
*/
@inline(__always) func dateRange(moodSnaps: [MoodSnapStruct]) -> Int {
let first = getFirstDate(moodSnaps: moodSnaps)
@inline(__always) func dateRange(data: DataStoreClass) -> Int {
let first = getFirstDate(data: data)
let days = Calendar.current.numberOfDaysBetween(from: first, to: Date()) + 1
return days
}

/**
Convert `timescale` to days.
*/
@inline(__always) func getTimescale(timescale: Int, moodSnaps: [MoodSnapStruct]) -> Int {
@inline(__always) func getTimescale(timescale: Int, data: DataStoreClass) -> Int {
if timescale == TimeScaleEnum.all.rawValue {
return max(dateRange(moodSnaps: moodSnaps), TimeScaleEnum.month.rawValue)
return max(dateRange(data: data), TimeScaleEnum.month.rawValue)
} else {
return timescale
}
Expand Down
16 changes: 8 additions & 8 deletions MoodSnap/Base/Filtering.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ import SwiftUI
/**
Returns the earliest `Date` amongst `moodSnaps`.
*/
@inline(__always) func getFirstDate(moodSnaps: [MoodSnapStruct]) -> Date {
@inline(__always) func getFirstDate(data: DataStoreClass) -> Date {
var firstDate = Date().startOfDay()
for moodSnap in moodSnaps {
for moodSnap in data.moodSnaps {
if moodSnap.timestamp < firstDate {
if moodSnap.snapType == .mood || moodSnap.snapType == .note || moodSnap.snapType == .event || moodSnap.snapType == .media {
firstDate = moodSnap.timestamp
Expand All @@ -41,9 +41,9 @@ import SwiftUI
/**
Returns the most recent `Date` amongst `moodSnaps`.
*/
@inline(__always) func getLastDate(moodSnaps: [MoodSnapStruct]) -> Date {
@inline(__always) func getLastDate(data: DataStoreClass) -> Date {
var lastDate = Date().endOfDay()
for moodSnap in moodSnaps {
for moodSnap in data.moodSnaps {
if moodSnap.timestamp > lastDate {
lastDate = moodSnap.timestamp
}
Expand All @@ -54,10 +54,10 @@ import SwiftUI
/**
Returns an array of elements from `moodSnaps` that coincide with the same day of `date`. The optional `flatten` parameter merges them into their single day equivalent.
*/
@inline(__always) func getMoodSnapsByDate(moodSnaps: [MoodSnapStruct], date: Date, flatten: Bool = false) -> [MoodSnapStruct] {
@inline(__always) func getMoodSnapsByDate(data: DataStoreClass, date: Date, flatten: Bool = false) -> [MoodSnapStruct] {
var filtered: [MoodSnapStruct] = []
let dateComponents = date.getComponents()
for moodSnap in moodSnaps {
for moodSnap in data.moodSnaps {
if moodSnap.timestamp.getComponents() == dateComponents {
if moodSnap.snapType == .mood {
filtered.append(moodSnap)
Expand All @@ -75,10 +75,10 @@ import SwiftUI
/**
Returns an array of elements from `healthSnaps` that coincide with the same day of `date`. The optional `flatten` parameter merges them into their single day equivalent.
*/
@inline(__always) func getHealthSnapsByDate(healthSnaps: [HealthSnapStruct], date: Date, flatten: Bool = false) -> [HealthSnapStruct] {
@inline(__always) func getHealthSnapsByDate(data: HealthManager, date: Date, flatten: Bool = false) -> [HealthSnapStruct] {
var filtered: [HealthSnapStruct] = []
let dateComponents = date.getComponents()
for healthSnap in healthSnaps {
for healthSnap in data.healthSnaps {
if healthSnap.timestamp.getComponents() == dateComponents {
filtered.append(healthSnap)
}
Expand Down
8 changes: 4 additions & 4 deletions MoodSnap/Base/Utilities.swift
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,8 @@ import SwiftUI
/**
Delete a `moodSnap` from an array of `moodSnaps`.
*/
@inline(__always) func deleteHistoryItem(moodSnaps: [MoodSnapStruct], moodSnap: MoodSnapStruct) -> [MoodSnapStruct] {
return moodSnaps.filter { $0.id != moodSnap.id }
@inline(__always) func deleteHistoryItem(data: DataStoreClass, moodSnap: MoodSnapStruct) {
data.moodSnaps = data.moodSnaps.filter { $0.id != moodSnap.id }
}

/**
Expand Down Expand Up @@ -196,10 +196,10 @@ import SwiftUI
/**
How many user-created `moodSnaps` entries are there?
*/
@inline(__always) func countMoodSnaps(moodSnaps: [MoodSnapStruct], type: SnapTypeEnum = .mood) -> Int {
@inline(__always) func countMoodSnaps(data: DataStoreClass, type: SnapTypeEnum = .mood) -> Int {
var count: Int = 0

for moodSnap in moodSnaps {
for moodSnap in data.moodSnaps {
if moodSnap.snapType == type {
count += 1
}
Expand Down
6 changes: 3 additions & 3 deletions MoodSnap/DataStore/DataStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -252,11 +252,11 @@ final class DataStoreClass: Identifiable, ObservableObject {

// All data
averages.flatAll = averageMoodSnap(
timescale: getTimescale(timescale: TimeScaleEnum.all.rawValue, moodSnaps: self.moodSnaps),
timescale: getTimescale(timescale: TimeScaleEnum.all.rawValue, data: self),
data: self,
flatten: true)
averages.allAll = averageMoodSnap(
timescale: getTimescale(timescale: TimeScaleEnum.all.rawValue, moodSnaps: self.moodSnaps),
timescale: getTimescale(timescale: TimeScaleEnum.all.rawValue, data: self),
data: self,
flatten: false)

Expand Down Expand Up @@ -314,7 +314,7 @@ final class DataStoreClass: Identifiable, ObservableObject {
*/
func process() async {
// Sequence MoodSnaps
self.sequencedMoodSnaps = await sequenceMoodSnaps(moodSnaps: self.moodSnaps)
self.sequencedMoodSnaps = await sequenceMoodSnaps(data: self)
self.flattenedSequencedMoodSnaps = await flattenSequence(sequence: self.sequencedMoodSnaps)

// Processing
Expand Down
30 changes: 15 additions & 15 deletions MoodSnap/HealthKit/HealthData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import SwiftUI
@inline(__always) func getWeightData(data: DataStoreClass, health: HealthManager) -> [CGFloat?] {
var weightData: [CGFloat?] = []

var date: Date = getLastDate(moodSnaps: data.moodSnaps).endOfDay()
let earliest: Date = getFirstDate(moodSnaps: data.moodSnaps)
var date: Date = getLastDate(data: data).endOfDay()
let earliest: Date = getFirstDate(data: data)

while date >= earliest {
let thisHealthSnap = getHealthSnapsByDate(healthSnaps: health.healthSnaps, date: date, flatten: true)
let thisHealthSnap = getHealthSnapsByDate(data: health, date: date, flatten: true)
if thisHealthSnap.count > 0 {
weightData.append(thisHealthSnap[0].weight)
}
Expand All @@ -26,11 +26,11 @@ import SwiftUI
@inline(__always) func getSleepData(data: DataStoreClass, health: HealthManager) -> [CGFloat?] {
var sleepData: [CGFloat?] = []

var date: Date = getLastDate(moodSnaps: data.moodSnaps)
let earliest: Date = getFirstDate(moodSnaps: data.moodSnaps)
var date: Date = getLastDate(data: data)
let earliest: Date = getFirstDate(data: data)

while date >= earliest {
let thisHealthSnap = getHealthSnapsByDate(healthSnaps: health.healthSnaps, date: date, flatten: true)
let thisHealthSnap = getHealthSnapsByDate(data: health, date: date, flatten: true)
if thisHealthSnap.count > 0 {
sleepData.append(thisHealthSnap[0].sleepHours)
}
Expand All @@ -46,11 +46,11 @@ import SwiftUI
@inline(__always) func getDistanceData(data: DataStoreClass, health: HealthManager) -> [CGFloat?] {
var distanceData: [CGFloat?] = []

var date: Date = getLastDate(moodSnaps: data.moodSnaps)
let earliest: Date = getFirstDate(moodSnaps: data.moodSnaps)
var date: Date = getLastDate(data: data)
let earliest: Date = getFirstDate(data: data)

while date >= earliest {
let thisHealthSnap = getHealthSnapsByDate(healthSnaps: health.healthSnaps, date: date, flatten: true)
let thisHealthSnap = getHealthSnapsByDate(data: health, date: date, flatten: true)
if thisHealthSnap.count > 0 {
distanceData.append(thisHealthSnap[0].walkingRunningDistance)
}
Expand All @@ -66,11 +66,11 @@ import SwiftUI
@inline(__always) func getEnergyData(data: DataStoreClass, health: HealthManager) -> [CGFloat?] {
var energyData: [CGFloat?] = []

var date: Date = getLastDate(moodSnaps: data.moodSnaps)
let earliest: Date = getFirstDate(moodSnaps: data.moodSnaps)
var date: Date = getLastDate(data: data)
let earliest: Date = getFirstDate(data: data)

while date >= earliest {
let thisHealthSnap = getHealthSnapsByDate(healthSnaps: health.healthSnaps, date: date, flatten: true)
let thisHealthSnap = getHealthSnapsByDate(data: health, date: date, flatten: true)
if thisHealthSnap.count > 0 {
energyData.append(thisHealthSnap[0].activeEnergy)
}
Expand All @@ -86,11 +86,11 @@ import SwiftUI
@inline(__always) func getMenstrualData(data: DataStoreClass, health: HealthManager) -> [CGFloat?] {
var menstrualData: [CGFloat?] = []

var date: Date = getLastDate(moodSnaps: data.moodSnaps)
let earliest: Date = getFirstDate(moodSnaps: data.moodSnaps)
var date: Date = getLastDate(data: data)
let earliest: Date = getFirstDate(data: data)

while date >= earliest {
let thisHealthSnap = getHealthSnapsByDate(healthSnaps: health.healthSnaps, date: date, flatten: true)
let thisHealthSnap = getHealthSnapsByDate(data: health, date: date, flatten: true)
if thisHealthSnap.count > 0 {
menstrualData.append(thisHealthSnap[0].menstrual)
}
Expand Down
4 changes: 2 additions & 2 deletions MoodSnap/HealthKit/HealthManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ final class HealthManager: ObservableObject {
Generate `HealthSnapStruct`s for all dates and start processing.
*/
func makeHealthSnaps(data: DataStoreClass) async {
var date: Date = getLastDate(moodSnaps: data.moodSnaps)
let earliest: Date = getFirstDate(moodSnaps: data.moodSnaps)
var date: Date = getLastDate(data: data)
let earliest: Date = getFirstDate(data: data)

self.stopProcessing()

Expand Down
2 changes: 1 addition & 1 deletion MoodSnap/HistoryView/HistoryItemView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ struct HistoryItemView: View {
DispatchQueue.main.async {
withAnimation {
data.stopProcessing()
data.moodSnaps = deleteHistoryItem(moodSnaps: data.moodSnaps, moodSnap: moodSnap)
deleteHistoryItem(data: data, moodSnap: moodSnap)
data.startProcessing()
}
}
Expand Down
2 changes: 1 addition & 1 deletion MoodSnap/InsightsView/InsightsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ struct InsightsView: View {
@State var timescale: Int = TimeScaleEnum.all.rawValue

var body: some View {
let convertedTimescale: Int = getTimescale(timescale: timescale, moodSnaps: data.moodSnaps)
let convertedTimescale: Int = getTimescale(timescale: timescale, data: data)
let convertedTimescaleCopy: Int = convertedTimescale

NavigationView {
Expand Down
2 changes: 1 addition & 1 deletion MoodSnap/MainViews/EventView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ struct EventView: View {
withAnimation {
data.stopProcessing()
moodSnap.snapType = .event
data.moodSnaps = deleteHistoryItem(moodSnaps: data.moodSnaps, moodSnap: moodSnap)
deleteHistoryItem(data: data, moodSnap: moodSnap)
data.moodSnaps.append(moodSnap)
data.moodSnaps = sortByDate(moodSnaps: data.moodSnaps)
data.startProcessing()
Expand Down
2 changes: 1 addition & 1 deletion MoodSnap/MainViews/MediaView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ struct MediaView: View {
if data.settings.saveMediaToCameraRoll {
UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil)
}
data.moodSnaps = deleteHistoryItem(moodSnaps: data.moodSnaps, moodSnap: moodSnap)
deleteHistoryItem(data: data, moodSnap: moodSnap)
data.moodSnaps.append(moodSnap)
data.moodSnaps = sortByDate(moodSnaps: data.moodSnaps)
}
Expand Down
2 changes: 1 addition & 1 deletion MoodSnap/MainViews/MoodSnapView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ struct MoodSnapView: View {
withAnimation {
data.stopProcessing()
moodSnap.snapType = .mood
data.moodSnaps = deleteHistoryItem(moodSnaps: data.moodSnaps, moodSnap: moodSnap)
deleteHistoryItem(data: data, moodSnap: moodSnap)
data.moodSnaps.append(moodSnap)
data.moodSnaps = sortByDate(moodSnaps: data.moodSnaps)
data.settings.addedSnaps += 1
Expand Down
2 changes: 1 addition & 1 deletion MoodSnap/MainViews/NoteView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ struct NoteView: View {
withAnimation {
data.stopProcessing()
moodSnap.snapType = .note
data.moodSnaps = deleteHistoryItem(moodSnaps: data.moodSnaps, moodSnap: moodSnap)
deleteHistoryItem(data: data, moodSnap: moodSnap)
data.moodSnaps.append(moodSnap)
data.moodSnaps = sortByDate(moodSnaps: data.moodSnaps)
data.startProcessing()
Expand Down
4 changes: 2 additions & 2 deletions MoodSnap/MainViews/SettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -185,14 +185,14 @@ struct SettingsView: View {
HStack {
Text("moodsnaps_taken")
Spacer()
Text("\(countMoodSnaps(moodSnaps: data.moodSnaps))")
Text("\(countMoodSnaps(data: data))")
.foregroundColor(.secondary)
}
if data.moodSnaps.count > 0 {
HStack {
Text("first_moodsnap")
Spacer()
Text("\(getFirstDate(moodSnaps: data.moodSnaps).dateString())")
Text("\(getFirstDate(data: data).dateString())")
.foregroundColor(.secondary)
}
}
Expand Down
8 changes: 4 additions & 4 deletions MoodSnap/Statistics/Correlation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import SwiftUI
var anxietySamples: [CGFloat] = []
var irritabilitySamples: [CGFloat] = []

var date: Date = getLastDate(moodSnaps: data.moodSnaps)
let earliest: Date = getFirstDate(moodSnaps: data.moodSnaps)
var date: Date = getLastDate(data: data)
let earliest: Date = getFirstDate(data: data)

while date >= earliest {
var dayOffset: Int = 0
Expand All @@ -20,10 +20,10 @@ import SwiftUI
dayOffset = 1
}

let healthSnaps = getHealthSnapsByDate(healthSnaps: health.healthSnaps,
let healthSnaps = getHealthSnapsByDate(data: health,
date: date,
flatten: true)
let moodSnaps = getMoodSnapsByDate(moodSnaps: data.moodSnaps,
let moodSnaps = getMoodSnapsByDate(data: data,
date: date.addDays(days: dayOffset),
flatten: true)

Expand Down
10 changes: 5 additions & 5 deletions MoodSnap/Statistics/GenerateHistory.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ import SwiftUI
Sequence `moodSnaps` into chronological array.
*/
@inline(__always) func sequenceMoodSnaps(moodSnaps: [MoodSnapStruct]) async -> [[MoodSnapStruct]] {
let earliest: Date = getFirstDate(moodSnaps: moodSnaps)
@inline(__always) func sequenceMoodSnaps(data: DataStoreClass) async -> [[MoodSnapStruct]] {
let earliest: Date = getFirstDate(data: data)
let length: Int = Calendar.current.numberOfDaysBetween(from: earliest, to: Date()) + 1
var sequence: [[MoodSnapStruct]] = Array(repeating: [], count: length)

for moodSnap in moodSnaps {
for moodSnap in data.moodSnaps {
if moodSnap.snapType == .mood {
let offset = length - 1 - Calendar.current.numberOfDaysBetween(from: moodSnap.timestamp, to: Date())
sequence[offset].append(moodSnap)
Expand Down Expand Up @@ -85,8 +85,8 @@ import SwiftUI
Generate a binary timeline baed on a sequence of dates.
`nil` where there is no `date`, `1` otherwise.
*/
@inline(__always) func generateTimelineForDates(moodSnaps: [MoodSnapStruct], dates: [Date]) -> [CGFloat?] {
let earliest: Date = getFirstDate(moodSnaps: moodSnaps)
@inline(__always) func generateTimelineForDates(data: DataStoreClass, dates: [Date]) -> [CGFloat?] {
let earliest: Date = getFirstDate(data: data)
let length: Int = Calendar.current.numberOfDaysBetween(from: earliest, to: Date()) + 1
var timeline: [CGFloat?] = Array(repeating: nil, count: length)

Expand Down
9 changes: 3 additions & 6 deletions MoodSnap/Statistics/Transients.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import SwiftUI

thisButterfly.occurrences = dates.count

let timeline = generateTimelineForDates(moodSnaps: data.moodSnaps, dates: dates)
let timeline = generateTimelineForDates(data: data, dates: dates)
thisButterfly.timeline = timeline

return thisButterfly
Expand Down Expand Up @@ -60,7 +60,7 @@ import SwiftUI

thisButterfly.occurrences = dates.count

let timeline = generateTimelineForDates(moodSnaps: data.moodSnaps, dates: dates)
let timeline = generateTimelineForDates(data: data, dates: dates)
thisButterfly.timeline = timeline

return thisButterfly
Expand All @@ -70,10 +70,7 @@ import SwiftUI
Differential (average) foccused on `date`.
*/
@inline(__always) func averageDifferential(data: DataStoreClass, date: Date, window: Int) -> [CGFloat?] {
var today: [MoodSnapStruct] = getMoodSnapsByDate(
moodSnaps: data.moodSnaps,
date: date,
flatten: true)
var today: [MoodSnapStruct] = getMoodSnapsByDate(data: data, date: date, flatten: true)

let todayCount = today.count

Expand Down
2 changes: 1 addition & 1 deletion MoodSnap/Widget/Widget.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ struct WidgetsEntryView : View {

var body: some View {
let timescaleAll = getTimescale(timescale: TimeScaleEnum.all.rawValue,
moodSnaps: data.moodSnaps)
data: data)
ZStack {
switch type {
case .moodHistoryLargeAll:
Expand Down

0 comments on commit 41a1982

Please sign in to comment.