stat async update

feature/top10
Laurent 7 years ago
parent aa6edf150f
commit 2f15f72764
  1. 186
      app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt
  2. 71
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt

@ -6,18 +6,17 @@ import io.realm.RealmConfiguration
import io.realm.RealmResults import io.realm.RealmResults
import io.realm.kotlin.where import io.realm.kotlin.where
import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.model.Limit
import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.realm.Game
import net.pokeranalytics.android.model.realm.Currency import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.utils.Seed import net.pokeranalytics.android.model.utils.Seed
import net.pokeranalytics.android.util.PokerAnalyticsLogs import net.pokeranalytics.android.util.PokerAnalyticsLogs
import net.pokeranalytics.android.util.Preferences
import timber.log.Timber import timber.log.Timber
import java.util.* import java.util.*
class PokerAnalyticsApplication : Application() { class PokerAnalyticsApplication : Application() {
var sessions: RealmResults<Session>? = null var sessions: RealmResults<Session>? = null
// private val listener: OrderedRealmCollectionChangeListener<RealmResults<Session>> = // private val listener: OrderedRealmCollectionChangeListener<RealmResults<Session>> =
// OrderedRealmCollectionChangeListener() { realmResults: RealmResults<Session>, changeSet: OrderedCollectionChangeSet -> // OrderedRealmCollectionChangeListener() { realmResults: RealmResults<Session>, changeSet: OrderedCollectionChangeSet ->
@ -33,120 +32,123 @@ class PokerAnalyticsApplication : Application() {
// //
// } // }
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
// Realm // Realm
Realm.init(this) Realm.init(this)
val realmConfiguration = RealmConfiguration.Builder() val realmConfiguration = RealmConfiguration.Builder()
.name(Realm.DEFAULT_REALM_NAME) .name(Realm.DEFAULT_REALM_NAME)
.deleteRealmIfMigrationNeeded() .deleteRealmIfMigrationNeeded()
.initialData(Seed(this)) .initialData(Seed(this))
.build() .build()
Realm.setDefaultConfiguration(realmConfiguration) Realm.setDefaultConfiguration(realmConfiguration)
val realm: Realm = Realm.getDefaultInstance() val realm: Realm = Realm.getDefaultInstance()
// Add observer on session time frame changes // Add observer on session time frame changes
this.sessions = realm.where(Session::class.java).findAll() // monitor session deletions this.sessions = realm.where(Session::class.java).findAll() // monitor session deletions
// this.endedSessions?.addChangeListener { _, changeSet -> // this.endedSessions?.addChangeListener { _, changeSet ->
/* /*
val deletedSessions = val deletedSessions =
realm.where(Session::class.java).`in`("id", changeSet.deletions.toTypedArray()).findAll() realm.where(Session::class.java).`in`("id", changeSet.deletions.toTypedArray()).findAll()
deletedSessions.forEach { it.cleanup() } deletedSessions.forEach { it.cleanup() }
*/ */
// } // }
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
// Logs // Logs
Timber.plant(PokerAnalyticsLogs()) Timber.plant(PokerAnalyticsLogs())
} else { } else {
//Fabric.with(this, Crashlytics()) //Fabric.with(this, Crashlytics())
} }
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
this.createFakeSessions() // debug this.createFakeSessions() // debug
} }
} }
private fun createFakeSessions() { private fun createFakeSessions() {
val realm = Realm.getDefaultInstance() val buyinList = arrayListOf(100.0, 200.0, 300.0, 500.0, 1000.0, 2000.0)
val resultsList = arrayListOf(
-2500.0, -2000.0, -1500.0, -1000.0, -500.0, 200.0, 1000.0, 1500.0, 2500.0
)
// Test endedSessions Thread().run() {
val sessions = realm.where<Session>().findAll()
if (sessions.size < 10) {
val numberOfSessions = 50 try {
Timber.d("> Start creating ${numberOfSessions} fake sessions...")
val s = Date() val realm = Realm.getDefaultInstance()
val games = realm.where<Game>().findAll()
for (index in 0..numberOfSessions) { // Test endedSessions
val sessions = realm.where<Session>().findAll()
if (sessions.size < 10) {
realm.executeTransaction { val numberOfSessions = 10000
val session = Session.newInstance(realm, false) Timber.d("*** Start creating ${numberOfSessions} fake sessions...")
// session.id = UUID.randomUUID().toString()
val calendar = Calendar.getInstance() val s = Date()
calendar.set(
(2017..2018).random(),
(0..11).random(),
(0..28).random(),
(0..23).random(),
(0..59).random()
)
val startDate = calendar.time realm.beginTransaction()
calendar.add(Calendar.HOUR_OF_DAY, (2..12).random())
calendar.add(Calendar.MINUTE, (0..59).random()) for (index in 0..numberOfSessions) {
val endDate = calendar.time
if (index % 1000 == 999) {
Timber.d("****** committing at ${index} sessions...")
realm.commitTransaction()
realm.beginTransaction()
}
val session = Session.newInstance(realm, false)
val calendar = Calendar.getInstance()
calendar.set(
(2017..2018).random(),
(0..11).random(),
(0..28).random(),
(0..23).random(),
(0..59).random()
)
val startDate = calendar.time
calendar.add(Calendar.HOUR_OF_DAY, (2..12).random())
calendar.add(Calendar.MINUTE, (0..59).random())
val endDate = calendar.time
// val timeFrame = TimeFrame() // val timeFrame = TimeFrame()
session.startDate = startDate session.startDate = startDate
session.endDate = endDate session.endDate = endDate
session.creationDate = startDate
// session.timeFrame?.let { session.limit = Limit.values().random().ordinal
// // it.startDate = startDate session.game = games.random()
//// it.endDate = endDate
// it.setDate(startDate, endDate)
// }
// session.timeFrame = timeFrame session.result?.let { result ->
session.creationDate = startDate result.buyin = buyinList.random()
result.netResult = resultsList.random()
}
session.limit = Limit.values().random().ordinal }
session.game = realm.where<Game>().findAll().random()
session.result?.let { result -> realm.commitTransaction()
result.buyin = arrayListOf(100, 200, 300, 500, 1000, 2000).random().toDouble()
result.netResult = arrayListOf(
-2500.0, -2000.0, -1500.0, -1000.0, -500.0, 200.0, 1000.0, 1500.0,
2500.0
).random()
}
realm.copyToRealmOrUpdate(session) val e = Date()
} val duration = (e.time - s.time) / 1000.0
} Timber.d("*** ended in ${duration} seconds")
val e = Date()
val duration = (e.time - s.time) / 1000.0
Timber.d("> ended in ${duration} seconds")
} }
realm.close()
// val sets = realm.where(SessionSet::class.java).findAll() } catch (e: Exception) {
// Timber.e(e)
// Timber.d("sets = ${sets.size}") }
//
// sets.forEach { set ->
// Timber.d("set sd = : ${set.timeFrame?.startDate}, ed = ${set.timeFrame?.endDate}")
// }
realm.close() }
} }
} }

