Add line data set for BankrollReport

feature/top10
Laurent 7 years ago
parent a272986b6c
commit 4b9cb85fbb
  1. 10
      app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt
  2. 2
      app/src/main/java/net/pokeranalytics/android/calculus/Report.kt
  3. 11
      app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollCalculator.kt
  4. 38
      app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollReport.kt
  5. 27
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt

@ -134,7 +134,7 @@ class Calculator {
realm: Realm, realm: Realm,
criteria: List<Criteria> = listOf(), criteria: List<Criteria> = listOf(),
conditions: List<QueryCondition> = listOf(), conditions: List<QueryCondition> = listOf(),
options: Options options: Options = Options()
): Report { ): Report {
val computableGroups: MutableList<ComputableGroup> = mutableListOf() val computableGroups: MutableList<ComputableGroup> = mutableListOf()
@ -161,7 +161,7 @@ class Calculator {
/** /**
* Computes all stats for list of Session sessionGroup * Computes all stats for list of Session sessionGroup
*/ */
fun computeGroups(realm: Realm, groups: List<ComputableGroup>, options: Options): Report { fun computeGroups(realm: Realm, groups: List<ComputableGroup>, options: Options = Options()): Report {
val report = Report(options) val report = Report(options)
groups.forEach { group -> groups.forEach { group ->
@ -171,12 +171,12 @@ class Calculator {
group.cleanup() group.cleanup()
// Computes actual sessionGroup stats // 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 // Computes the compared sessionGroup if existing
val comparedGroup = group.comparedGroup val comparedGroup = group.comparedGroup
if (comparedGroup != null) { if (comparedGroup != null) {
val comparedResults = this.compute(realm, comparedGroup, options = options) val comparedResults = this.compute(realm, comparedGroup, options)
group.comparedComputedResults = comparedResults group.comparedComputedResults = comparedResults
results.computeStatVariations(comparedResults) results.computeStatVariations(comparedResults)
} }
@ -200,7 +200,7 @@ class Calculator {
/** /**
* Computes stats for a SessionSet * 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) val results = ComputedResults(computableGroup, options.shouldManageMultiGroupProgressValues)

@ -92,7 +92,7 @@ class Report(var options: Calculator.Options) {
/** /**
* A sessionGroup of computable items identified by a name * A sessionGroup of computable items identified by a name
*/ */
class ComputableGroup(name: String, conditions: List<QueryCondition> = listOf(), stats: List<Stat>? = null) { class ComputableGroup(name: String = "", conditions: List<QueryCondition> = listOf(), stats: List<Stat>? = null) {
/** /**
* The display name of the group * The display name of the group

@ -19,10 +19,8 @@ class BankrollCalculator {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
val report = BankrollReport(setup) val report = BankrollReport(setup)
val useRatedValues = (setup.bankroll == null)
val queryConditions = setup.queryConditions val queryConditions = setup.queryConditions
val sessions = Filter.queryOn<Session>(realm, queryConditions)
val transactions = Filter.queryOn<Transaction>(realm, queryConditions) val transactions = Filter.queryOn<Transaction>(realm, queryConditions)
val transactionsNet = transactions.sum("value") val transactionsNet = transactions.sum("value")
@ -32,8 +30,12 @@ class BankrollCalculator {
report.addTransaction(it) report.addTransaction(it)
} }
val group = ComputableGroup("", queryConditions, listOf(Stat.NET_RESULT, Stat.HOURLY_RATE, Stat.STANDARD_DEVIATION_HOURLY)) val sessions = Filter.queryOn<Session>(realm, queryConditions)
val result = Calculator.compute(realm, group, Calculator.Options()) 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 { result.computedStat(Stat.NET_RESULT)?.let {
report.netResult = it.value report.netResult = it.value
} }
@ -52,6 +54,7 @@ class BankrollCalculator {
report.withdrawalTotal = bucket.transactions.sumByDouble { it.amount } report.withdrawalTotal = bucket.transactions.sumByDouble { it.amount }
} }
report.generateGraphPointsIfNecessary()
realm.close() realm.close()

@ -1,9 +1,13 @@
package net.pokeranalytics.android.calculus.bankroll 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.filter.QueryCondition
import net.pokeranalytics.android.model.interfaces.DatedValue import net.pokeranalytics.android.model.interfaces.DatedValue
import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.model.realm.Bankroll
import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.model.realm.Transaction
import net.pokeranalytics.android.ui.graph.PALineDataSet
import java.util.* import java.util.*
import kotlin.collections.HashMap import kotlin.collections.HashMap
@ -89,7 +93,7 @@ class BankrollReport(setup: BankrollReportSetup) {
var bucket = this.transactionBuckets[type.id] var bucket = this.transactionBuckets[type.id]
if (bucket == null) { if (bucket == null) {
val b = TransactionBucket(this.setup.bankroll == null) val b = TransactionBucket(this.setup.virtualBankroll)
this.transactionBuckets[type.id] = b this.transactionBuckets[type.id] = b
bucket = 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<Entry>()
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) { class BankrollReportSetup(val bankroll: Bankroll?, val from: Date? = null, val to: Date? = null) {
val virtualBankroll: Boolean
get() {
return this.bankroll == null
}
val queryConditions: List<QueryCondition> val queryConditions: List<QueryCondition>
get() { get() {
val conditions = mutableListOf<QueryCondition>() val conditions = mutableListOf<QueryCondition>()
@ -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 var variation: Double = 0.0

@ -45,7 +45,7 @@ import kotlin.collections.ArrayList
typealias BB = Double typealias BB = Double
open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDataSource, RowRepresentable, Timed, open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDataSource, RowRepresentable, Timed,
TimeFilterable, Filterable { TimeFilterable, Filterable, DatedValue {
enum class Type { enum class Type {
CASH_GAME, CASH_GAME,
@ -308,10 +308,10 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
get() { get() {
val bb = this.cgBigBlind val bb = this.cgBigBlind
val result = this.result val result = this.result
if (bb != null && result != null) { return if (bb != null && result != null) {
return result.net / bb result.net / bb
} else { } else {
return 0.0 0.0
} }
} }
@ -326,6 +326,21 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
return noh * hd 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 * 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 -> { else -> {
return super.legendValues(stat, entry) super.legendValues(stat, entry)
} }
} }

Loading…
Cancel
Save