Classes name refactoring, added ModelException, update on TimeFrame update

dev_raz_wip
Laurent 7 years ago
parent 973286dfa9
commit 93f835f2bb
  1. 8
      app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt
  2. 20
      app/src/main/java/net/pokeranalytics/android/calculus/Computable.kt
  3. 5
      app/src/main/java/net/pokeranalytics/android/exceptions/ModelException.kt
  4. 3
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  5. 14
      app/src/main/java/net/pokeranalytics/android/model/realm/SessionGroup.kt
  6. 124
      app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt
  7. 4
      app/src/test/java/net/pokeranalytics/android/ExampleUnitTest.kt

@ -1,7 +1,7 @@
package net.pokeranalytics.android.calculus package net.pokeranalytics.android.calculus
import net.pokeranalytics.android.calculus.Stat.* import net.pokeranalytics.android.calculus.Stat.*
import net.pokeranalytics.android.model.realm.TimeFrameGroup import net.pokeranalytics.android.model.realm.SessionGroup
class Calculator { class Calculator {
@ -45,7 +45,7 @@ class Calculator {
} }
// Computes all stats for list of Session group // Computes all stats for list of Session group
fun computeGroups(groups: List<SessionGroup>, options: Options): List<ComputedGroup> { fun computeGroups(groups: List<ComputableSessions>, options: Options): List<ComputedGroup> {
var computedGroups: MutableList<ComputedGroup> = mutableListOf() var computedGroups: MutableList<ComputedGroup> = mutableListOf()
groups.forEach { group -> groups.forEach { group ->
@ -69,10 +69,10 @@ class Calculator {
} }
// Computes stats for a SessionGroup // Computes stats for a SessionGroup
fun compute(group: SessionGroup, options: Options) : ComputedResults { fun compute(group: ComputableSessions, options: Options) : ComputedResults {
val sessions: List<SessionInterface> = group.sessionGroup val sessions: List<SessionInterface> = group.sessionGroup
val sessionGroups: Set<TimeFrameGroup> = setOf() // @todo get unique list of serie val sessionGroups: Set<SessionGroup> = setOf() // @todo get unique list of serie
var results: ComputedResults = ComputedResults() var results: ComputedResults = ComputedResults()
var sum: Double = 0.0 var sum: Double = 0.0

@ -1,15 +1,19 @@
package net.pokeranalytics.android.calculus package net.pokeranalytics.android.calculus
import net.pokeranalytics.android.model.realm.TimeFrameGroup import net.pokeranalytics.android.model.realm.SessionGroup
// An interface to describe objects that can be summed /**
* An interface to describe objects that can be summed
*/
interface Summable { interface Summable {
var value: Double var value: Double
} }
// An interface describing some class that can be computed /**
* An interface describing some class that can be computed
*/
interface SessionInterface : Summable { interface SessionInterface : Summable {
var serie: TimeFrameGroup var serie: SessionGroup
var estimatedHands: Double var estimatedHands: Double
var bbNetResult: Double var bbNetResult: Double
var bigBlindSessionCount: Int // 0 or 1 var bigBlindSessionCount: Int // 0 or 1
@ -19,22 +23,22 @@ interface SessionInterface : Summable {
/** /**
* A group of computable items identified by a name * A group of computable items identified by a name
*/ */
class SessionGroup(name: String, sessions: List<SessionInterface>) { class ComputableSessions(name: String, sessions: List<SessionInterface>) {
var name: String = name var name: String = name
var sessionGroup: List<SessionInterface> = sessions var sessionGroup: List<SessionInterface> = sessions
// A subgroup used to compute stat variation // A subgroup used to compute stat variation
var comparedGroup: SessionGroup? = null var comparedGroup: ComputableSessions? = null
// The computed stats of the comparable group // The computed stats of the comparable group
var comparedComputedGroup: ComputedGroup? = null var comparedComputedGroup: ComputedGroup? = null
} }
class ComputedGroup(group: SessionGroup, computedResults: ComputedResults) { class ComputedGroup(group: ComputableSessions, computedResults: ComputedResults) {
// A computable group // A computable group
var group: SessionGroup = group var group: ComputableSessions = group
// The computed stats of the group // The computed stats of the group
var computedResults: ComputedResults = computedResults var computedResults: ComputedResults = computedResults

@ -0,0 +1,5 @@
package net.pokeranalytics.android.exceptions
class ModelException(string: String) : Exception(string) {
}

@ -23,7 +23,7 @@ open class Session(comment: String = "") : RealmObject(), DynamicRowDelegate {
var timeFrame: TimeFrame? = null var timeFrame: TimeFrame? = null
// The time frame group, which can contain multiple sessions // The time frame group, which can contain multiple sessions
var timeFrameGroup: TimeFrameGroup? = null var sessionGroup: SessionGroup? = null
// the date of creation of the app // the date of creation of the app
var creationDate: Date = Date() var creationDate: Date = Date()
@ -107,7 +107,6 @@ open class Session(comment: String = "") : RealmObject(), DynamicRowDelegate {
@Ignore @Ignore
var bigBlindSessionCount: Int = if (this.cgBigBlind != null) 1 else 0 var bigBlindSessionCount: Int = if (this.cgBigBlind != null) 1 else 0
// get() = if (this.cgBigBlind != null) 1 else 0
@Ignore @Ignore
var buyin: Double = 0.0 var buyin: Double = 0.0

@ -5,7 +5,7 @@ import io.realm.RealmObject
import io.realm.annotations.Ignore import io.realm.annotations.Ignore
open class TimeFrameGroup() : RealmObject() { open class SessionGroup() : RealmObject() {
// The timeframe of the group, i.e. its start & end date // The timeframe of the group, i.e. its start & end date
var timeFrame: TimeFrame? = null var timeFrame: TimeFrame? = null
@ -27,5 +27,17 @@ open class TimeFrameGroup() : RealmObject() {
@Ignore @Ignore
var bbNetResult: Double = 0.0 var bbNetResult: Double = 0.0
companion object {
fun newInstance() : SessionGroup {
val sessionGroup: SessionGroup = SessionGroup()
sessionGroup.timeFrame = TimeFrame()
return sessionGroup
}
}
} }

@ -1,12 +1,14 @@
package net.pokeranalytics.android.model.realm package net.pokeranalytics.android.model.realm
import io.realm.Realm
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.RealmQuery
import io.realm.RealmResults import io.realm.RealmResults
import io.realm.annotations.LinkingObjects import io.realm.annotations.LinkingObjects
import net.pokeranalytics.android.exceptions.ModelException
import java.util.* import java.util.*
open class TimeFrame : RealmObject() { open class TimeFrame : RealmObject() {
// A start date // A start date
@ -15,7 +17,7 @@ open class TimeFrame : RealmObject() {
field = value field = value
this.computeDuration() this.computeDuration()
if (this.session != null) { if (this.session != null) {
this.notifyDateChange() this.notifySessionDateChange()
} }
} }
@ -25,7 +27,7 @@ open class TimeFrame : RealmObject() {
field = value field = value
this.computeDuration() this.computeDuration()
if (this.session != null) { if (this.session != null) {
this.notifyDateChange() this.notifySessionDateChange()
} }
} }
@ -47,7 +49,7 @@ open class TimeFrame : RealmObject() {
private val session: RealmResults<Session>? = null private val session: RealmResults<Session>? = null
@LinkingObjects("timeFrame") @LinkingObjects("timeFrame")
private val group: RealmResults<TimeFrameGroup>? = null private val group: RealmResults<SessionGroup>? = null
private fun computeDuration() { private fun computeDuration() {
@ -60,20 +62,106 @@ open class TimeFrame : RealmObject() {
this.duration = endDate.time - startDate.time - this.breakDuration this.duration = endDate.time - startDate.time - this.breakDuration
} }
private fun notifyDateChange() { private fun notifySessionDateChange() {
// val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
// var query: RealmQuery<SessionGroup> = realm.where(SessionGroup::class.java)
// var query: RealmQuery<TimeFrame> = realm.where(TimeFrame::class.java) query.isNotNull("timeFrame")
// query.greaterThan("startDate", this.startDate.time)
// if (this.endDate == null) {
// this.endDate?.let { endDate -> query.greaterThan("timeFrame.startDate", this.startDate.time).or().greaterThan("timeFrame.endDate", this.startDate.time)
// query.or() } else {
// .greaterThan("startDate", endDate.time) val endDate = this.endDate!!
// .lessThan("endDate", endDate.time) query
// } .greaterThan("timeFrame.startDate", this.startDate.time)
// .lessThan("timeFrame.endDate", this.startDate.time)
// .or()
// realm.close() .greaterThan("timeFrame.startDate", endDate)
.lessThan("timeFrame.endDate", endDate)
.or()
.lessThan("timeFrame.startDate", this.startDate.time)
.greaterThan("timeFrame.endDate", endDate)
}
val sessionGroups = query.findAll()
this.updateTimeFrames(sessionGroups)
realm.close()
}
/**
* Update Time frames from groups
*/
private fun updateTimeFrames(sessionGroups: RealmResults<SessionGroup>) {
// update
if (sessionGroups.size == 1) {
// we are sure that the timeframe is not null from the realm query
val groupTimeFrame: TimeFrame = sessionGroups.first()?.timeFrame!!
if (this.startDate.before(groupTimeFrame.startDate)) {
groupTimeFrame.startDate = this.startDate
}
val endDate = this.endDate
if (endDate != null && groupTimeFrame.endDate != null && endDate.after(groupTimeFrame.endDate)) {
groupTimeFrame.endDate = endDate
} else if (endDate == null) {
groupTimeFrame.endDate = null
}
} else if (sessionGroups.size > 1) {
var startDate: Date = this.startDate
var endDate: Date? = this.endDate
val timeFrames = sessionGroups.mapNotNull { it.timeFrame }
timeFrames.forEach { tf ->
if (tf.startDate.before(startDate)) {
startDate = tf.startDate
}
endDate?.let { ed ->
tf.endDate?.let { tfed ->
if (tfed.after(ed)) {
endDate = tfed
}
}
} ?: run {
endDate = tf.endDate
}
}
// get all sessions from groups
val sessions = sessionGroups.flatMap { it.sessions }
// delete all groups
val realm = Realm.getDefaultInstance()
realm.executeTransaction {
sessionGroups.deleteAllFromRealm()
}
val group: SessionGroup = SessionGroup.newInstance()
group.timeFrame?.let {
it.startDate = startDate
it.endDate = endDate
} ?: run {
throw ModelException("TimeFrame should never be null here")
}
this.session?.first()?.let {
group.sessions.add(it)
} ?: run {
throw ModelException("TimeFrame should never be null here")
}
//@todo delete all timeframes, create a new one
}
} }
} }

@ -1,7 +1,7 @@
package net.pokeranalytics.android package net.pokeranalytics.android
import net.pokeranalytics.android.calculus.* import net.pokeranalytics.android.calculus.*
import net.pokeranalytics.android.model.realm.TimeFrameGroup import net.pokeranalytics.android.model.realm.SessionGroup
import org.junit.Assert.fail import org.junit.Assert.fail
import org.junit.Test import org.junit.Test
@ -17,7 +17,7 @@ class ExampleUnitTest {
// override var serie: Serie = Serie(TimeFrame()) // override var serie: Serie = Serie(TimeFrame())
override var value: Double = someValue override var value: Double = someValue
override var serie: TimeFrameGroup = TimeFrameGroup() override var serie: SessionGroup = SessionGroup()
override var estimatedHands: Double = 0.0 override var estimatedHands: Double = 0.0
override var bbNetResult: Double = 0.0 override var bbNetResult: Double = 0.0
override var bigBlindSessionCount: Int = 0 // 0 or 1 override var bigBlindSessionCount: Int = 0 // 0 or 1

Loading…
Cancel
Save