Fixes crash when a Session without StartDate was caught in the Bankroll Report

od
Laurent 6 years ago
parent c87b828cdf
commit ca263b226f
  1. 13
      app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollCalculator.kt
  2. 8
      app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt
  3. 7
      app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt
  4. 5
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  5. 5
      app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt

@ -6,6 +6,8 @@ import net.pokeranalytics.android.calculus.ComputableGroup
import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.ComputedResults
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.exceptions.PAIllegalStateException 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.model.realm.*
import net.pokeranalytics.android.util.extensions.findById import net.pokeranalytics.android.util.extensions.findById
@ -46,21 +48,22 @@ class BankrollCalculator {
report.transactionsNet = transactionNet report.transactionsNet = transactionNet
report.initial = initialValue report.initial = initialValue
val query = setup.query(realm) val baseQuery = setup.query(realm)
val transactions = Filter.queryOn<Transaction>(realm, query) val transactions = Filter.queryOn<Transaction>(realm, baseQuery)
report.addDatedItems(transactions) report.addDatedItems(transactions)
transactions.forEach { transactions.forEach {
report.addTransaction(it) report.addTransaction(it)
} }
val sessions = Filter.queryOn<Session>(realm, query) val sessionQuery = Query(QueryCondition.DateNotNull).merge(baseQuery)
val sessions = Filter.queryOn<Session>(realm, sessionQuery)
report.addDatedItems(sessions) report.addDatedItems(sessions)
if (setup.virtualBankroll) { if (setup.virtualBankroll) {
val options = Calculator.Options(stats = listOf(Stat.NET_RESULT, Stat.HOURLY_RATE, Stat.STANDARD_DEVIATION_HOURLY)) 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) 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
@ -69,7 +72,7 @@ class BankrollCalculator {
} else { } else {
val results = Filter.queryOn<Result>(realm, query) val results = Filter.queryOn<Result>(realm, baseQuery)
report.netResult = results.sum("net").toDouble() report.netResult = results.sum("net").toDouble()
} }

@ -1,8 +1,9 @@
package net.pokeranalytics.android.model.filter package net.pokeranalytics.android.model.filter
import com.crashlytics.android.Crashlytics
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.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.realm.*
/** /**
@ -57,20 +58,19 @@ class FilterHelper {
inline fun <reified T : Filterable > fieldNameForQueryType(queryCondition: Class< out QueryCondition>): String? { inline fun <reified T : Filterable > fieldNameForQueryType(queryCondition: Class< out QueryCondition>): String? {
val fieldName = when (T::class.java) { return 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) Transaction::class.java -> Transaction.fieldNameForQueryType(queryCondition)
Result::class.java -> Result.fieldNameForQueryType(queryCondition) Result::class.java -> Result.fieldNameForQueryType(queryCondition)
else -> { else -> {
Crashlytics.logException(PAIllegalStateException("Filterable type fields are not defined for condition ${queryCondition::class}, class ${T::class}"))
null null
// throw UnmanagedFilterField("Filterable type fields are not defined for class ${T::class}") // throw UnmanagedFilterField("Filterable type fields are not defined for class ${T::class}")
} }
} }
return fieldName
/* /*
fieldName?.let { fieldName?.let {
return fieldName return fieldName

@ -88,6 +88,7 @@ sealed class QueryCondition : FilterElementRow {
LESS, LESS,
EQUALS, EQUALS,
TRUE, TRUE,
NOTNULL
; ;
} }
@ -600,6 +601,10 @@ sealed class QueryCondition : FilterElementRow {
} }
} }
object DateNotNull : QueryCondition() {
override var operator = Operator.NOTNULL
}
class StartedFromTime() : TimeQuery() { class StartedFromTime() : TimeQuery() {
override var operator = Operator.MORE override var operator = Operator.MORE
@ -607,7 +612,6 @@ sealed class QueryCondition : FilterElementRow {
singleValue = date singleValue = date
} }
} }
class EndedToTime() : TimeQuery() { class EndedToTime() : TimeQuery() {
@ -928,6 +932,7 @@ sealed class QueryCondition : FilterElementRow {
else -> realmQuery else -> realmQuery
} }
} }
Operator.NOTNULL -> realmQuery.isNotNull(fieldName)
else -> realmQuery else -> realmQuery
} }
} }

@ -76,7 +76,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
} else { } else {
session.bankroll = realm.where<Bankroll>().findFirst() session.bankroll = realm.where<Bankroll>().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) { return if (managed) {
realm.copyToRealm(session) realm.copyToRealm(session)
@ -115,6 +115,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
CustomFieldListQuery::class.java -> "customFieldEntries.id" CustomFieldListQuery::class.java -> "customFieldEntries.id"
CustomFieldAmountQuery::class.java, CustomFieldNumberQuery::class.java -> "customFieldEntries.numericValue" CustomFieldAmountQuery::class.java, CustomFieldNumberQuery::class.java -> "customFieldEntries.numericValue"
CustomFieldQuery::class.java -> "customFieldEntries.customFields.id" CustomFieldQuery::class.java -> "customFieldEntries.customFields.id"
DateNotNull::class.java -> "startDate"
else -> null else -> null
} }
} }
@ -660,7 +661,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
fun duplicate() : Session { 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.game = this.game
copy.limit = this.limit copy.limit = this.limit

@ -56,7 +56,10 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo
QueryCondition.AnyDayOfWeek::class.java, QueryCondition.IsWeekEnd::class.java, QueryCondition.IsWeekDay::class.java -> "dayOfWeek" QueryCondition.AnyDayOfWeek::class.java, QueryCondition.IsWeekEnd::class.java, QueryCondition.IsWeekDay::class.java -> "dayOfWeek"
QueryCondition.AnyMonthOfYear::class.java -> "month" QueryCondition.AnyMonthOfYear::class.java -> "month"
QueryCondition.AnyYear::class.java -> "year" 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 else -> null
} }
} }

Loading…
Cancel
Save