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 {
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)
return session
}

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

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

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

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

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

@ -27,7 +27,7 @@ open class Currency : RealmObject() {
// could be async
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()
cResults.forEach { computable ->

@ -4,8 +4,10 @@ import android.content.Context
import io.realm.Realm
import io.realm.RealmList
import io.realm.RealmObject
import io.realm.RealmResults
import io.realm.annotations.Ignore
import io.realm.annotations.Index
import io.realm.annotations.LinkingObjects
import io.realm.annotations.PrimaryKey
import io.realm.kotlin.where
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 {
val session = Session()
session.result = Result()
session.computableResult = ComputableResult()
val computableResult = ComputableResult()
computableResult.session = session
if (bankroll != null) {
session.bankroll = bankroll
} else {
@ -78,6 +83,7 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource
/**
* Indicates the type of session, cash game or tournament
*/
@Index
var type: Int = Type.CASH_GAME.ordinal
// The result of the main user
@ -86,7 +92,13 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource
/**
* 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
@ -293,10 +305,11 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource
}
fun updateComputableResult() {
this.computableResult?.let {
this.computableResults?.forEach {
it.updateWith(this)
} ?: 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
set.deleteFromRealm()
this.result?.deleteFromRealm()
this.computableResults?.deleteAllFromRealm()
// Updates the timeline
SessionSetManager.removeFromTimeline(this)

@ -57,7 +57,7 @@ open class SessionSet : RealmObject(), Timed {
}
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.bbNetResult = this.sessions?.sumByDouble { it.bbNetResult } ?: 0.0
}

@ -125,9 +125,9 @@ class SessionSetManager {
session.sessionSet = set
// Add all orphan endedSessions
sessions.forEach { session ->
session.sessionSet = set
set.breakDuration = max(set.breakDuration, session.breakDuration)
sessions.forEach { s ->
s.sessionSet = set
set.breakDuration = max(set.breakDuration, s.breakDuration)
}
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")
}

@ -111,7 +111,7 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
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()
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>>) {
response.body()?.let {
it[currenciesConverterValue]?.value?.let {rate ->
it[currenciesConverterValue]?.value?.let { rate ->
onRowValueChanged(rate.toString(), BankrollRow.RATE)
}
}

@ -166,25 +166,16 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
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()
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 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 computableList = realm.copyFromRealm(allSessions)
// computableList.forEach { session ->
// if (true) { // @todo
// cgSessions.add(session)
// } else {
// tSessions.add(session)
// }
// }
val e = Date()
val duration = (e.time - s.time) / 1000.0
Timber.d(">>> filtering in ${duration} seconds")

@ -10,7 +10,7 @@ open class SessionObserverFragment : PokerAnalyticsFragment() {
init {
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.sessionsChanged()
}

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

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

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

@ -4,6 +4,32 @@ import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.view.RowRepresentable
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 {
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.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 {
// General

@ -15,7 +15,14 @@ import java.text.DateFormatSymbols
import java.util.*
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 {
// General

Loading…
Cancel
Save