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 867fe330..7e6effac 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt @@ -316,6 +316,7 @@ class ComputedResults(group: ComputableGroup, shouldManageMultiGroupProgressValu computedStat.progressValue = Stat.returnOnInvestment(netResult, totalBuyin) } } + else -> {} } } 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 79c81f85..fdc95863 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 @@ -1,6 +1,7 @@ package net.pokeranalytics.android.calculus.bankroll import io.realm.Realm +import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Transaction @@ -14,18 +15,10 @@ class BankrollCalculator { val report = BankrollReport(setup) - val sessionQuery = realm.where(Session::class.java) - if (setup.bankroll != null) { - 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 sessions = Filter.queryOn(realm, setup.queryConditions) + val transactions = Filter.queryOn(realm, setup.queryConditions) -// val sessionsNet = sessions.sum("result.net") + val sessionsNet = sessions.sum("result.net") val transactionsNet = transactions.sum("value") transactions.forEach { 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 cd830a50..8968968c 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,6 +1,7 @@ package net.pokeranalytics.android.calculus.bankroll 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.Transaction import java.util.* @@ -10,21 +11,29 @@ import kotlin.collections.HashMap * A class describing the parameters required to launch a bankroll report * */ -class BankrollReportSetup(bankroll: Bankroll?, from: Date? = null, to: Date? = null) { - /** - * The bankroll to compute. If null, the virtual global bankroll - */ - val bankroll = bankroll - - /** - * The start of the report - */ - val from = from +class BankrollReportSetup(val bankroll: Bankroll?, val from: Date? = null, val to: Date? = null) { + + val queryConditions: List + get() { + val conditions = mutableListOf() + this.bankroll?.let { + val bankrollCondition = QueryCondition.AnyBankroll() + bankrollCondition.setObject(it) + conditions.add(bankrollCondition) + } + 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) + } - /** - * The end of the report - */ - val to = to + return conditions + } } diff --git a/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt b/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt index 2314b31b..1eabf395 100644 --- a/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt +++ b/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt @@ -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 QueryValueMapMissingKeys(val missingKeys: List) : PokerAnalyticsException(message = "valueMap does not contain $missingKeys") 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}") } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt index 4ada37f8..8811f0a4 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt @@ -2,9 +2,11 @@ package net.pokeranalytics.android.model.filter import io.realm.RealmModel import io.realm.RealmResults +import net.pokeranalytics.android.exceptions.PokerAnalyticsException 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.model.realm.Transaction /** * We want to be able to store filters in the database: @@ -58,15 +60,22 @@ class FilterHelper { inline fun fieldNameForQueryType(queryCondition: Class< out QueryCondition>): String? { - return when (T::class.java) { + val fieldName = when (T::class.java) { Session::class.java -> Session.fieldNameForQueryType(queryCondition) ComputableResult::class.java -> ComputableResult.fieldNameForQueryType(queryCondition) SessionSet::class.java -> SessionSet.fieldNameForQueryType(queryCondition) + Transaction::class.java -> Transaction.fieldNameForQueryType(queryCondition) else -> { throw UnmanagedFilterField("Filterable type fields are not defined for class ${T::class}") } } + fieldName?.let { + return fieldName + } ?: run { + throw PokerAnalyticsException.MissingFieldNameForQueryCondition(queryCondition.name) + } + } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt index f53f8583..d7291dc7 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt @@ -5,6 +5,8 @@ import io.realm.RealmObject import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey 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.SaveValidityStatus import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource @@ -15,39 +17,47 @@ import java.util.* import kotlin.collections.ArrayList -open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable { +open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable, Filterable { companion object { - val rowRepresentation : List by lazy { + val rowRepresentation: List by lazy { val rows = ArrayList() rows.addAll(TransactionRow.values()) rows } + + fun fieldNameForQueryType(queryCondition: Class): String? { + return when (queryCondition) { + QueryCondition.AnyBankroll::class.java -> "bankroll.id" + QueryCondition.StartedFromDate::class.java, QueryCondition.StartedToDate::class.java -> "date" + else -> null + } + } } - @PrimaryKey + @PrimaryKey override var id = UUID.randomUUID().toString() // The bankroll of the transaction var bankroll: Bankroll? = null - // The amount of the transaction - var amount: Double = 0.0 + // The amount of the transaction + var amount: Double = 0.0 - // The date of the transaction - var date: Date = Date() + // The date of the transaction + var date: Date = Date() - // The type of the transaction - var type: TransactionType? = null + // The type of the transaction + var type: TransactionType? = null - // A user comment - var comment: String = "" + // A user comment + var comment: String = "" @Ignore override val viewType: Int = RowViewType.ROW_TRANSACTION.ordinal override fun updateValue(value: Any?, row: RowRepresentable) { - when(row) { + when (row) { TransactionRow.BANKROLL -> bankroll = value as Bankroll? TransactionRow.TYPE -> type = value as TransactionType? TransactionRow.AMOUNT -> amount = if (value == null) 0.0 else (value as String).toDouble() @@ -85,5 +95,5 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo override fun getFailedDeleteMessage(): Int { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } -} +}