From 93f835f2bb1a3274da492f168be269831078be1c Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 15 Feb 2019 11:28:45 +0100 Subject: [PATCH 1/2] Classes name refactoring, added ModelException, update on TimeFrame update --- .../android/calculus/Calculator.kt | 8 +- .../android/calculus/Computable.kt | 20 +-- .../android/exceptions/ModelException.kt | 5 + .../android/model/realm/Session.kt | 3 +- .../{TimeFrameGroup.kt => SessionGroup.kt} | 14 +- .../android/model/realm/TimeFrame.kt | 124 +++++++++++++++--- .../pokeranalytics/android/ExampleUnitTest.kt | 4 +- 7 files changed, 143 insertions(+), 35 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/exceptions/ModelException.kt rename app/src/main/java/net/pokeranalytics/android/model/realm/{TimeFrameGroup.kt => SessionGroup.kt} (71%) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index 4dbdd4b0..374e4c03 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -1,7 +1,7 @@ package net.pokeranalytics.android.calculus import net.pokeranalytics.android.calculus.Stat.* -import net.pokeranalytics.android.model.realm.TimeFrameGroup +import net.pokeranalytics.android.model.realm.SessionGroup class Calculator { @@ -45,7 +45,7 @@ class Calculator { } // Computes all stats for list of Session group - fun computeGroups(groups: List, options: Options): List { + fun computeGroups(groups: List, options: Options): List { var computedGroups: MutableList = mutableListOf() groups.forEach { group -> @@ -69,10 +69,10 @@ class Calculator { } // Computes stats for a SessionGroup - fun compute(group: SessionGroup, options: Options) : ComputedResults { + fun compute(group: ComputableSessions, options: Options) : ComputedResults { val sessions: List = group.sessionGroup - val sessionGroups: Set = setOf() // @todo get unique list of serie + val sessionGroups: Set = setOf() // @todo get unique list of serie var results: ComputedResults = ComputedResults() var sum: Double = 0.0 diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Computable.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Computable.kt index 2d341fa9..816de83c 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Computable.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Computable.kt @@ -1,15 +1,19 @@ 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 { var value: Double } -// An interface describing some class that can be computed +/** + * An interface describing some class that can be computed + */ interface SessionInterface : Summable { - var serie: TimeFrameGroup + var serie: SessionGroup var estimatedHands: Double var bbNetResult: Double var bigBlindSessionCount: Int // 0 or 1 @@ -19,22 +23,22 @@ interface SessionInterface : Summable { /** * A group of computable items identified by a name */ -class SessionGroup(name: String, sessions: List) { +class ComputableSessions(name: String, sessions: List) { var name: String = name var sessionGroup: List = sessions // A subgroup used to compute stat variation - var comparedGroup: SessionGroup? = null + var comparedGroup: ComputableSessions? = null // The computed stats of the comparable group var comparedComputedGroup: ComputedGroup? = null } -class ComputedGroup(group: SessionGroup, computedResults: ComputedResults) { +class ComputedGroup(group: ComputableSessions, computedResults: ComputedResults) { // A computable group - var group: SessionGroup = group + var group: ComputableSessions = group // The computed stats of the group var computedResults: ComputedResults = computedResults diff --git a/app/src/main/java/net/pokeranalytics/android/exceptions/ModelException.kt b/app/src/main/java/net/pokeranalytics/android/exceptions/ModelException.kt new file mode 100644 index 00000000..e9c377b4 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/exceptions/ModelException.kt @@ -0,0 +1,5 @@ +package net.pokeranalytics.android.exceptions + +class ModelException(string: String) : Exception(string) { + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index 01a66795..db1d1505 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -23,7 +23,7 @@ open class Session(comment: String = "") : RealmObject(), DynamicRowDelegate { var timeFrame: TimeFrame? = null // The time frame group, which can contain multiple sessions - var timeFrameGroup: TimeFrameGroup? = null + var sessionGroup: SessionGroup? = null // the date of creation of the app var creationDate: Date = Date() @@ -107,7 +107,6 @@ open class Session(comment: String = "") : RealmObject(), DynamicRowDelegate { @Ignore var bigBlindSessionCount: Int = if (this.cgBigBlind != null) 1 else 0 -// get() = if (this.cgBigBlind != null) 1 else 0 @Ignore var buyin: Double = 0.0 diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrameGroup.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/SessionGroup.kt similarity index 71% rename from app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrameGroup.kt rename to app/src/main/java/net/pokeranalytics/android/model/realm/SessionGroup.kt index 02777b1e..eb8f6521 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrameGroup.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/SessionGroup.kt @@ -5,7 +5,7 @@ import io.realm.RealmObject import io.realm.annotations.Ignore -open class TimeFrameGroup() : RealmObject() { +open class SessionGroup() : RealmObject() { // The timeframe of the group, i.e. its start & end date var timeFrame: TimeFrame? = null @@ -27,5 +27,17 @@ open class TimeFrameGroup() : RealmObject() { @Ignore var bbNetResult: Double = 0.0 + + companion object { + + fun newInstance() : SessionGroup { + val sessionGroup: SessionGroup = SessionGroup() + sessionGroup.timeFrame = TimeFrame() + return sessionGroup + } + + } + + } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt index 32042c33..784bdb00 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt @@ -1,12 +1,14 @@ package net.pokeranalytics.android.model.realm +import io.realm.Realm import io.realm.RealmObject +import io.realm.RealmQuery import io.realm.RealmResults import io.realm.annotations.LinkingObjects +import net.pokeranalytics.android.exceptions.ModelException import java.util.* - open class TimeFrame : RealmObject() { // A start date @@ -15,7 +17,7 @@ open class TimeFrame : RealmObject() { field = value this.computeDuration() if (this.session != null) { - this.notifyDateChange() + this.notifySessionDateChange() } } @@ -25,7 +27,7 @@ open class TimeFrame : RealmObject() { field = value this.computeDuration() if (this.session != null) { - this.notifyDateChange() + this.notifySessionDateChange() } } @@ -47,7 +49,7 @@ open class TimeFrame : RealmObject() { private val session: RealmResults? = null @LinkingObjects("timeFrame") - private val group: RealmResults? = null + private val group: RealmResults? = null private fun computeDuration() { @@ -60,20 +62,106 @@ open class TimeFrame : RealmObject() { this.duration = endDate.time - startDate.time - this.breakDuration } - private fun notifyDateChange() { -// val realm = Realm.getDefaultInstance() -// -// var query: RealmQuery = realm.where(TimeFrame::class.java) -// query.greaterThan("startDate", this.startDate.time) -// -// this.endDate?.let { endDate -> -// query.or() -// .greaterThan("startDate", endDate.time) -// .lessThan("endDate", endDate.time) -// } -// -// -// realm.close() + private fun notifySessionDateChange() { + val realm = Realm.getDefaultInstance() + var query: RealmQuery = realm.where(SessionGroup::class.java) + query.isNotNull("timeFrame") + + if (this.endDate == null) { + query.greaterThan("timeFrame.startDate", this.startDate.time).or().greaterThan("timeFrame.endDate", this.startDate.time) + } else { + val endDate = this.endDate!! + query + .greaterThan("timeFrame.startDate", this.startDate.time) + .lessThan("timeFrame.endDate", this.startDate.time) + .or() + .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) { + + // 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 + + + + } + } } diff --git a/app/src/test/java/net/pokeranalytics/android/ExampleUnitTest.kt b/app/src/test/java/net/pokeranalytics/android/ExampleUnitTest.kt index b6fbf93a..2370b6e3 100644 --- a/app/src/test/java/net/pokeranalytics/android/ExampleUnitTest.kt +++ b/app/src/test/java/net/pokeranalytics/android/ExampleUnitTest.kt @@ -1,7 +1,7 @@ package net.pokeranalytics.android 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.Test @@ -17,7 +17,7 @@ class ExampleUnitTest { // override var serie: Serie = Serie(TimeFrame()) override var value: Double = someValue - override var serie: TimeFrameGroup = TimeFrameGroup() + override var serie: SessionGroup = SessionGroup() override var estimatedHands: Double = 0.0 override var bbNetResult: Double = 0.0 override var bigBlindSessionCount: Int = 0 // 0 or 1 From 5db614a4ef412a26ace7e1fac44e73f3cd45da78 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 15 Feb 2019 11:43:49 +0100 Subject: [PATCH 2/2] change constructor definition --- .../net/pokeranalytics/android/exceptions/ModelException.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/exceptions/ModelException.kt b/app/src/main/java/net/pokeranalytics/android/exceptions/ModelException.kt index e9c377b4..3c54666a 100644 --- a/app/src/main/java/net/pokeranalytics/android/exceptions/ModelException.kt +++ b/app/src/main/java/net/pokeranalytics/android/exceptions/ModelException.kt @@ -1,5 +1,5 @@ package net.pokeranalytics.android.exceptions -class ModelException(string: String) : Exception(string) { +class ModelException(message: String) : Exception(message) { } \ No newline at end of file