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 e515da67..ac80a8e9 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 @@ -34,16 +34,18 @@ open class TimeFrame : RealmObject() { // indicates a state of pause var paused: Boolean = false + // Session @LinkingObjects("timeFrame") - private val sessions: RealmResults? = null - - @LinkingObjects("timeFrame") - private val groups: RealmResults? = null + private val sessions: RealmResults? = null // we should have only one session @Ignore var session: Session? = null get() = this.sessions?.first() + // Group + @LinkingObjects("timeFrame") + private val groups: RealmResults? = null // we should have only one group + @Ignore var group: SessionGroup? = null get() = this.groups?.first() @@ -60,13 +62,7 @@ open class TimeFrame : RealmObject() { } private fun computeDuration() { - - var endDate: Date - if (this.endDate != null) { - endDate = this.endDate!! - } else { - endDate = Date() - } + var endDate: Date = this.endDate ?: Date() this.duration = endDate.time - startDate.time - this.breakDuration } @@ -102,83 +98,107 @@ open class TimeFrame : RealmObject() { */ private fun updateTimeFrames(sessionGroups: RealmResults) { - // update - if (sessionGroups.size == 1) { + when (sessionGroups.size) { + 0 -> this.createSessionGroup() + 1 -> this.updateSingleSessionGroup(sessionGroups.first()?.timeFrame!!) + else -> this.mergeSessionGroups(sessionGroups) + } - // 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 - } + } - // Realm Update - val realm = Realm.getDefaultInstance() - realm.beginTransaction() - realm.copyToRealmOrUpdate(groupTimeFrame) - realm.commitTransaction() + private fun createSessionGroup() { - } else if (sessionGroups.size > 1) { + val group: SessionGroup = SessionGroup.newInstance() + group.timeFrame?.let { + it.startDate = this.startDate + it.endDate = this.endDate + } ?: run { + throw ModelException("TimeFrame should never be null here") + } - 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 - } + /** + * Single session group update + * Changes the group timeframe using the current timeframe dates + */ + private fun updateSingleSessionGroup(groupTimeFrame: TimeFrame) { - endDate?.let { ed -> - tf.endDate?.let { tfed -> - if (tfed.after(ed)) { - endDate = tfed - } - } - } ?: run { - endDate = tf.endDate - } + 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 + } - } + // Realm Update + val realm = Realm.getDefaultInstance() + realm.beginTransaction() + realm.copyToRealmOrUpdate(groupTimeFrame) + realm.commitTransaction() - // get all sessions from groups - var sessions = sessionGroups.flatMap { it.sessions } + } - // Start Realm updates - val realm = Realm.getDefaultInstance() - realm.beginTransaction() + /** + * Multiple session groups update: + * Merges all groups into one (delete all then create a new one) + */ + private fun mergeSessionGroups(sessionGroups: RealmResults) { - // delete all groups - sessionGroups.deleteAllFromRealm() + var startDate: Date = this.startDate + var endDate: Date? = this.endDate - // Create a new groups - val group: SessionGroup = SessionGroup.newInstance() - group.timeFrame?.let { - it.startDate = startDate - it.endDate = endDate - } ?: run { - throw ModelException("TimeFrame should never be null here") + val timeFrames = sessionGroups.mapNotNull { it.timeFrame } + timeFrames.forEach { tf -> + if (tf.startDate.before(startDate)) { + startDate = tf.startDate } - // Add the session linked to this timeframe to the new group - this.sessions?.first()?.let { - group.sessions.add(it) + endDate?.let { ed -> + tf.endDate?.let { tfed -> + if (tfed.after(ed)) { + endDate = tfed + } + } } ?: run { - throw ModelException("TimeFrame should never be null here") + endDate = tf.endDate } - // Add all orphan sessions - group.sessions.addAll(sessions) + } + + // get all sessions from groups + var sessions = sessionGroups.flatMap { it.sessions } - realm.commitTransaction() + // Start Realm updates + val realm = Realm.getDefaultInstance() + realm.beginTransaction() + + // delete all groups + sessionGroups.deleteAllFromRealm() + + // Create a new groups + val group: SessionGroup = SessionGroup.newInstance() + group.timeFrame?.let { + it.startDate = startDate + it.endDate = endDate + } ?: run { + throw ModelException("TimeFrame should never be null here") + } + // Add the session linked to this timeframe to the new group + this.sessions?.first()?.let { + group.sessions.add(it) + } ?: run { + throw ModelException("TimeFrame should never be null here") } + // Add all orphan sessions + group.sessions.addAll(sessions) + + realm.commitTransaction() } }