use QueryConditions for Bankroll calculations

feature/top10
Laurent 7 years ago
parent 3a5184e17f
commit 4bc3e56b50
  1. 1
      app/src/main/java/net/pokeranalytics/android/calculus/Report.kt
  2. 15
      app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollCalculator.kt
  3. 37
      app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollReport.kt
  4. 1
      app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt
  5. 11
      app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt
  6. 14
      app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt

@ -316,6 +316,7 @@ class ComputedResults(group: ComputableGroup, shouldManageMultiGroupProgressValu
computedStat.progressValue = Stat.returnOnInvestment(netResult, totalBuyin) computedStat.progressValue = Stat.returnOnInvestment(netResult, totalBuyin)
} }
} }
else -> {}
} }
} }

@ -1,6 +1,7 @@
package net.pokeranalytics.android.calculus.bankroll package net.pokeranalytics.android.calculus.bankroll
import io.realm.Realm import io.realm.Realm
import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.model.realm.Transaction
@ -14,18 +15,10 @@ class BankrollCalculator {
val report = BankrollReport(setup) val report = BankrollReport(setup)
val sessionQuery = realm.where(Session::class.java) val sessions = Filter.queryOn<Session>(realm, setup.queryConditions)
if (setup.bankroll != null) { val transactions = Filter.queryOn<Transaction>(realm, setup.queryConditions)
sessionQuery.equalTo("bankroll.id", setup.bankroll.id)
}
// val sessions = sessionQuery.findAll()
val transactionQuery = realm.where(Transaction::class.java)
if (setup.bankroll != null) {
transactionQuery.equalTo("bankroll.id", setup.bankroll.id).findAll()
}
val transactions = transactionQuery.findAll()
// val sessionsNet = sessions.sum("result.net") val sessionsNet = sessions.sum("result.net")
val transactionsNet = transactions.sum("value") val transactionsNet = transactions.sum("value")
transactions.forEach { transactions.forEach {

@ -1,6 +1,7 @@
package net.pokeranalytics.android.calculus.bankroll package net.pokeranalytics.android.calculus.bankroll
import net.pokeranalytics.android.calculus.interfaces.DatableValue import net.pokeranalytics.android.calculus.interfaces.DatableValue
import net.pokeranalytics.android.model.filter.QueryCondition
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 java.util.* import java.util.*
@ -10,21 +11,29 @@ import kotlin.collections.HashMap
* A class describing the parameters required to launch a bankroll report * A class describing the parameters required to launch a bankroll report
* *
*/ */
class BankrollReportSetup(bankroll: Bankroll?, from: Date? = null, to: Date? = null) { class BankrollReportSetup(val bankroll: Bankroll?, val from: Date? = null, val to: Date? = null) {
/**
* The bankroll to compute. If null, the virtual global bankroll val queryConditions: List<QueryCondition>
*/ get() {
val bankroll = bankroll val conditions = mutableListOf<QueryCondition>()
this.bankroll?.let {
/** val bankrollCondition = QueryCondition.AnyBankroll()
* The start of the report bankrollCondition.setObject(it)
*/ conditions.add(bankrollCondition)
val from = from }
this.from?.let {
val fromCondition = QueryCondition.StartedFromDate()
fromCondition.singleValue = it
conditions.add(fromCondition)
}
this.to?.let {
val toCondition = QueryCondition.StartedToDate()
toCondition.singleValue = it
conditions.add(toCondition)
}
/** return conditions
* The end of the report }
*/
val to = to
} }

@ -20,4 +20,5 @@ sealed class PokerAnalyticsException(message: String) : Exception(message) {
data class FilterElementTypeMissing(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "queryWith element '$filterElementRow' type is missing") data class FilterElementTypeMissing(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "queryWith element '$filterElementRow' type is missing")
data class QueryValueMapMissingKeys(val missingKeys: List<String>) : PokerAnalyticsException(message = "valueMap does not contain $missingKeys") data class QueryValueMapMissingKeys(val missingKeys: List<String>) : PokerAnalyticsException(message = "valueMap does not contain $missingKeys")
data class UnknownQueryTypeForRow(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "no queryWith type for $filterElementRow") data class UnknownQueryTypeForRow(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "no queryWith type for $filterElementRow")
data class MissingFieldNameForQueryCondition(val name: String) : PokerAnalyticsException(message = "Missing fieldname for QueryCondition ${name}")
} }

@ -2,9 +2,11 @@ package net.pokeranalytics.android.model.filter
import io.realm.RealmModel import io.realm.RealmModel
import io.realm.RealmResults import io.realm.RealmResults
import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.model.realm.ComputableResult import net.pokeranalytics.android.model.realm.ComputableResult
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.SessionSet import net.pokeranalytics.android.model.realm.SessionSet
import net.pokeranalytics.android.model.realm.Transaction
/** /**
* We want to be able to store filters in the database: * We want to be able to store filters in the database:
@ -58,15 +60,22 @@ class FilterHelper {
inline fun <reified T : Filterable > fieldNameForQueryType(queryCondition: Class< out QueryCondition>): String? { inline fun <reified T : Filterable > fieldNameForQueryType(queryCondition: Class< out QueryCondition>): String? {
return when (T::class.java) { val fieldName = when (T::class.java) {
Session::class.java -> Session.fieldNameForQueryType(queryCondition) Session::class.java -> Session.fieldNameForQueryType(queryCondition)
ComputableResult::class.java -> ComputableResult.fieldNameForQueryType(queryCondition) ComputableResult::class.java -> ComputableResult.fieldNameForQueryType(queryCondition)
SessionSet::class.java -> SessionSet.fieldNameForQueryType(queryCondition) SessionSet::class.java -> SessionSet.fieldNameForQueryType(queryCondition)
Transaction::class.java -> Transaction.fieldNameForQueryType(queryCondition)
else -> { else -> {
throw UnmanagedFilterField("Filterable type fields are not defined for class ${T::class}") throw UnmanagedFilterField("Filterable type fields are not defined for class ${T::class}")
} }
} }
fieldName?.let {
return fieldName
} ?: run {
throw PokerAnalyticsException.MissingFieldNameForQueryCondition(queryCondition.name)
}
} }
} }

@ -5,6 +5,8 @@ import io.realm.RealmObject
import io.realm.annotations.Ignore import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.filter.Filterable
import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.interfaces.Manageable import net.pokeranalytics.android.model.interfaces.Manageable
import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.SaveValidityStatus
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
@ -15,7 +17,7 @@ import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable { open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable, Filterable {
companion object { companion object {
val rowRepresentation: List<RowRepresentable> by lazy { val rowRepresentation: List<RowRepresentable> by lazy {
@ -23,6 +25,14 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo
rows.addAll(TransactionRow.values()) rows.addAll(TransactionRow.values())
rows rows
} }
fun fieldNameForQueryType(queryCondition: Class<out QueryCondition>): String? {
return when (queryCondition) {
QueryCondition.AnyBankroll::class.java -> "bankroll.id"
QueryCondition.StartedFromDate::class.java, QueryCondition.StartedToDate::class.java -> "date"
else -> null
}
}
} }
@PrimaryKey @PrimaryKey
@ -85,5 +95,5 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo
override fun getFailedDeleteMessage(): Int { override fun getFailedDeleteMessage(): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates. TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
}
}

Loading…
Cancel
Save