From fa5a5bad53e9653d4943a6a35193c7b73fd42856 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 20 Feb 2019 17:35:08 +0100 Subject: [PATCH] Added code to handle Session deletion --- .../android/ExampleInstrumentedUnitTest.kt | 87 +++++++++++++++++++ .../android/PokerAnalyticsApplication.kt | 33 +++++-- .../android/model/realm/Session.kt | 20 +++++ .../android/model/realm/TimeFrame.kt | 16 +--- 4 files changed, 135 insertions(+), 21 deletions(-) diff --git a/app/src/androidTest/java/net/pokeranalytics/android/ExampleInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/ExampleInstrumentedUnitTest.kt index a9ad2477..5afe3fd0 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/ExampleInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/ExampleInstrumentedUnitTest.kt @@ -1,6 +1,7 @@ package net.pokeranalytics.android import androidx.test.ext.junit.runners.AndroidJUnit4 +import io.realm.RealmResults import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.SessionGroup @@ -328,5 +329,91 @@ class ExampleInstrumentedUnitTest : RealmInstrumentedUnitTest() { } + var sessions: RealmResults? = null + @Test + fun testOverlappingSessionDeletion() { + + val realm = this.mockRealm +// this.sessions = realm.where(Session::class.java).findAll() // monitor session deletions + +// Looper.prepare() +// this.sessions?.addChangeListener { t, changeSet -> +// +// val deletedSessions = realm.where(Session::class.java).`in`("id", changeSet.deletions.toTypedArray()).findAll() +// deletedSessions.forEach { it.cleanup() } +// +// } +// Looper.loop() + + realm.beginTransaction() + + var s1 = realm.createObject(Session::class.java, "1") + var s2 = realm.createObject(Session::class.java, "2") + var s3 = realm.createObject(Session::class.java, "3") + + s1.timeFrame = realm.createObject(TimeFrame::class.java) + s2.timeFrame = realm.createObject(TimeFrame::class.java) + s3.timeFrame = realm.createObject(TimeFrame::class.java) + + realm.insert(s1) + realm.insert(s2) + realm.insert(s3) + realm.commitTransaction() + + val sdf = SimpleDateFormat("dd/M/yyyy hh:mm") + + val sd1 = sdf.parse("01/1/2019 05:00") + val ed1 = sdf.parse("01/1/2019 09:00") + val sd2 = sdf.parse("01/1/2019 07:00") + val ed2 = sdf.parse("01/1/2019 11:00") + val sd3 = sdf.parse("01/1/2019 03:00") + val ed3 = sdf.parse("01/1/2019 06:00") + + realm.beginTransaction() + + s1.timeFrame?.setDate(sd1, ed1) // duration = 4h + s2.timeFrame?.setDate(sd2, ed2) // duration = 4h + s3.timeFrame?.setDate(sd3, ed3) // duration = 3h + + realm.copyToRealmOrUpdate(s1) + realm.copyToRealmOrUpdate(s2) + realm.copyToRealmOrUpdate(s3) + + realm.commitTransaction() + + val sessions = realm.where(Session::class.java).findAll() + val group = SessionGroup(name = "test", sessions = sessions) + + var options = Calculator.Options() + options.displayedStats = listOf(Stat.STANDARD_DEVIATION_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION) + + val results: ComputedResults = Calculator.compute(group, options) + val delta = 0.01 + + val duration = results.computedStat(Stat.DURATION) + if (duration != null) { + assertEquals(8.0, duration.value, delta) + } else { + Assert.fail("No duration stat") + } + + realm.beginTransaction() + s1.deleteFromRealm() + realm.commitTransaction() +// realm.executeTransaction { +// s1.deleteFromRealm() +// } + + val group2 = SessionGroup(name = "test", sessions = sessions) + val results2: ComputedResults = Calculator.compute(group2, options) + + val duration2 = results2.computedStat(Stat.DURATION) + if (duration2 != null) { + assertEquals(7.0, duration2.value, delta) + } else { + Assert.fail("No duration2 stat") + } + + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index ede13e9f..293d6a4e 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -3,13 +3,29 @@ package net.pokeranalytics.android import android.app.Application import io.realm.Realm import io.realm.RealmConfiguration +import io.realm.RealmResults +import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.util.PokerAnalyticsLogs import timber.log.Timber class PokerAnalyticsApplication: Application() { -// var timeFrames: RealmResults? = null + var sessions: RealmResults? = null + +// private val listener: OrderedRealmCollectionChangeListener> = +// OrderedRealmCollectionChangeListener() { realmResults: RealmResults, changeSet: OrderedCollectionChangeSet -> +// +// if (changeSet == null) { +// return@OrderedRealmCollectionChangeListener +// } +// +// val realm: Realm = Realm.getDefaultInstance() +// +// val deletedSessions = realm.where(Session::class.java).`in`("id", changeSet.deletions.toTypedArray()).findAll() +// deletedSessions.forEach { it.cleanup() } +// +// } override fun onCreate() { super.onCreate() @@ -22,12 +38,15 @@ class PokerAnalyticsApplication: Application() { .build() Realm.setDefaultConfiguration(realmConfiguration) -// val realm: Realm = Realm.getDefaultInstance() -// // Add observer on session time frame changes -// this.timeFrames = realm.where(Session::class.java).findAllAsync() -// this.timeFrames?.addChangeListener { t, changeSet -> // @todo check if main thread has running Looper, cf Realm doc -// changeSet.deletions -// } + val realm: Realm = Realm.getDefaultInstance() + // Add observer on session time frame changes + this.sessions = realm.where(Session::class.java).findAll() // monitor session deletions + this.sessions?.addChangeListener { t, changeSet -> + + val deletedSessions = realm.where(Session::class.java).`in`("id", changeSet.deletions.toTypedArray()).findAll() + deletedSessions.forEach { it.cleanup() } + + } if (BuildConfig.DEBUG) { // Logs diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index 1278ccb9..3a853b8c 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -133,6 +133,26 @@ open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource return 0.0 } + fun cleanup() { + + this.sessionSet?.let { set -> + + val sessionsFromSet = set.sessions + + set.deleteFromRealm() + this.timeFrame?.deleteFromRealm() + this.result?.deleteFromRealm() + + sessionsFromSet?.let { sessions -> + sessions.forEach { session -> + session.timeFrame?.notifySessionDateChange() + } + } + } + + } + + override fun adapterRows(): ArrayList { val rows = ArrayList() rows.addAll(SessionRow.values()) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt index 3bb44aa8..49481045 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt @@ -78,13 +78,12 @@ open class TimeFrame : RealmObject() { this.duration = netDuration } - private fun notifySessionDateChange() { + fun notifySessionDateChange() { val realm = Realm.getDefaultInstance() var query: RealmQuery = realm.where(SessionSet::class.java) query.isNotNull("timeFrame") - Timber.d("this> sd = : ${this.startDate}, ed = ${this.endDate}") - +// Timber.d("this> sd = : ${this.startDate}, ed = ${this.endDate}") if (this.endDate == null) { query.greaterThan("timeFrame.startDate", this.startDate.time).or().greaterThan("timeFrame.endDate", this.startDate.time) @@ -127,7 +126,6 @@ open class TimeFrame : RealmObject() { private fun createSessionGroup() { val realm = Realm.getDefaultInstance() -// realm.beginTransaction() val set: SessionSet = SessionSet.newInstance(realm) set.timeFrame?.let { @@ -145,9 +143,6 @@ open class TimeFrame : RealmObject() { Timber.d("sd = : ${set.timeFrame?.startDate}, ed = ${set.timeFrame?.endDate}") -// this.session?.sessionSet = set -// set.sessions.add(this.session) -// realm.commitTransaction() } /** @@ -168,15 +163,8 @@ open class TimeFrame : RealmObject() { groupTimeFrame.endDate = null } - // Realm Update -// val realm = Realm.getDefaultInstance() -// realm.beginTransaction() - this.session?.sessionSet = sessionSet -// realm.copyToRealmOrUpdate(groupTimeFrame) -// realm.commitTransaction() - } /**