Merge branch 'master' of gitlab.com:stax-river/poker-analytics

feature/top10
Aurelien Hubert 7 years ago
commit fbfcf648a4
  1. 3
      app/src/androidTest/java/net/pokeranalytics/android/RealmInstrumentedUnitTest.kt
  2. 2
      app/src/androidTest/java/net/pokeranalytics/android/filter/SessionFilterInstrumentedUnitTest.kt
  3. 18
      app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt
  4. 4
      app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollCalculator.kt
  5. 2
      app/src/main/java/net/pokeranalytics/android/model/filter/SessionFilterable.kt
  6. 11
      app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt
  7. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt
  8. 22
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  9. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt
  10. 6
      app/src/main/java/net/pokeranalytics/android/model/utils/SessionSetManager.kt
  11. 2
      app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt
  12. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt
  13. 15
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt
  14. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/SessionObserverFragment.kt
  15. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt
  16. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt
  17. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt
  18. 26
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt
  19. 28
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt
  20. 9
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSubcategoryRow.kt

@ -18,7 +18,8 @@ open class RealmInstrumentedUnitTest {
fun newSessionInstance(realm: Realm) : Session { fun newSessionInstance(realm: Realm) : Session {
val session = realm.createObject(Session::class.java, UUID.randomUUID().toString()) val session = realm.createObject(Session::class.java, UUID.randomUUID().toString())
session.computableResult = realm.createObject(ComputableResult::class.java) val computableResult = realm.createObject(ComputableResult::class.java)
computableResult.session = session
session.result = realm.createObject(Result::class.java) session.result = realm.createObject(Result::class.java)
return session return session
} }

@ -541,7 +541,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
realm.beginTransaction() realm.beginTransaction()
val s1 = Session.testInstance(netResult = 200.0) val s1 = Session.testInstance(netResult = 200.0)
Session.testInstance(netResult = 500.0) Session.testInstance(netResult = 500.0)
val s2 = Session.testInstance(netResult = 50.0) Session.testInstance(netResult = 50.0)
Session.testInstance(netResult = 570.0) Session.testInstance(netResult = 570.0)
realm.commitTransaction() realm.commitTransaction()

@ -58,10 +58,10 @@ class Calculator {
companion object { companion object {
fun computePreAggregation(sets: List<SessionSet>, options: Options): List<ComputedResults> { // fun computePreAggregation(sets: List<SessionSet>, options: Options): List<ComputedResults> {
Timber.d("sets = ${sets.size}") // Timber.d("sets = ${sets.size}")
return listOf() // return listOf()
} // }
/** /**
* Computes all stats for list of Session sessionGroup * Computes all stats for list of Session sessionGroup
@ -168,6 +168,9 @@ class Calculator {
} }
} }
else -> {
// nothing
}
} }
val sessionSets = computableGroup.sets val sessionSets = computableGroup.sets
@ -190,8 +193,8 @@ class Calculator {
var tSum = 0.0 var tSum = 0.0
var tTotalHands = 0.0 var tTotalHands = 0.0
var tBBSum = 0.0 var tBBSum = 0.0
var tHourlyRate = 0.0 var tHourlyRate: Double = 0.0
var tHourlyRateBB = 0.0 var tHourlyRateBB: Double = 0.0
sessionSets.forEach { sessionSet -> sessionSets.forEach { sessionSet ->
tIndex++ tIndex++
@ -219,6 +222,9 @@ class Calculator {
} }
} }
} }
else -> {
// nothing
}
} }
var average = 0.0 var average = 0.0

@ -18,14 +18,14 @@ class BankrollCalculator {
if (setup.bankroll != null) { if (setup.bankroll != null) {
sessionQuery.equalTo("bankroll.id", setup.bankroll.id) sessionQuery.equalTo("bankroll.id", setup.bankroll.id)
} }
val sessions = sessionQuery.findAll() // val sessions = sessionQuery.findAll()
val transactionQuery = realm.where(Transaction::class.java) val transactionQuery = realm.where(Transaction::class.java)
if (setup.bankroll != null) { if (setup.bankroll != null) {
transactionQuery.equalTo("bankroll.id", setup.bankroll.id).findAll() transactionQuery.equalTo("bankroll.id", setup.bankroll.id).findAll()
} }
val transactions = transactionQuery.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 {

@ -55,7 +55,7 @@ enum class SessionFilterable(private var fieldName:String? = null, private var s
SMALL_BLIND("cgSmallBlind"), SMALL_BLIND("cgSmallBlind"),
COMMENT("comment"), COMMENT("comment"),
TOURNAMENT_FEATURES("tournamentFeatures.id"), TOURNAMENT_FEATURES("tournamentFeatures.id"),
NET_RESULT("result.ratedNet"), NET_RESULT("computableResult.ratedNet"),
BUY_IN("result.buyin"), BUY_IN("result.buyin"),
CASH_OUT("result.cashout"), CASH_OUT("result.cashout"),
TIPS("result.tips"), TIPS("result.tips"),

@ -1,9 +1,6 @@
package net.pokeranalytics.android.model.realm package net.pokeranalytics.android.model.realm
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.RealmResults
import io.realm.annotations.Ignore
import io.realm.annotations.LinkingObjects
import net.pokeranalytics.android.calculus.interfaces.Computable import net.pokeranalytics.android.calculus.interfaces.Computable
open class ComputableResult : RealmObject(), Computable { open class ComputableResult : RealmObject(), Computable {
@ -24,11 +21,11 @@ open class ComputableResult : RealmObject(), Computable {
override var sessionSet: SessionSet? = null override var sessionSet: SessionSet? = null
@LinkingObjects("computableResult") // @LinkingObjects("computableResult")
private val sessions: RealmResults<Session>? = null // private val sessions: RealmResults<Session>? = null
@Ignore // @Ignore
val session: Session? = this.sessions?.firstOrNull() var session: Session? = null
fun updateWith(session: Session) { fun updateWith(session: Session) {

@ -27,7 +27,7 @@ open class Currency : RealmObject() {
// could be async // could be async
val query = this.realm.where(ComputableResult::class.java) val query = this.realm.where(ComputableResult::class.java)
query.`in`("sessions.bankroll.currency.id", arrayOf(this.id)) query.`in`("session.bankroll.currency.id", arrayOf(this.id))
val cResults = query.findAll() val cResults = query.findAll()
cResults.forEach { computable -> cResults.forEach { computable ->

@ -4,8 +4,10 @@ import android.content.Context
import io.realm.Realm import io.realm.Realm
import io.realm.RealmList import io.realm.RealmList
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.RealmResults
import io.realm.annotations.Ignore import io.realm.annotations.Ignore
import io.realm.annotations.Index import io.realm.annotations.Index
import io.realm.annotations.LinkingObjects
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import io.realm.kotlin.where import io.realm.kotlin.where
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
@ -61,7 +63,10 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource
fun newInstance(realm: Realm, isTournament: Boolean, bankroll: Bankroll? = null): Session { fun newInstance(realm: Realm, isTournament: Boolean, bankroll: Bankroll? = null): Session {
val session = Session() val session = Session()
session.result = Result() session.result = Result()
session.computableResult = ComputableResult()
val computableResult = ComputableResult()
computableResult.session = session
if (bankroll != null) { if (bankroll != null) {
session.bankroll = bankroll session.bankroll = bankroll
} else { } else {
@ -78,6 +83,7 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource
/** /**
* Indicates the type of session, cash game or tournament * Indicates the type of session, cash game or tournament
*/ */
@Index
var type: Int = Type.CASH_GAME.ordinal var type: Int = Type.CASH_GAME.ordinal
// The result of the main user // The result of the main user
@ -86,7 +92,13 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource
/** /**
* Optimized result for faster stats * Optimized result for faster stats
*/ */
var computableResult: ComputableResult? = null // var computableResult: ComputableResult? = null
@LinkingObjects("session")
private val computableResults: RealmResults<ComputableResult>? = null
@Ignore
val computableResult: ComputableResult? = this.computableResults?.firstOrNull()
// Timed interface // Timed interface
@ -293,10 +305,11 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource
} }
fun updateComputableResult() { fun updateComputableResult() {
this.computableResult?.let {
this.computableResults?.forEach {
it.updateWith(this) it.updateWith(this)
} ?: run { } ?: run {
throw IllegalStateException("Session should always have a Light Result") throw IllegalStateException("Session should always have a computable results")
} }
} }
@ -497,6 +510,7 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource
// cleanup unnecessary related objects // cleanup unnecessary related objects
set.deleteFromRealm() set.deleteFromRealm()
this.result?.deleteFromRealm() this.result?.deleteFromRealm()
this.computableResults?.deleteAllFromRealm()
// Updates the timeline // Updates the timeline
SessionSetManager.removeFromTimeline(this) SessionSetManager.removeFromTimeline(this)

@ -57,7 +57,7 @@ open class SessionSet : RealmObject(), Timed {
} }
fun computeStats() { fun computeStats() {
this.ratedNet = this.sessions?.sumByDouble { it.computableResult!!.ratedNet } ?: 0.0 this.ratedNet = this.sessions?.sumByDouble { it.computableResult?.ratedNet ?: 0.0 } ?: 0.0
this.estimatedHands = this.sessions?.sumByDouble { it.estimatedHands } ?: 0.0 this.estimatedHands = this.sessions?.sumByDouble { it.estimatedHands } ?: 0.0
this.bbNetResult = this.sessions?.sumByDouble { it.bbNetResult } ?: 0.0 this.bbNetResult = this.sessions?.sumByDouble { it.bbNetResult } ?: 0.0
} }

@ -125,9 +125,9 @@ class SessionSetManager {
session.sessionSet = set session.sessionSet = set
// Add all orphan endedSessions // Add all orphan endedSessions
sessions.forEach { session -> sessions.forEach { s ->
session.sessionSet = set s.sessionSet = set
set.breakDuration = max(set.breakDuration, session.breakDuration) set.breakDuration = max(set.breakDuration, s.breakDuration)
} }
set.computeStats() set.computeStats()

@ -152,7 +152,7 @@ class HomeActivity : PokerAnalyticsActivity() {
} }
} }
.setNegativeButton(R.string.cancel) {dialog, which -> .setNegativeButton(R.string.cancel) { _, which ->
Timber.d("Click on cancel") Timber.d("Click on cancel")
} }

