Reverse the direction of Session -> ComputableResult relationship for better performance

feature/top10
Laurent 7 years ago
parent 67fbe15a7e
commit efa3823e0f
  1. 3
      app/src/androidTest/java/net/pokeranalytics/android/RealmInstrumentedUnitTest.kt
  2. 3
      app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt
  3. 11
      app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt
  4. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt
  5. 20
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  6. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt
  7. 15
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt
  8. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/SessionObserverFragment.kt

@ -18,7 +18,8 @@ open class RealmInstrumentedUnitTest {
fun newSessionInstance(realm: Realm) : Session {
val session = realm.createObject(Session::class.java, UUID.randomUUID().toString())
session.computableResult = realm.createObject(ComputableResult::class.java)
val computableResult = realm.createObject(ComputableResult::class.java)
computableResult.session = session
session.result = realm.createObject(Result::class.java)
return session
}

@ -219,6 +219,9 @@ class Calculator {
}
}
}
else -> {
// nothing
}
}
var average = 0.0

@ -1,9 +1,6 @@
package net.pokeranalytics.android.model.realm
import io.realm.RealmObject
import io.realm.RealmResults
import io.realm.annotations.Ignore
import io.realm.annotations.LinkingObjects
import net.pokeranalytics.android.calculus.interfaces.Computable
open class ComputableResult : RealmObject(), Computable {
@ -24,11 +21,11 @@ open class ComputableResult : RealmObject(), Computable {
override var sessionSet: SessionSet? = null
@LinkingObjects("computableResult")
private val sessions: RealmResults<Session>? = null
// @LinkingObjects("computableResult")
// private val sessions: RealmResults<Session>? = null
@Ignore
val session: Session? = this.sessions?.firstOrNull()
// @Ignore
var session: Session? = null
fun updateWith(session: Session) {

@ -27,7 +27,7 @@ open class Currency : RealmObject() {
// could be async
val query = this.realm.where(ComputableResult::class.java)
query.`in`("sessions.bankroll.currency.id", arrayOf(this.id))
query.`in`("session.bankroll.currency.id", arrayOf(this.id))
val cResults = query.findAll()
cResults.forEach { computable ->

@ -4,8 +4,10 @@ import android.content.Context
import io.realm.Realm
import io.realm.RealmList
import io.realm.RealmObject
import io.realm.RealmResults
import io.realm.annotations.Ignore
import io.realm.annotations.Index
import io.realm.annotations.LinkingObjects
import io.realm.annotations.PrimaryKey
import io.realm.kotlin.where
import net.pokeranalytics.android.R
@ -61,7 +63,10 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource
fun newInstance(realm: Realm, isTournament: Boolean, bankroll: Bankroll? = null): Session {
val session = Session()
session.result = Result()
session.computableResult = ComputableResult()
val computableResult = ComputableResult()
computableResult.session = session
if (bankroll != null) {
session.bankroll = bankroll
} else {
@ -86,7 +91,13 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource
/**
* Optimized result for faster stats
*/
var computableResult: ComputableResult? = null
// var computableResult: ComputableResult? = null
@LinkingObjects("session")
private val computableResults: RealmResults<ComputableResult>? = null
@Ignore
val computableResult: ComputableResult? = this.computableResults?.firstOrNull()
// Timed interface
@ -293,10 +304,11 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource
}
fun updateComputableResult() {
this.computableResult?.let {
this.computableResults?.forEach {
it.updateWith(this)
} ?: run {
throw IllegalStateException("Session should always have a Light Result")
throw IllegalStateException("Session should always have a computable results")
}
}

@ -57,7 +57,7 @@ open class SessionSet : RealmObject(), Timed {
}
fun computeStats() {
this.ratedNet = this.sessions?.sumByDouble { it.computableResult!!.ratedNet } ?: 0.0
this.ratedNet = this.sessions?.sumByDouble { it.computableResult?.ratedNet ?: 0.0 } ?: 0.0
this.estimatedHands = this.sessions?.sumByDouble { it.estimatedHands } ?: 0.0
this.bbNetResult = this.sessions?.sumByDouble { it.bbNetResult } ?: 0.0
}

@ -166,25 +166,16 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
val s = Date()
val allSessions = realm.where(ComputableResult::class.java).isNotNull("sessions.endDate").findAll()
val allSessions = realm.where(ComputableResult::class.java).isNotNull("session.endDate").findAll()
val allSessionSets = realm.where(SessionSet::class.java).findAll()
Timber.d(">>>>> number of computables to compute = ${allSessions.size}")
val cgSessions = allSessions.where().equalTo("sessions.type", Session.Type.CASH_GAME.ordinal).findAll()
val cgSessions = allSessions.where().equalTo("session.type", Session.Type.CASH_GAME.ordinal).findAll()
val cgSessionSets = realm.where(SessionSet::class.java).equalTo("sessions.type", Session.Type.CASH_GAME.ordinal).findAll()
val tSessions = allSessions.where().equalTo("sessions.type", Session.Type.TOURNAMENT.ordinal).findAll()
val tSessions = allSessions.where().equalTo("session.type", Session.Type.TOURNAMENT.ordinal).findAll()
val tSessionSets = realm.where(SessionSet::class.java).equalTo("sessions.type", Session.Type.TOURNAMENT.ordinal).findAll()
// val computableList = realm.copyFromRealm(allSessions)
// computableList.forEach { session ->
// if (true) { // @todo
// cgSessions.add(session)
// } else {
// tSessions.add(session)
// }
// }
val e = Date()
val duration = (e.time - s.time) / 1000.0
Timber.d(">>> filtering in ${duration} seconds")

@ -10,7 +10,7 @@ open class SessionObserverFragment : PokerAnalyticsFragment() {
init {
val realm = Realm.getDefaultInstance()
this.endedSessions = realm.where(ComputableResult::class.java).isNotNull("sessions.endDate").findAll()
this.endedSessions = realm.where(ComputableResult::class.java).isNotNull("session.endDate").findAll()
this.endedSessions.addChangeListener { _, _ ->
this.sessionsChanged()
}

Loading…
Cancel
Save