Performance improvements + tests

feature/top10
Laurent 7 years ago
parent b688d72fc0
commit fb42ed1a4a
  1. 18
      app/src/androidTest/java/net/pokeranalytics/android/BankrollInstrumentedUnitTest.kt
  2. 13
      app/src/androidTest/java/net/pokeranalytics/android/FavoriteSessionUnitTest.kt
  3. 16
      app/src/androidTest/java/net/pokeranalytics/android/RealmInstrumentedUnitTest.kt
  4. 82
      app/src/androidTest/java/net/pokeranalytics/android/StatsInstrumentedUnitTest.kt
  5. 2
      app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt
  6. 154
      app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt
  7. 13
      app/src/main/java/net/pokeranalytics/android/calculus/ComputableGroup.kt
  8. 10
      app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt
  9. 13
      app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt
  10. 3
      app/src/main/java/net/pokeranalytics/android/model/realm/Result.kt
  11. 31
      app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt
  12. 3
      app/src/main/java/net/pokeranalytics/android/model/utils/SessionSetManager.kt
  13. 45
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt

@ -2,12 +2,11 @@ package net.pokeranalytics.android
import androidx.test.ext.junit.runners.AndroidJUnit4
import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.calculus.ComputedResults
import net.pokeranalytics.android.calculus.ComputableGroup
import net.pokeranalytics.android.calculus.ComputedResults
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.realm.Bankroll
import net.pokeranalytics.android.model.realm.*
import net.pokeranalytics.android.model.realm.Currency
import net.pokeranalytics.android.model.realm.Session
import org.junit.Assert
import org.junit.Test
import org.junit.runner.RunWith
@ -31,8 +30,8 @@ class BankrollInstrumentedUnitTest : RealmInstrumentedUnitTest() {
val realm = this.mockRealm
realm.beginTransaction()
val s1 = realm.createObject(Session::class.java, "1")
val s2 = realm.createObject(Session::class.java, "2")
val s1 = RealmInstrumentedUnitTest.newSessionInstance(realm)
val s2 = RealmInstrumentedUnitTest.newSessionInstance(realm)
val br1 = realm.createObject(Bankroll::class.java, "1")
val br2 = realm.createObject(Bankroll::class.java, "2")
@ -47,16 +46,15 @@ class BankrollInstrumentedUnitTest : RealmInstrumentedUnitTest() {
s1.bankroll = br1
s2.bankroll = br2
s1.result = realm.createObject(net.pokeranalytics.android.model.realm.Result::class.java)
s2.result = realm.createObject(net.pokeranalytics.android.model.realm.Result::class.java)
s1.result?.netResult = 100.0
s2.result?.netResult = 200.0
realm.commitTransaction()
val sessions = realm.where(Session::class.java).findAll()
val group = ComputableGroup(name = "test", computables = sessions)
val computableResults = realm.where(ComputableResult::class.java).findAll()
val sets = realm.where(SessionSet::class.java).findAll()
val stats: List<Stat> = listOf(Stat.NETRESULT, Stat.AVERAGE)
val group = ComputableGroup("test", computableResults, sets, stats)
val options = Calculator.Options()

@ -13,15 +13,16 @@ import org.junit.runner.RunWith
class FavoriteSessionUnitTest : RealmInstrumentedUnitTest() {
@Test
fun testFavoriteWithoutLocation() {
val realm = this.mockRealm
realm.beginTransaction()
val s1 = realm.createObject(Session::class.java, "1")
val s2 = realm.createObject(Session::class.java, "2")
val s3 = realm.createObject(Session::class.java, "3")
val s1 = RealmInstrumentedUnitTest.newSessionInstance(realm)
val s2 = RealmInstrumentedUnitTest.newSessionInstance(realm)
val s3 = RealmInstrumentedUnitTest.newSessionInstance(realm)
s1.cgBigBlind = 4.0
s2.cgBigBlind = 4.0
@ -48,9 +49,9 @@ class FavoriteSessionUnitTest : RealmInstrumentedUnitTest() {
val realm = this.mockRealm
realm.beginTransaction()
val s1 = realm.createObject(Session::class.java, "1")
val s2 = realm.createObject(Session::class.java, "2")
val s3 = realm.createObject(Session::class.java, "3")
val s1 = RealmInstrumentedUnitTest.newSessionInstance(realm)
val s2 = RealmInstrumentedUnitTest.newSessionInstance(realm)
val s3 = RealmInstrumentedUnitTest.newSessionInstance(realm)
val loc1 = realm.createObject(Location::class.java, "1")
val loc2 = realm.createObject(Location::class.java, "2")

@ -2,15 +2,29 @@ package net.pokeranalytics.android
import io.realm.Realm
import io.realm.RealmConfiguration
import net.pokeranalytics.android.model.realm.ComputableResult
import net.pokeranalytics.android.model.realm.Result
import net.pokeranalytics.android.model.realm.Session
import org.junit.After
import org.junit.Before
import java.util.*
open class RealmInstrumentedUnitTest {
lateinit var mockRealm: Realm
companion object {
fun newSessionInstance(realm: Realm) : Session {
val session = realm.createObject(Session::class.java, UUID.randomUUID().toString())
session.computableResult = realm.createObject(ComputableResult::class.java)
session.result = realm.createObject(Result::class.java)
return session
}
}
@Before
fun setup() {

@ -1,24 +1,18 @@
package net.pokeranalytics.android
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.realm.Realm
import io.realm.RealmList
import io.realm.RealmResults
import io.realm.kotlin.where
import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.calculus.ComputedResults
import net.pokeranalytics.android.calculus.ComputableGroup
import net.pokeranalytics.android.calculus.ComputedResults
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.Limit
import net.pokeranalytics.android.model.realm.*
import org.junit.Assert
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import timber.log.Timber
import java.text.SimpleDateFormat
import java.time.LocalDate
import java.time.Period
import java.util.*
/**
@ -88,11 +82,8 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() {
val realm = this.mockRealm
realm.beginTransaction()
val s1 = realm.createObject(Session::class.java, "1")
val s2 = realm.createObject(Session::class.java, "2")
s1.result = realm.createObject(net.pokeranalytics.android.model.realm.Result::class.java)
s2.result = realm.createObject(net.pokeranalytics.android.model.realm.Result::class.java)
val s1 = RealmInstrumentedUnitTest.newSessionInstance(realm)
val s2 = RealmInstrumentedUnitTest.newSessionInstance(realm)
s1.result?.buyin = 100.0 // net result = -100
s2.result?.buyin = 200.0
@ -126,8 +117,10 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() {
realm.commitTransaction()
val sessions = realm.where(Session::class.java).findAll()
val group = ComputableGroup(name = "test", computables = sessions)
val computableResults = realm.where(ComputableResult::class.java).findAll()
val sets = realm.where(SessionSet::class.java).findAll()
val stats: List<Stat> = listOf(Stat.NETRESULT, Stat.AVERAGE)
val group = ComputableGroup("test", computableResults, sets, stats)
val options = Calculator.Options()
options.displayedStats = listOf(Stat.STANDARD_DEVIATION_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION)
@ -247,11 +240,8 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() {
val realm = this.mockRealm
realm.beginTransaction()
val s1 = realm.createObject(Session::class.java, "1")
val s2 = realm.createObject(Session::class.java, "2")
s1.result = realm.createObject(net.pokeranalytics.android.model.realm.Result::class.java)
s2.result = realm.createObject(net.pokeranalytics.android.model.realm.Result::class.java)
val s1 = RealmInstrumentedUnitTest.newSessionInstance(realm)
val s2 = RealmInstrumentedUnitTest.newSessionInstance(realm)
realm.insert(s1)
realm.insert(s2)
@ -276,8 +266,10 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() {
realm.commitTransaction()
val sessions = realm.where(Session::class.java).findAll()
val group = ComputableGroup(name = "test", computables = sessions)
val computableResults = realm.where(ComputableResult::class.java).findAll()
val sets = realm.where(SessionSet::class.java).findAll()
val stats: List<Stat> = listOf(Stat.NETRESULT, Stat.AVERAGE)
val group = ComputableGroup("test", computableResults, sets, stats)
val options = Calculator.Options()
options.displayedStats = listOf(Stat.STANDARD_DEVIATION_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION)
@ -313,9 +305,9 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() {
val realm = this.mockRealm
realm.beginTransaction()
val s1 = realm.createObject(Session::class.java, "1")
val s2 = realm.createObject(Session::class.java, "2")
val s3 = realm.createObject(Session::class.java, "3")
val s1 = RealmInstrumentedUnitTest.newSessionInstance(realm)
val s2 = RealmInstrumentedUnitTest.newSessionInstance(realm)
val s3 = RealmInstrumentedUnitTest.newSessionInstance(realm)
realm.insert(s1)
realm.insert(s2)
@ -343,8 +335,10 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() {
realm.commitTransaction()
val sessions = realm.where(Session::class.java).findAll()
val group = ComputableGroup(name = "test", computables = sessions)
val computableResults = realm.where(ComputableResult::class.java).findAll()
val sets = realm.where(SessionSet::class.java).findAll()
val stats: List<Stat> = listOf(Stat.NETRESULT, Stat.AVERAGE)
val group = ComputableGroup("test", computableResults, sets, stats)
val options = Calculator.Options()
options.displayedStats = listOf(Stat.STANDARD_DEVIATION_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION)
@ -426,8 +420,10 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() {
realm.commitTransaction()
val sessions = realm.where(Session::class.java).findAll()
val group = ComputableGroup(name = "test", computables = sessions)
val computableResults = realm.where(ComputableResult::class.java).findAll()
val sets = realm.where(SessionSet::class.java).findAll()
val stats: List<Stat> = listOf(Stat.NETRESULT, Stat.AVERAGE)
val group = ComputableGroup("test", computableResults, sets, stats)
val options = Calculator.Options()
options.displayedStats = listOf(Stat.STANDARD_DEVIATION_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION)
@ -446,7 +442,11 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() {
s1.deleteFromRealm()
}
val group2 = ComputableGroup(name = "test", computables = sessions)
val computableResults2 = realm.where(ComputableResult::class.java).findAll()
val sets2 = realm.where(SessionSet::class.java).findAll()
val stats2: List<Stat> = listOf(Stat.NETRESULT, Stat.AVERAGE)
val group2 = ComputableGroup("test", computableResults2, sets2, stats2)
val results2: ComputedResults = Calculator.compute(group2, options)
val duration2 = results2.computedStat(Stat.DURATION)
@ -465,10 +465,7 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() {
val realm = this.mockRealm
realm.beginTransaction()
val s1 = realm.createObject(Session::class.java, "1")
s1.result = realm.createObject(net.pokeranalytics.android.model.realm.Result::class.java)
val s1 = RealmInstrumentedUnitTest.newSessionInstance(realm)
realm.insert(s1)
val sdf = SimpleDateFormat("dd/M/yyyy hh:mm")
@ -502,11 +499,8 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() {
val realm = this.mockRealm
realm.beginTransaction()
val s1 = realm.createObject(Session::class.java, "1")
val s2 = realm.createObject(Session::class.java, "2")
s1.result = realm.createObject(net.pokeranalytics.android.model.realm.Result::class.java)
s2.result = realm.createObject(net.pokeranalytics.android.model.realm.Result::class.java)
val s1 = RealmInstrumentedUnitTest.newSessionInstance(realm)
val s2 = RealmInstrumentedUnitTest.newSessionInstance(realm)
realm.insert(s1)
realm.insert(s2)
@ -563,9 +557,9 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() {
val realm = this.mockRealm
realm.beginTransaction()
val s1 = realm.createObject(Session::class.java, "1")
val s2 = realm.createObject(Session::class.java, "2")
val s3 = realm.createObject(Session::class.java, "3")
val s1 = RealmInstrumentedUnitTest.newSessionInstance(realm)
val s2 = RealmInstrumentedUnitTest.newSessionInstance(realm)
val s3 = RealmInstrumentedUnitTest.newSessionInstance(realm)
realm.insert(s1)
realm.insert(s2)
@ -597,8 +591,10 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() {
s1.endDate = null
}
val sessions = realm.where(Session::class.java).findAll()
val group = ComputableGroup(name = "test", computables = sessions)
val computableResults = realm.where(ComputableResult::class.java).findAll()
val sets = realm.where(SessionSet::class.java).findAll()
val stats: List<Stat> = listOf(Stat.NETRESULT, Stat.AVERAGE)
val group = ComputableGroup("test", computableResults, sets, stats)
val options = Calculator.Options()
// options.displayedStats = listOf(Stat.STANDARD_DEVIATION_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION)

@ -150,7 +150,7 @@ class PokerAnalyticsApplication : Application() {
val sessions = realm.where<Session>().findAll()
if (sessions.size < 10) {
val numberOfSessions = 200
val numberOfSessions = 2000
Timber.d("*** Start creating ${numberOfSessions} fake computables...")
val s = Date()

@ -1,7 +1,7 @@
package net.pokeranalytics.android.calculus
import net.pokeranalytics.android.calculus.Stat.*
import net.pokeranalytics.android.calculus.interfaces.Computable
import net.pokeranalytics.android.model.realm.ComputableResult
import net.pokeranalytics.android.model.realm.SessionSet
import timber.log.Timber
import java.util.*
@ -96,14 +96,9 @@ class Calculator {
// fun compute(sessionGroup: ComputableGroup, options: Options): ComputedResults {
//
// var sum: Double = 0.0
// val computables: List<SessionInterface> = sessionGroup.computables
// var sum: Double = sessionGroup.computables.sum("ratedNet").toDouble()
// val results: ComputedResults = ComputedResults(sessionGroup)
//
// computables.forEach { s ->
// sum += s.ratedNet
// }
//
// results.addStats(
// setOf(
// ComputedStat(NETRESULT, sum)
@ -114,55 +109,59 @@ class Calculator {
// }
/**
/**
* Computes stats for a SessionSet
*/
fun compute(computableGroup: ComputableGroup, options: Options): ComputedResults {
Timber.d(">>>> Start computing group ${computableGroup.name}, ${computableGroup.computables.size} computables")
val computables: List<Computable> = computableGroup.computables
val sessionSets = computableGroup.computables.mapNotNull { it.sessionSet }.toHashSet()
val computables = computableGroup.computables
val results: ComputedResults = ComputedResults(computableGroup)
var sum: Double = 0.0
var totalHands: Double = 0.0
var bbSum: Double = 0.0
var bbSessionCount: Int = 0
var winningSessionCount: Int = 0 // computables.filter { it.value >= 0.0 }.size
var totalBuyin = 0.0
var sum: Double = computables.sum(ComputableResult.Field.RATED_NET.identifier).toDouble()
var totalHands: Double = computables.sum(ComputableResult.Field.ESTIMATED_HANDS.identifier).toDouble()
var bbSum: Double = computables.sum(ComputableResult.Field.BB_NET.identifier).toDouble()
var bbSessionCount: Int = computables.sum(ComputableResult.Field.HAS_BIG_BLIND.identifier).toInt()
var winningSessionCount: Int = computables.sum(ComputableResult.Field.IS_POSITIVE.identifier).toInt()
var totalBuyin = computables.sum(ComputableResult.Field.RATED_BUYIN.identifier).toDouble()
// Compute for each session
var index: Int = 0
computables.forEach { s ->
index++;
// val result = s.result!! // ok to crash to see problems
sum += s.ratedNet
bbSum += s.bbNetResult
bbSessionCount += s.hasBigBlind
winningSessionCount += s.isPositive
totalBuyin += s.ratedBuyin
totalHands += s.estimatedHands
when (options.evolutionValues) {
Options.EvolutionValues.STANDARD -> {
results.addEvolutionValue(sum, NETRESULT)
results.addEvolutionValue(sum / index, AVERAGE)
when (options.evolutionValues) {
Options.EvolutionValues.STANDARD -> {
var index: Int = 0
var tSum = 0.0
var tBBSum = 0.0
var tBBSessionCount = 0
var tWinningSessionCount = 0
var tBuyinSum = 0.0
var tHands = 0.0
computables.forEach { s ->
index++;
tSum += s.ratedNet
tBBSum += s.bbNetResult
tBBSessionCount += s.hasBigBlind
tWinningSessionCount += s.isPositive
tBuyinSum += s.ratedBuyin
tHands += s.estimatedHands
results.addEvolutionValue(tSum, NETRESULT)
results.addEvolutionValue(tSum / index, AVERAGE)
results.addEvolutionValue(index.toDouble(), NUMBER_OF_GAMES)
results.addEvolutionValue(bbSum / bbSessionCount, AVERAGE_NET_BB)
results.addEvolutionValue((winningSessionCount / index).toDouble(), WIN_RATIO)
results.addEvolutionValue(totalBuyin / index, AVERAGE_BUYIN)
results.addEvolutionValue(tBBSum / tBBSessionCount, AVERAGE_NET_BB)
results.addEvolutionValue((tWinningSessionCount / index).toDouble(), WIN_RATIO)
results.addEvolutionValue(tBuyinSum / index, AVERAGE_BUYIN)
val netBB100 = Stat.netBBPer100Hands(bbSum, totalHands)
val netBB100 = Stat.netBBPer100Hands(tBBSum, tHands)
if (netBB100 != null) {
results.addEvolutionValue(netBB100, NET_BB_PER_100_HANDS)
}
val roi = Stat.returnOnInvestment(sum, totalBuyin)
val roi = Stat.returnOnInvestment(tSum, tBuyinSum)
if (roi != null) {
results.addEvolutionValue(roi, ROI)
}
@ -171,44 +170,55 @@ class Calculator {
}
}
val sessionSets = computableGroup.sets
// Compute for each serie
var duration = 0.0
var hourlyRate = 0.0
var hourlyRateBB = 0.0
var gIndex = 0;
var gSum = 0.0;
var gTotalHands = 0.0;
var gBBSum = 0.0;
sessionSets.forEach { sessionSet ->
gIndex++
duration += sessionSet.hourlyDuration
gSum += sessionSet.ratedNet
gTotalHands += sessionSet.estimatedHands
gBBSum += sessionSet.bbNetResult
hourlyRate = gSum / duration
hourlyRateBB = gBBSum / duration
when (options.evolutionValues) {
Options.EvolutionValues.DATED -> {
results.addEvolutionValue(gSum, duration, NETRESULT)
results.addEvolutionValue(gSum / duration, duration, HOURLY_RATE)
results.addEvolutionValue(hourlyRate, duration, HOURLY_RATE)
results.addEvolutionValue(gIndex.toDouble(), duration, NUMBER_OF_SETS)
results.addEvolutionValue(sessionSet.netDuration.toDouble(), duration, DURATION)
results.addEvolutionValue(duration / gIndex, duration, AVERAGE_DURATION)
results.addEvolutionValue(hourlyRateBB, duration, HOURLY_RATE_BB)
var gHourlyDuration = sessionSets.sum(SessionSet.Field.NET_DURATION.identifier).toDouble() / 3600000 // (milliseconds to hours)
var gSum = sessionSets.sum(SessionSet.Field.RATED_NET.identifier).toDouble()
var gTotalHands = sessionSets.sum(SessionSet.Field.ESTIMATED_HANDS.identifier).toDouble()
var gBBSum = sessionSets.sum(SessionSet.Field.BB_NET.identifier).toDouble()
var hourlyRate = gSum / gHourlyDuration
// var hourlyRateBB = gBBSum / gDuration
when (options.evolutionValues) {
Options.EvolutionValues.DATED -> {
var tHourlyDuration = 0.0
var tIndex = 0
var tSum = 0.0
var tTotalHands = 0.0
var tBBSum = 0.0
var tHourlyRate = 0.0
var tHourlyRateBB = 0.0
sessionSets.forEach { sessionSet ->
tIndex++
tHourlyDuration += sessionSet.hourlyDuration
tSum += sessionSet.ratedNet
tTotalHands += sessionSet.estimatedHands
tBBSum += sessionSet.bbNetResult
tHourlyRate = gSum / tHourlyDuration
tHourlyRateBB = gBBSum / tHourlyDuration
results.addEvolutionValue(tSum, tHourlyDuration, NETRESULT)
results.addEvolutionValue(tSum / tHourlyDuration, tHourlyDuration, HOURLY_RATE)
results.addEvolutionValue(tHourlyRate, tHourlyDuration, HOURLY_RATE)
results.addEvolutionValue(tIndex.toDouble(), tHourlyDuration, NUMBER_OF_SETS)
results.addEvolutionValue(sessionSet.netDuration.toDouble(), tHourlyDuration, DURATION)
results.addEvolutionValue(tHourlyDuration / tIndex, tHourlyDuration, AVERAGE_DURATION)
results.addEvolutionValue(tHourlyRateBB, tHourlyDuration, HOURLY_RATE_BB)
val netBB100 = Stat.netBBPer100Hands(gBBSum, gTotalHands)
if (netBB100 != null) {
results.addEvolutionValue(netBB100, duration, NET_BB_PER_100_HANDS)
results.addEvolutionValue(netBB100, tHourlyDuration, NET_BB_PER_100_HANDS)
} else { //@todo maybe not
results.addEvolutionValue(0.0, duration, NET_BB_PER_100_HANDS)
results.addEvolutionValue(0.0, tHourlyDuration, NET_BB_PER_100_HANDS)
}
}
}
}
var average = 0.0
@ -227,7 +237,7 @@ class Calculator {
}
if (sessionSets.size > 0) {
val avgDuration = duration / sessionSets.size
val avgDuration = gHourlyDuration / sessionSets.size
results.addStats(
setOf(
ComputedStat(HOURLY_RATE, hourlyRate),
@ -240,11 +250,11 @@ class Calculator {
results.addStats(
setOf(
ComputedStat(NETRESULT, sum),
ComputedStat(DURATION, duration),
ComputedStat(DURATION, gHourlyDuration),
ComputedStat(NUMBER_OF_SETS, sessionSets.size.toDouble()),
ComputedStat(NUMBER_OF_GAMES, computables.size.toDouble()),
ComputedStat(HOURLY_RATE_BB, bbSum / duration),
ComputedStat(AVERAGE_NET_BB, bbSum / bbSessionCount),
ComputedStat(HOURLY_RATE_BB, gBBSum / gHourlyDuration),
ComputedStat(AVERAGE_NET_BB, gBBSum / bbSessionCount),
ComputedStat(HANDS_PLAYED, totalHands)
)

@ -1,11 +1,13 @@
package net.pokeranalytics.android.calculus
import net.pokeranalytics.android.calculus.interfaces.Computable
import io.realm.RealmResults
import net.pokeranalytics.android.model.realm.ComputableResult
import net.pokeranalytics.android.model.realm.SessionSet
/**
* A sessionGroup of computable items identified by a name
*/
class ComputableGroup(name: String, computables: List<Computable>, stats: List<Stat>? = null) {
class ComputableGroup(name: String, computables: RealmResults<ComputableResult>, sets: RealmResults<SessionSet>, stats: List<Stat>? = null) {
/**
* The display name of the group
@ -15,7 +17,12 @@ class ComputableGroup(name: String, computables: List<Computable>, stats: List<S
/**
* The list of endedSessions to compute
*/
var computables: List<Computable> = computables
var computables: RealmResults<ComputableResult> = computables
/**
* The list of endedSessions to compute
*/
var sets: RealmResults<SessionSet> = sets
/**
* The list of stats to display

@ -48,4 +48,14 @@ open class ComputableResult : RealmObject(), Computable {
}
enum class Field(val identifier: String) {
RATED_NET("ratedNet"),
BB_NET("bbNetResult"),
HAS_BIG_BLIND("hasBigBlind"),
IS_POSITIVE("isPositive"),
RATED_BUYIN("ratedBuyin"),
ESTIMATED_HANDS("estimatedHands"),
BB_PER100HANDS("bbPer100Hands")
}
}

@ -10,10 +10,14 @@ open class Currency : RealmObject() {
@PrimaryKey
var id = UUID.randomUUID().toString()
// The currency code of the currency, i.e. USD, EUR...
/**
* The currency code of the currency, i.e. USD, EUR...
*/
var code: String? = null
// The rate of the currency with the main currency
/**
* The rate of the currency with the main currency
*/
var rate: Double? = null
set(value) {
field = value
@ -22,7 +26,10 @@ open class Currency : RealmObject() {
// could be async
val cResults = this.realm.where(ComputableResult::class.java).equalTo("session.bankroll.currency", this.id).findAll()
val query = this.realm.where(ComputableResult::class.java)
query.`in`("sessions.bankroll.currency.id", arrayOf(this.id))
val cResults = query.findAll()
cResults.forEach { computable ->
computable.session?.result?.net?.let {

@ -82,8 +82,9 @@ open class Result : RealmObject() {
this.net = cashOut - buyin + transactionsSum
}
// Update ComputableResult
// Precompute results
this.session?.updateComputableResult()
this.session?.sessionSet?.computeStats()
}
// @todo tips?

@ -43,7 +43,7 @@ open class SessionSet : RealmObject(), Timed {
override var pauseDate: Date? = null
/**
* the net duration of the set
* the net duration of the set (READONLY)
*/
override var netDuration: Long = 0L
@ -56,10 +56,11 @@ open class SessionSet : RealmObject(), Timed {
}
/**
* The timeframe of the set, i.e. its start & end date
*/
// var timeFrame: TimeFrame? = null
fun computeStats() {
this.ratedNet = this.sessions?.sumByDouble { it.computableResult!!.ratedNet } ?: 0.0
this.estimatedHands = this.sessions?.sumByDouble { it.estimatedHands } ?: 0.0
this.bbNetResult = this.sessions?.sumByDouble { it.bbNetResult } ?: 0.0
}
/**
* The list of endedSessions associated with this set
@ -67,17 +68,25 @@ open class SessionSet : RealmObject(), Timed {
@LinkingObjects("sessionSet")
val sessions: RealmResults<Session>? = null
@Ignore
val ratedNet: Double = this.sessions?.sumByDouble { it.computableResult!!.ratedNet } ?: 0.0
// @Ignore
var ratedNet: Double = 0.0
@Ignore
val hourlyRate: Double = this.ratedNet / this.hourlyDuration
@Ignore
val estimatedHands: Double = this.sessions?.sumByDouble { it.estimatedHands } ?: 0.0
// @Ignore
var estimatedHands: Double = 0.0
@Ignore
var bbNetResult: Double = this.sessions?.sumByDouble { it.bbNetResult } ?: 0.0
// @Ignore
var bbNetResult: Double = 0.0
enum class Field(val identifier: String) {
RATED_NET("ratedNet"),
HOURLY_RATE("hourlyRate"),
BB_NET("bbNetResult"),
ESTIMATED_HANDS("estimatedHands"),
NET_DURATION("netDuration")
}
}

@ -85,6 +85,7 @@ class SessionSetManager {
set.endDate = session.endDate!!
set.breakDuration = session.breakDuration
session.sessionSet = set
set.computeStats()
}
/**
@ -128,6 +129,8 @@ class SessionSetManager {
session.sessionSet = set
set.breakDuration = max(set.breakDuration, session.breakDuration)
}
set.computeStats()
// Timber.d("netDuration 3 = : ${set.timeFrame?.netDuration}")
}

@ -10,9 +10,10 @@ import kotlinx.android.synthetic.main.fragment_stats.*
import kotlinx.coroutines.*
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.*
import net.pokeranalytics.android.calculus.interfaces.Computable
import net.pokeranalytics.android.model.StatRepresentable
import net.pokeranalytics.android.model.realm.ComputableResult
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.SessionSet
import net.pokeranalytics.android.ui.adapter.DisplayDescriptor
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
@ -140,7 +141,9 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
val s = Date()
Timber.d(">>> start...")
results = createSessionGroupsAndStartCompute()
val realm = Realm.getDefaultInstance()
results = createSessionGroupsAndStartCompute(realm)
realm.close()
val e = Date()
val duration = (e.time - s.time) / 1000.0
@ -156,38 +159,42 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
}
private fun createSessionGroupsAndStartCompute() : List<ComputedResults> {
private fun createSessionGroupsAndStartCompute(realm: Realm) : List<ComputedResults> {
val cgSessions = mutableListOf<Computable>()
val tSessions = mutableListOf<Computable>()
// val cgSessions = mutableListOf<Computable>()
// val tSessions = mutableListOf<Computable>()
val s = Date()
val realm = Realm.getDefaultInstance()
// val allSessions = realm.where(ComputableResult::class.java).findAll()
val allSessions = realm.where(ComputableResult::class.java).isNotNull("sessions.endDate").findAll()
val allSessionSets = realm.where(SessionSet::class.java).findAll()
Timber.d(">>>>> number of computables to compute = ${allSessions.size}")
val computableList = realm.copyFromRealm(allSessions)
realm.close()
val cgSessions = allSessions.where().equalTo("sessions.type", Session.Type.CASH_GAME.ordinal).findAll()
val cgSessionSets = realm.where(SessionSet::class.java).equalTo("sessions.type", Session.Type.CASH_GAME.ordinal).findAll()
computableList.forEach { session ->
if (true) { // @todo
cgSessions.add(session)
} else {
tSessions.add(session)
}
}
val tSessions = allSessions.where().equalTo("sessions.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")
val allStats: List<Stat> = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.AVERAGE, Stat.NUMBER_OF_SETS, Stat.AVERAGE_DURATION, Stat.DURATION)
val allSessionGroup = ComputableGroup(getString(R.string.all), computableList, allStats)
val allSessionGroup = ComputableGroup(getString(R.string.all), allSessions, allSessionSets, allStats)
val cgStats: List<Stat> = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.NET_BB_PER_100_HANDS, Stat.HOURLY_RATE_BB, Stat.AVERAGE, Stat.STANDARD_DEVIATION_HOURLY, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN)
val cgSessionGroup = ComputableGroup(getString(R.string.cash_game), cgSessions, cgStats)
val cgSessionGroup = ComputableGroup(getString(R.string.cash_game), cgSessions, cgSessionSets, cgStats)
val tStats: List<Stat> = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.ROI, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN)
val tSessionGroup = ComputableGroup(getString(R.string.tournament), tSessions, tStats)
val tSessionGroup = ComputableGroup(getString(R.string.tournament), tSessions, tSessionSets, tStats)
Timber.d(">>>>> Start computations...")

Loading…
Cancel
Save