diff --git a/app/src/androidTest/java/net/pokeranalytics/android/BankrollInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/BankrollInstrumentedUnitTest.kt index 72bc6a52..5602da72 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/BankrollInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/BankrollInstrumentedUnitTest.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 = listOf(Stat.NETRESULT, Stat.AVERAGE) + val group = ComputableGroup("test", computableResults, sets, stats) val options = Calculator.Options() diff --git a/app/src/androidTest/java/net/pokeranalytics/android/FavoriteSessionUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/FavoriteSessionUnitTest.kt index 8ecfd436..c181ec72 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/FavoriteSessionUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/FavoriteSessionUnitTest.kt @@ -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") diff --git a/app/src/androidTest/java/net/pokeranalytics/android/RealmInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/RealmInstrumentedUnitTest.kt index 3076297e..d19327fd 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/RealmInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/RealmInstrumentedUnitTest.kt @@ -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() { diff --git a/app/src/androidTest/java/net/pokeranalytics/android/StatsInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/StatsInstrumentedUnitTest.kt index c4fe88a8..38692475 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/StatsInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/StatsInstrumentedUnitTest.kt @@ -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 = 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 = 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 = 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 = 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 = 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 = 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) diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index 1fc0fb5e..7bfb7c77 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -150,7 +150,7 @@ class PokerAnalyticsApplication : Application() { val sessions = realm.where().findAll() if (sessions.size < 10) { - val numberOfSessions = 200 + val numberOfSessions = 2000 Timber.d("*** Start creating ${numberOfSessions} fake computables...") val s = Date() diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index 95a6a611..7458503e 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -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 = 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 = 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) ) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/ComputableGroup.kt b/app/src/main/java/net/pokeranalytics/android/calculus/ComputableGroup.kt index 520ee0f0..211af750 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/ComputableGroup.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/ComputableGroup.kt @@ -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, stats: List? = null) { +class ComputableGroup(name: String, computables: RealmResults, sets: RealmResults, stats: List? = null) { /** * The display name of the group @@ -15,7 +17,12 @@ class ComputableGroup(name: String, computables: List, stats: List = computables + var computables: RealmResults = computables + + /** + * The list of endedSessions to compute + */ + var sets: RealmResults = sets /** * The list of stats to display diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt index 5f6223dd..a9d2092f 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt @@ -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") + } + } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt index 5f6f4fc2..9f4d8b65 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt @@ -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 { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Result.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Result.kt index b9ef6e21..d1129416 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Result.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Result.kt @@ -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? 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 d626d6fd..ebe070ed 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 @@ -575,7 +575,7 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource return rows } - private fun updateRowRepresentation() { + fun updateRowRepresentation() { this.rowRepresentationForCurrentState = this.updatedRowRepresentationForCurrentState() } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt index 480cb220..3acab070 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt @@ -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? = 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") + } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/utils/SessionSetManager.kt b/app/src/main/java/net/pokeranalytics/android/model/utils/SessionSetManager.kt index f68ccccf..6f59a315 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/utils/SessionSetManager.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/utils/SessionSetManager.kt @@ -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}") } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt index e7ab1a01..d4c7cd52 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt @@ -144,6 +144,8 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate { */ private fun updateSessionUI() { + this.currentSession.updateRowRepresentation() + handler.removeCallbacksAndMessages(null) when (currentSession.getState()) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt index c1effc46..8f6a5f86 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt @@ -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 { + private fun createSessionGroupsAndStartCompute(realm: Realm) : List { - val cgSessions = mutableListOf() - val tSessions = mutableListOf() +// val cgSessions = mutableListOf() +// val tSessions = mutableListOf() 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 = 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 = 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 = 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...")