Skip to content

Commit

Permalink
daysSinceLast query excludes the triggering event
Browse files Browse the repository at this point in the history
If the triggering event name matches the daysSinceLast... rule event, it'll look for the first event that occurred before the triggering event.
  • Loading branch information
yusuftor committed Jun 28, 2023
1 parent e532922 commit 9f6d280
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ struct ExpressionEvaluator {

await ruleAttributes.addDaysSinceLastAttributes(
given: rule,
triggerEvent: eventData,
coreDataManager: storage.coreDataManager
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ struct RuleAttributes {

mutating func addDaysSinceLastAttributes(
given rule: TriggerRule,
triggerEvent event: EventData,
coreDataManager: CoreDataManager
) async {
let expression = rule.expressionJs ?? rule.expression ?? ""
Expand All @@ -33,7 +34,10 @@ struct RuleAttributes {
}

for name in eventNames {
if let daysSinceLastEvent = await coreDataManager.getDaysSinceLastEvent(name: name) {
if let daysSinceLastEvent = await coreDataManager.getDaysSinceEvent(
name: name,
before: event.name == name ? event.createdAt : nil
) {
let attribute = eventPrefix + name
device[attribute] = daysSinceLastEvent
}
Expand Down
14 changes: 10 additions & 4 deletions Sources/SuperwallKit/Storage/Core Data/CoreDataManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -101,22 +101,28 @@ class CoreDataManager {
}
}

func getDaysSinceLastEvent(name: String) async -> Int? {
func getDaysSinceEvent(
name: String,
before date: Date?
) async -> Int? {
return await withCheckedContinuation { continuation in
coreDataStack.getLastSavedEvent(name: name) { event in
coreDataStack.getLastSavedEvent(
name: name,
before: date
) { event in
guard let event = event else {
return continuation.resume(returning: nil)
}
let createdAt = event.createdAt
let calendar = Calendar.current
let currentDate = Date()
let components = calendar.dateComponents(
[.day],
[.minute],
from: createdAt,
to: currentDate
)

continuation.resume(returning: components.day)
continuation.resume(returning: components.minute)
}
}
}
Expand Down
7 changes: 6 additions & 1 deletion Sources/SuperwallKit/Storage/Core Data/CoreDataStack.swift
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ class CoreDataStack {

func getLastSavedEvent(
name: String,
before date: Date?,
completion: @escaping ((ManagedEventData?) -> Void)
) {
guard let backgroundContext = backgroundContext else {
Expand All @@ -139,7 +140,11 @@ class CoreDataStack {

backgroundContext.perform {
let fetchRequest = ManagedEventData.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "name == %@", name)
if let date = date {
fetchRequest.predicate = NSPredicate(format: "name == %@ AND createdAt < %@", name, date as NSDate)
} else {
fetchRequest.predicate = NSPredicate(format: "name == %@", name)
}
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "createdAt", ascending: false)]
fetchRequest.fetchLimit = 1

Expand Down

0 comments on commit 9f6d280

Please sign in to comment.