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,
criteria: List<Criteria> = listOf(),
conditions: List<QueryCondition> = listOf(),
options: Options
options: Options = Options()
): Report {
val computableGroups: MutableList<ComputableGroup> = mutableListOf()
@ -161,7 +161,7 @@ class Calculator {
/**
* 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)
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)

@ -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<QueryCondition> = listOf(), stats: List<Stat>? = null) {
class ComputableGroup(name: String = "", conditions: List<QueryCondition> = listOf(), stats: List<Stat>? = null) {
/**
* The display name of the group

@ -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<Session>(realm, queryConditions)
val transactions = Filter.queryOn<Transaction>(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<Session>(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()

@ -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<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) {
val virtualBankroll: Boolean
get() {
return this.bankroll == null
}
val queryConditions: List<QueryCondition>
get() {
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

@ -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)
}
}

Loading…
Cancel
Save