Added code to handle Session deletion

dev_raz_wip
Laurent 7 years ago
parent be5a81acad
commit fa5a5bad53
  1. 87
      app/src/androidTest/java/net/pokeranalytics/android/ExampleInstrumentedUnitTest.kt
  2. 33
      app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt
  3. 20
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  4. 16
      app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt

@ -1,6 +1,7 @@
package net.pokeranalytics.android package net.pokeranalytics.android
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import io.realm.RealmResults
import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.ComputedResults
import net.pokeranalytics.android.calculus.SessionGroup import net.pokeranalytics.android.calculus.SessionGroup
@ -328,5 +329,91 @@ class ExampleInstrumentedUnitTest : RealmInstrumentedUnitTest() {
} }
var sessions: RealmResults<Session>? = 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")
}
}
} }

@ -3,13 +3,29 @@ package net.pokeranalytics.android
import android.app.Application import android.app.Application
import io.realm.Realm import io.realm.Realm
import io.realm.RealmConfiguration import io.realm.RealmConfiguration
import io.realm.RealmResults
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.util.PokerAnalyticsLogs import net.pokeranalytics.android.util.PokerAnalyticsLogs
import timber.log.Timber import timber.log.Timber
class PokerAnalyticsApplication: Application() { class PokerAnalyticsApplication: Application() {
// var timeFrames: RealmResults<Session>? = null var sessions: RealmResults<Session>? = null
// private val listener: OrderedRealmCollectionChangeListener<RealmResults<Session>> =
// OrderedRealmCollectionChangeListener() { realmResults: RealmResults<Session>, 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() { override fun onCreate() {
super.onCreate() super.onCreate()
@ -22,12 +38,15 @@ class PokerAnalyticsApplication: Application() {
.build() .build()
Realm.setDefaultConfiguration(realmConfiguration) Realm.setDefaultConfiguration(realmConfiguration)
// val realm: Realm = Realm.getDefaultInstance() val realm: Realm = Realm.getDefaultInstance()
// // Add observer on session time frame changes // Add observer on session time frame changes
// this.timeFrames = realm.where(Session::class.java).findAllAsync() this.sessions = realm.where(Session::class.java).findAll() // monitor session deletions
// this.timeFrames?.addChangeListener { t, changeSet -> // @todo check if main thread has running Looper, cf Realm doc this.sessions?.addChangeListener { t, changeSet ->
// changeSet.deletions
// } val deletedSessions = realm.where(Session::class.java).`in`("id", changeSet.deletions.toTypedArray()).findAll()
deletedSessions.forEach { it.cleanup() }
}
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
// Logs // Logs

@ -133,6 +133,26 @@ open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource
return 0.0 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<RowRepresentable> { override fun adapterRows(): ArrayList<RowRepresentable> {
val rows = ArrayList<RowRepresentable>() val rows = ArrayList<RowRepresentable>()
rows.addAll(SessionRow.values()) rows.addAll(SessionRow.values())

@ -78,13 +78,12 @@ open class TimeFrame : RealmObject() {
this.duration = netDuration this.duration = netDuration
} }
private fun notifySessionDateChange() { fun notifySessionDateChange() {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
var query: RealmQuery<SessionSet> = realm.where(SessionSet::class.java) var query: RealmQuery<SessionSet> = realm.where(SessionSet::class.java)
query.isNotNull("timeFrame") 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) { if (this.endDate == null) {
query.greaterThan("timeFrame.startDate", this.startDate.time).or().greaterThan("timeFrame.endDate", this.startDate.time) 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() { private fun createSessionGroup() {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
// realm.beginTransaction()
val set: SessionSet = SessionSet.newInstance(realm) val set: SessionSet = SessionSet.newInstance(realm)
set.timeFrame?.let { set.timeFrame?.let {
@ -145,9 +143,6 @@ open class TimeFrame : RealmObject() {
Timber.d("sd = : ${set.timeFrame?.startDate}, ed = ${set.timeFrame?.endDate}") 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 groupTimeFrame.endDate = null
} }
// Realm Update
// val realm = Realm.getDefaultInstance()
// realm.beginTransaction()
this.session?.sessionSet = sessionSet this.session?.sessionSet = sessionSet
// realm.copyToRealmOrUpdate(groupTimeFrame)
// realm.commitTransaction()
} }
/** /**

Loading…
Cancel
Save