@ -111,7 +111,7 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
when (row) { when (row) {
BankrollRow.CURRENCY -> CurrenciesActivity.newInstanceForResult(this@BankrollDataFragment, BankrollDataFragment.REQUEST_CODE_CURRENCY) BankrollRow.CURRENCY -> CurrenciesActivity.newInstanceForResult(this@BankrollDataFragment, REQUEST_CODE_CURRENCY)
BankrollRow.REFRESH_RATE -> refreshRate() BankrollRow.REFRESH_RATE -> refreshRate()
else -> super.onRowSelected(position, row, fromAction) else -> super.onRowSelected(position, row, fromAction)
} }
@ -197,7 +197,7 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS
override fun onResponse(call: Call<Map<String, CurrencyConverterValue>>, response: Response<Map<String, CurrencyConverterValue>>) { override fun onResponse(call: Call<Map<String, CurrencyConverterValue>>, response: Response<Map<String, CurrencyConverterValue>>) {
response.body()?.let { response.body()?.let {
it[currenciesConverterValue]?.value?.let {rate -> it[currenciesConverterValue]?.value?.let { rate ->
onRowValueChanged(rate.toString(), BankrollRow.RATE) onRowValueChanged(rate.toString(), BankrollRow.RATE)
} }
} }

@ -166,25 +166,16 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
val s = Date() val s = Date()
val allSessions = realm.where(ComputableResult::class.java).isNotNull("sessions.endDate").findAll() val allSessions = realm.where(ComputableResult::class.java).isNotNull("session.endDate").findAll()
val allSessionSets = realm.where(SessionSet::class.java).findAll() val allSessionSets = realm.where(SessionSet::class.java).findAll()
Timber.d(">>>>> number of computables to compute = ${allSessions.size}") Timber.d(">>>>> number of computables to compute = ${allSessions.size}")
val cgSessions = allSessions.where().equalTo("sessions.type", Session.Type.CASH_GAME.ordinal).findAll() val cgSessions = allSessions.where().equalTo("session.type", Session.Type.CASH_GAME.ordinal).findAll()
val cgSessionSets = realm.where(SessionSet::class.java).equalTo("sessions.type", Session.Type.CASH_GAME.ordinal).findAll() val cgSessionSets = realm.where(SessionSet::class.java).equalTo("sessions.type", Session.Type.CASH_GAME.ordinal).findAll()
val tSessions = allSessions.where().equalTo("sessions.type", Session.Type.TOURNAMENT.ordinal).findAll() val tSessions = allSessions.where().equalTo("session.type", Session.Type.TOURNAMENT.ordinal).findAll()
val tSessionSets = realm.where(SessionSet::class.java).equalTo("sessions.type", Session.Type.TOURNAMENT.ordinal).findAll() val tSessionSets = realm.where(SessionSet::class.java).equalTo("sessions.type", Session.Type.TOURNAMENT.ordinal).findAll()
// val computableList = realm.copyFromRealm(allSessions)
// computableList.forEach { session ->
// if (true) { // @todo
// cgSessions.add(session)
// } else {
// tSessions.add(session)
// }
// }
val e = Date() val e = Date()
val duration = (e.time - s.time) / 1000.0 val duration = (e.time - s.time) / 1000.0
Timber.d(">>> filtering in ${duration} seconds") Timber.d(">>> filtering in ${duration} seconds")

@ -10,7 +10,7 @@ open class SessionObserverFragment : PokerAnalyticsFragment() {
init { init {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
this.endedSessions = realm.where(ComputableResult::class.java).isNotNull("sessions.endDate").findAll() this.endedSessions = realm.where(ComputableResult::class.java).isNotNull("session.endDate").findAll()
this.endedSessions.addChangeListener { _, _ -> this.endedSessions.addChangeListener { _, _ ->
this.sessionsChanged() this.sessionsChanged()
} }

@ -88,7 +88,7 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() {
} }
editText2.setOnEditorActionListener { v, actionId, _ -> editText2.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) { if (actionId == EditorInfo.IME_ACTION_DONE) {
this.delegate.onRowValueChanged(values, row) this.delegate.onRowValueChanged(values, row)
dismiss() dismiss()

@ -53,7 +53,7 @@ class BottomSheetEditTextFragment : BottomSheetFragment() {
editText1.addTextChangedListener { value = it?.toString() ?: "" } editText1.addTextChangedListener { value = it?.toString() ?: "" }
editText1.setText((data[0].defaultValue ?: "").toString()) editText1.setText((data[0].defaultValue ?: "").toString())
editText1.setOnEditorActionListener { v, actionId, _ -> editText1.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) { if (actionId == EditorInfo.IME_ACTION_DONE) {
delegate.onRowValueChanged(getValue(), row) delegate.onRowValueChanged(getValue(), row)
dismiss() dismiss()

@ -117,7 +117,7 @@ class BottomSheetSumFragment : BottomSheetFragment() {
} }
} }
editText2.setOnEditorActionListener { v, actionId, _ -> editText2.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) { if (actionId == EditorInfo.IME_ACTION_DONE) {
this.delegate.onRowValueChanged(value, row) this.delegate.onRowValueChanged(value, row)
dismiss() dismiss()

@ -4,6 +4,32 @@ import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
/*
enum class FilterCategoryRow(override val resId: Int?, val subCategories:Array<out RowRepresentable>, override val viewType: Int = RowViewType.TITLE_VALUE_ARROW.ordinal) : RowRepresentable {
GENERAL(R.string.general, GeneralSubCategory.values()),
DATE,
DURATION,
SESSION,
CASH,
TOURNAMENT,
ONLINE,
RESULT,
TRANSACTION_TYPES,
// Title Custom fields
LOCATION,
BANKROLL,
PLAYERS;
private enum class GeneralSubCategory(val category : FilterCategoryRow = GENERAL): RowRepresentable {
CASH_TOURNAMENT,
LIVE_ONLINE,
GAME,
LIMIT_TYPE,
TABLE_SIZE,
}
*/
enum class FilterCategoryRow : RowRepresentable { enum class FilterCategoryRow : RowRepresentable {
GENERAL, GENERAL,

@ -6,6 +6,34 @@ import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
/*
sealed class FilterElement : RowRepresentable {
class Cash : FilterElement()
class Tournament : FilterElement()
data class Game(val game: net.pokeranalytics.android.model.realm.Game) : FilterElement()
var value : Any? = null
override val resId: Int?
get() {
return when (this) {
is Cash -> R.string.cash_game
is Tournament -> R.string.tournament
else -> null
}
}
override val viewType: Int
get() {
return when (this) {
else -> RowViewType.TITLE_CHECK.ordinal
}
}
}
*/
enum class FilterRow : RowRepresentable { enum class FilterRow : RowRepresentable {
// General // General

@ -15,7 +15,14 @@ import java.text.DateFormatSymbols
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
/*
GAME -> {
val games = realm.copyFromRealm(LiveData.GAME.items(realm) as RealmResults<Game>)
games.forEach {
rows.add(FilterElement.Game(game = it))
}
}
*/
enum class FilterSubcategoryRow : RowRepresentable { enum class FilterSubcategoryRow : RowRepresentable {
// General // General

Loading…
Cancel
Save