From 4b9cb85fbb5a8599dfc69bcea03b6f4ddf542e9c Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 23 Apr 2019 12:13:33 +0200 Subject: [PATCH] Add line data set for BankrollReport --- .../android/calculus/Calculator.kt | 10 ++--- .../pokeranalytics/android/calculus/Report.kt | 2 +- .../calculus/bankroll/BankrollCalculator.kt | 11 ++++-- .../calculus/bankroll/BankrollReport.kt | 38 ++++++++++++++++++- .../android/model/realm/Session.kt | 27 ++++++++++--- 5 files changed, 70 insertions(+), 18 deletions(-) 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 26c33c6c..092bd8f8 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -134,7 +134,7 @@ class Calculator { realm: Realm, criteria: List = listOf(), conditions: List = listOf(), - options: Options + options: Options = Options() ): Report { val computableGroups: MutableList = mutableListOf() @@ -161,7 +161,7 @@ class Calculator { /** * Computes all stats for list of Session sessionGroup */ - fun computeGroups(realm: Realm, groups: List, options: Options): Report { + fun computeGroups(realm: Realm, groups: List, options: Options = Options()): Report { val report = Report(options) groups.forEach { group -> @@ -171,12 +171,12 @@ class Calculator { group.cleanup() // Computes actual sessionGroup stats - val results: ComputedResults = this.compute(realm, group, options = options) + val results: ComputedResults = this.compute(realm, group, options) // Computes the compared sessionGroup if existing val comparedGroup = group.comparedGroup if (comparedGroup != null) { - val comparedResults = this.compute(realm, comparedGroup, options = options) + val comparedResults = this.compute(realm, comparedGroup, options) group.comparedComputedResults = comparedResults results.computeStatVariations(comparedResults) } @@ -200,7 +200,7 @@ class Calculator { /** * Computes stats for a SessionSet */ - fun compute(realm: Realm, computableGroup: ComputableGroup, options: Options): ComputedResults { + fun compute(realm: Realm, computableGroup: ComputableGroup, options: Options = Options()): ComputedResults { val results = ComputedResults(computableGroup, options.shouldManageMultiGroupProgressValues) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt index 7e6effac..29c099ab 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt @@ -92,7 +92,7 @@ class Report(var options: Calculator.Options) { /** * A sessionGroup of computable items identified by a name */ -class ComputableGroup(name: String, conditions: List = listOf(), stats: List? = null) { +class ComputableGroup(name: String = "", conditions: List = listOf(), stats: List? = null) { /** * The display name of the group diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollCalculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollCalculator.kt index 76eea4e7..facdad21 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollCalculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollCalculator.kt @@ -19,10 +19,8 @@ class BankrollCalculator { val realm = Realm.getDefaultInstance() val report = BankrollReport(setup) - val useRatedValues = (setup.bankroll == null) val queryConditions = setup.queryConditions - val sessions = Filter.queryOn(realm, queryConditions) val transactions = Filter.queryOn(realm, queryConditions) val transactionsNet = transactions.sum("value") @@ -32,8 +30,12 @@ class BankrollCalculator { report.addTransaction(it) } - val group = ComputableGroup("", queryConditions, listOf(Stat.NET_RESULT, Stat.HOURLY_RATE, Stat.STANDARD_DEVIATION_HOURLY)) - val result = Calculator.compute(realm, group, Calculator.Options()) + val sessions = Filter.queryOn(realm, queryConditions) + report.addDatedItems(sessions) + + val options = Calculator.Options(stats = listOf(Stat.NET_RESULT, Stat.HOURLY_RATE, Stat.STANDARD_DEVIATION_HOURLY)) + val group = ComputableGroup(conditions = queryConditions) + val result = Calculator.compute(realm, group, options) result.computedStat(Stat.NET_RESULT)?.let { report.netResult = it.value } @@ -52,6 +54,7 @@ class BankrollCalculator { report.withdrawalTotal = bucket.transactions.sumByDouble { it.amount } } + report.generateGraphPointsIfNecessary() realm.close() diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollReport.kt b/app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollReport.kt index 9804bd0b..8490523a 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollReport.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollReport.kt @@ -1,9 +1,13 @@ package net.pokeranalytics.android.calculus.bankroll +import android.content.Context +import com.github.mikephil.charting.data.Entry +import com.github.mikephil.charting.data.LineDataSet import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.interfaces.DatedValue import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.model.realm.Transaction +import net.pokeranalytics.android.ui.graph.PALineDataSet import java.util.* import kotlin.collections.HashMap @@ -89,7 +93,7 @@ class BankrollReport(setup: BankrollReportSetup) { var bucket = this.transactionBuckets[type.id] if (bucket == null) { - val b = TransactionBucket(this.setup.bankroll == null) + val b = TransactionBucket(this.setup.virtualBankroll) this.transactionBuckets[type.id] = b bucket = b } @@ -102,6 +106,31 @@ class BankrollReport(setup: BankrollReportSetup) { } + fun generateGraphPointsIfNecessary() { + + if (!this.setup.virtualBankroll) { + return + } + + this.evolutionItems.sortBy { it.date } + + this.evolutionItems.forEach { + val point = BRGraphPoint(it.amount, it.date, it) + this.evolutionPoints.add(point) + } + + } + + fun lineDataSet(context: Context): LineDataSet { + + val entries = mutableListOf() + this.evolutionPoints.forEach { + val entry = Entry(it.date.time.toFloat(), it.value.toFloat(), it.data) + entries.add(entry) + } + return PALineDataSet(entries, "", context) + } + } /** @@ -110,6 +139,11 @@ class BankrollReport(setup: BankrollReportSetup) { */ class BankrollReportSetup(val bankroll: Bankroll?, val from: Date? = null, val to: Date? = null) { + val virtualBankroll: Boolean + get() { + return this.bankroll == null + } + val queryConditions: List get() { val conditions = mutableListOf() @@ -157,7 +191,7 @@ class TransactionBucket(useRate: Boolean = false) { } -data class BRGraphPoint(var value: Double = 0.0, var date: Date? = null, var data: Any? = null) { +data class BRGraphPoint(var value: Double, var date: Date, var data: Any? = null) { var variation: Double = 0.0 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 9c3b3a8a..c123bd2b 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 @@ -45,7 +45,7 @@ import kotlin.collections.ArrayList typealias BB = Double open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDataSource, RowRepresentable, Timed, - TimeFilterable, Filterable { + TimeFilterable, Filterable, DatedValue { enum class Type { CASH_GAME, @@ -308,10 +308,10 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat get() { val bb = this.cgBigBlind val result = this.result - if (bb != null && result != null) { - return result.net / bb + return if (bb != null && result != null) { + result.net / bb } else { - return 0.0 + 0.0 } } @@ -326,6 +326,21 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat return noh * hd } + + // DatedValue + + @Ignore + override var date: Date = Date() + get() { + return this.startDate ?: this.creationDate + } + + @Ignore + override var amount: Double = 0.0 + get() { + return this.computableResult?.ratedNet ?: 0.0 + } + /** * Pre-compute various stats */ @@ -973,10 +988,10 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } } - return LegendView.Values(this.entryTitle, left, right) + LegendView.Values(this.entryTitle, left, right) } else -> { - return super.legendValues(stat, entry) + super.legendValues(stat, entry) } }