@ -6,7 +6,10 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.fragment_stats.* import kotlinx.android.synthetic.main.fragment_stats.*
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.* import net.pokeranalytics.android.calculus.*
import net.pokeranalytics.android.model.StatRepresentable import net.pokeranalytics.android.model.StatRepresentable
@ -20,8 +23,12 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.HeaderRowRepresentabl
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT
import timber.log.Timber import timber.log.Timber
import java.util.* import java.util.*
import kotlin.coroutines.CoroutineContext
class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSource { class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSource, CoroutineScope {
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main
private var rowRepresentables: ArrayList<RowRepresentable> = ArrayList() private var rowRepresentables: ArrayList<RowRepresentable> = ArrayList()
@ -87,7 +94,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
// Override // Override
override fun sessionsChanged() { override fun sessionsChanged() {
this.launchStatComputation() // this.launchStatComputation()
this.statsAdapter.notifyDataSetChanged() this.statsAdapter.notifyDataSetChanged()
} }
@ -97,45 +104,54 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
* Init data * Init data
*/ */
private fun initData() { private fun initData() {
this.statsAdapter = RowRepresentableAdapter(this)
this.launchStatComputation() this.launchStatComputation()
} }
private fun launchStatComputation() { private fun launchStatComputation() {
var results = listOf<ComputedResults>()
val s = Date() val s = Date()
Timber.d(">>> start...") Timber.d(">>> start...")
runBlocking {
val cgSessions = mutableListOf<Session>() GlobalScope.launch(context = this.coroutineContext) {
val tSessions = mutableListOf<Session>() val results = compute()
showResults(results)
}
super.endedSessions.forEach { session -> val e = Date()
if (session.isCashGame()) { val duration = (e.time - s.time) / 1000.0
cgSessions.add(session) Timber.d(">>> ended in ${duration} seconds")
} else {
tSessions.add(session) }
}
}
val allStats: List<Stat> = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.AVERAGE, Stat.NUMBER_OF_SETS, Stat.AVERAGE_DURATION, Stat.DURATION) private fun compute() : List<ComputedResults> {
val allSessionGroup = SessionGroup(getString(R.string.all), super.endedSessions, allStats)
val cgStats: List<Stat> = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.NET_BB_PER_100_HANDS, Stat.HOURLY_RATE_BB, Stat.AVERAGE, Stat.STANDARD_DEVIATION_HOURLY, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN)
val cgSessionGroup = SessionGroup(getString(R.string.cash_game), cgSessions, cgStats)
val tStats: List<Stat> = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.ROI, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN)
val tSessionGroup = SessionGroup(getString(R.string.tournament), tSessions, tStats)
results = Calculator.computeGroups(listOf(allSessionGroup, cgSessionGroup, tSessionGroup), Calculator.Options()) val cgSessions = mutableListOf<Session>()
val tSessions = mutableListOf<Session>()
super.endedSessions.forEach { session ->
if (session.isCashGame()) {
cgSessions.add(session)
} else {
tSessions.add(session)
}
} }
val e = Date()
val duration = (e.time - s.time) / 1000.0
Timber.d(">>> ended in ${duration} seconds")
this.rowRepresentables = this.convertResultsIntoRepresentables(results) val allStats: List<Stat> = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.AVERAGE, Stat.NUMBER_OF_SETS, Stat.AVERAGE_DURATION, Stat.DURATION)
val allSessionGroup = SessionGroup(getString(R.string.all), super.endedSessions, allStats)
val cgStats: List<Stat> = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.NET_BB_PER_100_HANDS, Stat.HOURLY_RATE_BB, Stat.AVERAGE, Stat.STANDARD_DEVIATION_HOURLY, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN)
val cgSessionGroup = SessionGroup(getString(R.string.cash_game), cgSessions, cgStats)
val tStats: List<Stat> = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.ROI, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN)
val tSessionGroup = SessionGroup(getString(R.string.tournament), tSessions, tStats)
this.statsAdapter = RowRepresentableAdapter(this) // StatsAdapter(this, null) return Calculator.computeGroups(listOf(allSessionGroup, cgSessionGroup, tSessionGroup), Calculator.Options())
}
private fun showResults(results: List<ComputedResults>) {
this.rowRepresentables = this.convertResultsIntoRepresentables(results)
val viewManager = LinearLayoutManager(requireContext()) val viewManager = LinearLayoutManager(requireContext())
@ -144,7 +160,6 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
layoutManager = viewManager layoutManager = viewManager
adapter = statsAdapter adapter = statsAdapter
} }
} }
private fun convertResultsIntoRepresentables(results: List<ComputedResults>) : ArrayList<RowRepresentable> { private fun convertResultsIntoRepresentables(results: List<ComputedResults>) : ArrayList<RowRepresentable> {

Loading…
Cancel
Save