From fe1b2a3223711fda266c36c3f0b5b248d65141fe Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 27 May 2019 18:23:08 +0200 Subject: [PATCH] Fixing modeling issues + migration --- app/build.gradle | 2 +- .../migrations/PokerAnalyticsMigration.kt | 42 +++++++++++-------- .../android/model/realm/CustomField.kt | 34 +++++++++++---- .../android/model/realm/CustomFieldEntry.kt | 35 ++++++++++++---- .../android/model/realm/Session.kt | 4 +- 5 files changed, 82 insertions(+), 35 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ab1a65b2..6f4bbf1a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,7 +28,7 @@ android { applicationId "net.pokeranalytics.android" minSdkVersion 23 targetSdkVersion 28 - versionCode 27 + versionCode 29 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt b/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt index a274f554..c338dbc5 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt @@ -2,8 +2,6 @@ package net.pokeranalytics.android.model.migrations import io.realm.DynamicRealm import io.realm.RealmMigration -import net.pokeranalytics.android.model.realm.CustomField -import net.pokeranalytics.android.model.realm.CustomFieldEntry import timber.log.Timber @@ -103,34 +101,42 @@ class PokerAnalyticsMigration : RealmMigration { it.addField("year", Integer::class.java) it.addField("dayOfMonth", Integer::class.java) } - schema.create("CustomFieldEntry")?.let { + + val cfEntry = schema.create("CustomFieldEntry")?.let { it.addField("id", String::class.java).setRequired("id", true) + it.addPrimaryKey("id") it.addField("value", String::class.java).setNullable("value", false) it.addField("order", Integer::class.java).setNullable("order", false) - it.addField("customField", CustomField::class.java).setNullable("customField", false) +// it.addRealmObjectField("customField", it).setNullable("customField", false) it.addField("numericValue", Double::class.java).setNullable("numericValue", true) } - schema.get("CustomField")?.let { - it.addField("type", Integer::class.java).setNullable("type", false) - it.addField("duplicateValue", Boolean::class.java) - it.addField("sortCondition", Integer::class.java) - it.addRealmListField("entries", CustomFieldEntry::class.java) + + cfEntry?.let { customFieldEntrySchema -> + schema.get("CustomField")?.let { + it.addField("type", Integer::class.java).setNullable("type", false) + it.addField("duplicateValue", Boolean::class.java) + it.addField("sortCondition", Integer::class.java).setRequired("sortCondition", true) + it.addRealmListField("entries", customFieldEntrySchema) + } + + schema.get("Session")?.let { + it.addField("startDateHourMinuteComponent", Double::class.java) + .setNullable("startDateHourMinuteComponent", true) + it.addField("endDateHourMinuteComponent", Double::class.java) + .setNullable("endDateHourMinuteComponent", true) + it.addRealmListField("customFieldEntries", customFieldEntrySchema) + } + } + schema.get("ReportSetup")?.let { - it.addRealmListField("statIds", Int::class.java) - it.addRealmListField("criteriaIds", Int::class.java) + it.addRealmListField("statIds", Int::class.java).setNullable("statIds", true) + it.addRealmListField("criteriaIds", Int::class.java).setNullable("criteriaIds", true) it.removeField("filters") schema.get("Filter")?.let { filterSchema -> it.addRealmObjectField("filter", filterSchema) } } - schema.get("Session")?.let { - it.addField("startDateHourMinuteComponent", Double::class.java) - .setNullable("startDateHourMinuteComponent", true) - it.addField("endDateHourMinuteComponent", Double::class.java) - .setNullable("endDateHourMinuteComponent", true) - it.addRealmListField("customFieldEntries", CustomFieldEntry::class.java) - } schema.get("Filter")?.addField("filterableTypeOrdinal", Integer::class.java) schema.get("Filter")?.addField("useCount", Int::class.java) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt index 503cd90d..509a16dc 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt @@ -28,12 +28,19 @@ import kotlin.collections.ArrayList open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDataSource, RowRepresentable { - enum class Type(override var uniqueIdentifier: Int, var resId: Int, var isEnabled: Boolean = true) : IntIdentifiable { + /** + * The custom field type: a list of items, a number or an amont + */ + enum class Type(override var uniqueIdentifier: Int, var resId: Int, var isEnabled: Boolean = true) : + IntIdentifiable { LIST(0, R.string.enum_custom_field_type), NUMBER(1, R.string.number), AMOUNT(2, R.string.amount) } + /** + * The sorting used for the list, either custom, or alphabetically asc/desc + */ enum class Sort(override var uniqueIdentifier: Int) : IntIdentifiable { DEFAULT(0), ASCENDING(1), @@ -43,18 +50,31 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa @PrimaryKey override var id = UUID.randomUUID().toString() - // The name of the currency field + /** + * The name of the custom field + */ override var name: String = "" - // Migration + // The type of the custom fields, mapped with the CustomField.Type enum var type: Int = Type.LIST.uniqueIdentifier set(value) { field = value this.updateRowRepresentation() } + /** + * Indicates whether the custom field value should be copied when a session is duplicated + */ var duplicateValue: Boolean = false + + /** + * The list of entries for the LIST type + */ var entries: RealmList = RealmList() + + /** + * The sorting of the entries, mapped with the CustomField.Sort enum + */ var sortCondition: Int = Sort.DEFAULT.uniqueIdentifier set(value) { field = value @@ -62,7 +82,6 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa updateRowRepresentation() } - @Ignore private var entriesToDelete: ArrayList = ArrayList() @@ -118,7 +137,8 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa } override fun alreadyExists(realm: Realm): Boolean { - return realm.where(this::class.java).equalTo("name", this.name).and().notEqualTo("id", this.id).findAll().isNotEmpty() + return realm.where(this::class.java).equalTo("name", this.name).and().notEqualTo("id", this.id).findAll() + .isNotEmpty() } override fun isValidForDelete(realm: Realm): Boolean { @@ -223,8 +243,8 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa */ fun addEntry(): CustomFieldEntry { val entry = CustomFieldEntry() - entry.customField = this - entries.add(entry) +// entry.customField = this + this.entries.add(entry) sortEntries() updateRowRepresentation() return entry diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt index c328d4b8..91244e50 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt @@ -4,7 +4,9 @@ import android.content.Context import android.text.InputType import io.realm.Realm import io.realm.RealmObject +import io.realm.RealmResults import io.realm.annotations.Ignore +import io.realm.annotations.LinkingObjects import io.realm.annotations.PrimaryKey import io.realm.kotlin.where import net.pokeranalytics.android.R @@ -23,14 +25,37 @@ import java.util.Currency open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable { + @PrimaryKey override var id = UUID.randomUUID().toString() + + /** + * The order in the list + */ var order: Int = 0 - var customField: CustomField? = null + /** + * The inverse relationship with CustomField + */ + @LinkingObjects("entries") + val customFields: RealmResults? = null + + val customField: CustomField? + get() { + return this.customFields?.first() + } + + /** + * The string value of the entry + */ var value: String = "" + + /** + * The numeric value of the entry + */ var numericValue: Double? = null + @Ignore override var name: String = value get() { return value } @@ -108,14 +133,10 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable { fun getFormattedValue(currency: Currency? = null): String { return when (customField?.type) { CustomField.Type.AMOUNT.uniqueIdentifier -> { - numericValue?.let { - it.toCurrency(currency) - } ?: run { NULL_TEXT } + numericValue?.toCurrency(currency) ?: run { NULL_TEXT } } CustomField.Type.NUMBER.uniqueIdentifier -> { - numericValue?.let { - it.toString() - } ?: run { NULL_TEXT } + numericValue?.toString() ?: run { NULL_TEXT } } else -> { value 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 135b152e..3e8da0b9 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 @@ -15,7 +15,6 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.ComputedStat import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.StatFormattingException -import net.pokeranalytics.android.util.TextFormat import net.pokeranalytics.android.exceptions.ModelException import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.model.TableSize @@ -36,6 +35,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepres import net.pokeranalytics.android.ui.view.rowrepresentable.SeparatorRow import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow import net.pokeranalytics.android.util.NULL_TEXT +import net.pokeranalytics.android.util.TextFormat import net.pokeranalytics.android.util.UserDefaults import net.pokeranalytics.android.util.extensions.* import java.text.DateFormat @@ -1024,9 +1024,9 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat CustomField.Type.NUMBER.uniqueIdentifier -> { if (value != null) { val customFieldEntry = CustomFieldEntry() - customFieldEntry.customField = row customFieldEntry.numericValue = value as Double? customFieldEntries.add(customFieldEntry) + row.entries.add(customFieldEntry) } } CustomField.Type.LIST.uniqueIdentifier -> {