From ca263b226fa70a808def20b29f6e80eeed50d5ec Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 2 Jan 2020 15:27:51 +0100 Subject: [PATCH] Fixes crash when a Session without StartDate was caught in the Bankroll Report --- .../android/calculus/bankroll/BankrollCalculator.kt | 13 ++++++++----- .../android/model/filter/Filterable.kt | 8 ++++---- .../android/model/filter/QueryCondition.kt | 7 ++++++- .../pokeranalytics/android/model/realm/Session.kt | 5 +++-- .../android/model/realm/Transaction.kt | 5 ++++- 5 files changed, 25 insertions(+), 13 deletions(-) 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 fe3e21a5..0d9e92d2 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 @@ -6,6 +6,8 @@ import net.pokeranalytics.android.calculus.ComputableGroup import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.exceptions.PAIllegalStateException +import net.pokeranalytics.android.model.filter.Query +import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.util.extensions.findById @@ -46,21 +48,22 @@ class BankrollCalculator { report.transactionsNet = transactionNet report.initial = initialValue - val query = setup.query(realm) - val transactions = Filter.queryOn(realm, query) + val baseQuery = setup.query(realm) + val transactions = Filter.queryOn(realm, baseQuery) report.addDatedItems(transactions) transactions.forEach { report.addTransaction(it) } - val sessions = Filter.queryOn(realm, query) + val sessionQuery = Query(QueryCondition.DateNotNull).merge(baseQuery) + val sessions = Filter.queryOn(realm, sessionQuery) report.addDatedItems(sessions) if (setup.virtualBankroll) { val options = Calculator.Options(stats = listOf(Stat.NET_RESULT, Stat.HOURLY_RATE, Stat.STANDARD_DEVIATION_HOURLY)) - val group = ComputableGroup(query) + val group = ComputableGroup(baseQuery) val result = Calculator.compute(realm, group, options) result.computedStat(Stat.NET_RESULT)?.let { report.netResult = it.value @@ -69,7 +72,7 @@ class BankrollCalculator { } else { - val results = Filter.queryOn(realm, query) + val results = Filter.queryOn(realm, baseQuery) report.netResult = results.sum("net").toDouble() } 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 0eb40936..213b6398 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 @@ -1,8 +1,9 @@ package net.pokeranalytics.android.model.filter +import com.crashlytics.android.Crashlytics import io.realm.RealmModel import io.realm.RealmResults -import net.pokeranalytics.android.exceptions.PokerAnalyticsException +import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.realm.* /** @@ -57,20 +58,19 @@ class FilterHelper { inline fun fieldNameForQueryType(queryCondition: Class< out QueryCondition>): String? { - val fieldName = when (T::class.java) { + return 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) Result::class.java -> Result.fieldNameForQueryType(queryCondition) else -> { + Crashlytics.logException(PAIllegalStateException("Filterable type fields are not defined for condition ${queryCondition::class}, class ${T::class}")) null // throw UnmanagedFilterField("Filterable type fields are not defined for class ${T::class}") } } - return fieldName - /* fieldName?.let { return fieldName diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt index 84d9fcd9..ac94450e 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt @@ -88,6 +88,7 @@ sealed class QueryCondition : FilterElementRow { LESS, EQUALS, TRUE, + NOTNULL ; } @@ -600,6 +601,10 @@ sealed class QueryCondition : FilterElementRow { } } + object DateNotNull : QueryCondition() { + override var operator = Operator.NOTNULL + } + class StartedFromTime() : TimeQuery() { override var operator = Operator.MORE @@ -607,7 +612,6 @@ sealed class QueryCondition : FilterElementRow { singleValue = date } - } class EndedToTime() : TimeQuery() { @@ -928,6 +932,7 @@ sealed class QueryCondition : FilterElementRow { else -> realmQuery } } + Operator.NOTNULL -> realmQuery.isNotNull(fieldName) else -> realmQuery } } 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 57323e16..79bfee91 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 @@ -76,7 +76,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } else { session.bankroll = realm.where().findFirst() } - session.type = if (isTournament) Session.Type.TOURNAMENT.ordinal else Session.Type.CASH_GAME.ordinal + session.type = if (isTournament) Type.TOURNAMENT.ordinal else Type.CASH_GAME.ordinal return if (managed) { realm.copyToRealm(session) @@ -115,6 +115,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat CustomFieldListQuery::class.java -> "customFieldEntries.id" CustomFieldAmountQuery::class.java, CustomFieldNumberQuery::class.java -> "customFieldEntries.numericValue" CustomFieldQuery::class.java -> "customFieldEntries.customFields.id" + DateNotNull::class.java -> "startDate" else -> null } } @@ -660,7 +661,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat fun duplicate() : Session { - val copy = Session.newInstance(this.realm, this.isTournament(), this.bankroll) + val copy = newInstance(this.realm, this.isTournament(), this.bankroll) copy.game = this.game copy.limit = this.limit 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 5efc1bbf..03caa4b6 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 @@ -56,7 +56,10 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo QueryCondition.AnyDayOfWeek::class.java, QueryCondition.IsWeekEnd::class.java, QueryCondition.IsWeekDay::class.java -> "dayOfWeek" QueryCondition.AnyMonthOfYear::class.java -> "month" QueryCondition.AnyYear::class.java -> "year" - QueryCondition.PastDay::class.java, QueryCondition.IsToday::class.java, QueryCondition.WasYesterday::class.java, QueryCondition.WasTodayAndYesterday::class.java, QueryCondition.DuringThisYear::class.java, QueryCondition.DuringThisMonth::class.java, QueryCondition.DuringThisWeek::class.java -> "date" + QueryCondition.PastDay::class.java, QueryCondition.IsToday::class.java, + QueryCondition.WasYesterday::class.java, QueryCondition.WasTodayAndYesterday::class.java, + QueryCondition.DuringThisYear::class.java, QueryCondition.DuringThisMonth::class.java, + QueryCondition.DuringThisWeek::class.java, QueryCondition.DateNotNull::class.java -> "date" else -> null } }