Fixing modeling issues + migration

dev
Laurent 7 years ago
parent acb31d4e58
commit fe1b2a3223
  1. 2
      app/build.gradle
  2. 36
      app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt
  3. 34
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt
  4. 35
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt
  5. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt

@ -28,7 +28,7 @@ android {
applicationId "net.pokeranalytics.android" applicationId "net.pokeranalytics.android"
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 28 targetSdkVersion 28
versionCode 27 versionCode 29
versionName "1.0" versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }

@ -2,8 +2,6 @@ package net.pokeranalytics.android.model.migrations
import io.realm.DynamicRealm import io.realm.DynamicRealm
import io.realm.RealmMigration import io.realm.RealmMigration
import net.pokeranalytics.android.model.realm.CustomField
import net.pokeranalytics.android.model.realm.CustomFieldEntry
import timber.log.Timber import timber.log.Timber
@ -103,33 +101,41 @@ class PokerAnalyticsMigration : RealmMigration {
it.addField("year", Integer::class.java) it.addField("year", Integer::class.java)
it.addField("dayOfMonth", 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.addField("id", String::class.java).setRequired("id", true)
it.addPrimaryKey("id")
it.addField("value", String::class.java).setNullable("value", false) it.addField("value", String::class.java).setNullable("value", false)
it.addField("order", Integer::class.java).setNullable("order", 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) it.addField("numericValue", Double::class.java).setNullable("numericValue", true)
} }
cfEntry?.let { customFieldEntrySchema ->
schema.get("CustomField")?.let { schema.get("CustomField")?.let {
it.addField("type", Integer::class.java).setNullable("type", false) it.addField("type", Integer::class.java).setNullable("type", false)
it.addField("duplicateValue", Boolean::class.java) it.addField("duplicateValue", Boolean::class.java)
it.addField("sortCondition", Integer::class.java) it.addField("sortCondition", Integer::class.java).setRequired("sortCondition", true)
it.addRealmListField("entries", CustomFieldEntry::class.java) it.addRealmListField("entries", customFieldEntrySchema)
}
schema.get("ReportSetup")?.let {
it.addRealmListField("statIds", Int::class.java)
it.addRealmListField("criteriaIds", Int::class.java)
it.removeField("filters")
schema.get("Filter")?.let { filterSchema ->
it.addRealmObjectField("filter", filterSchema)
}
} }
schema.get("Session")?.let { schema.get("Session")?.let {
it.addField("startDateHourMinuteComponent", Double::class.java) it.addField("startDateHourMinuteComponent", Double::class.java)
.setNullable("startDateHourMinuteComponent", true) .setNullable("startDateHourMinuteComponent", true)
it.addField("endDateHourMinuteComponent", Double::class.java) it.addField("endDateHourMinuteComponent", Double::class.java)
.setNullable("endDateHourMinuteComponent", true) .setNullable("endDateHourMinuteComponent", true)
it.addRealmListField("customFieldEntries", CustomFieldEntry::class.java) it.addRealmListField("customFieldEntries", customFieldEntrySchema)
}
}
schema.get("ReportSetup")?.let {
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("Filter")?.addField("filterableTypeOrdinal", Integer::class.java) schema.get("Filter")?.addField("filterableTypeOrdinal", Integer::class.java)

@ -28,12 +28,19 @@ import kotlin.collections.ArrayList
open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDataSource, RowRepresentable { 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), LIST(0, R.string.enum_custom_field_type),
NUMBER(1, R.string.number), NUMBER(1, R.string.number),
AMOUNT(2, R.string.amount) 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 { enum class Sort(override var uniqueIdentifier: Int) : IntIdentifiable {
DEFAULT(0), DEFAULT(0),
ASCENDING(1), ASCENDING(1),
@ -43,18 +50,31 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
@PrimaryKey @PrimaryKey
override var id = UUID.randomUUID().toString() override var id = UUID.randomUUID().toString()
// The name of the currency field /**
* The name of the custom field
*/
override var name: String = "" override var name: String = ""
// Migration // The type of the custom fields, mapped with the CustomField.Type enum
var type: Int = Type.LIST.uniqueIdentifier var type: Int = Type.LIST.uniqueIdentifier
set(value) { set(value) {
field = value field = value
this.updateRowRepresentation() this.updateRowRepresentation()
} }
/**
* Indicates whether the custom field value should be copied when a session is duplicated
*/
var duplicateValue: Boolean = false var duplicateValue: Boolean = false
/**
* The list of entries for the LIST type
*/
var entries: RealmList<CustomFieldEntry> = RealmList() var entries: RealmList<CustomFieldEntry> = RealmList()
/**
* The sorting of the entries, mapped with the CustomField.Sort enum
*/
var sortCondition: Int = Sort.DEFAULT.uniqueIdentifier var sortCondition: Int = Sort.DEFAULT.uniqueIdentifier
set(value) { set(value) {
field = value field = value
@ -62,7 +82,6 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
updateRowRepresentation() updateRowRepresentation()
} }
@Ignore @Ignore
private var entriesToDelete: ArrayList<CustomFieldEntry> = ArrayList() private var entriesToDelete: ArrayList<CustomFieldEntry> = ArrayList()
@ -118,7 +137,8 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
} }
override fun alreadyExists(realm: Realm): Boolean { 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 { override fun isValidForDelete(realm: Realm): Boolean {
@ -223,8 +243,8 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
*/ */
fun addEntry(): CustomFieldEntry { fun addEntry(): CustomFieldEntry {
val entry = CustomFieldEntry() val entry = CustomFieldEntry()
entry.customField = this // entry.customField = this
entries.add(entry) this.entries.add(entry)
sortEntries() sortEntries()
updateRowRepresentation() updateRowRepresentation()
return entry return entry

@ -4,7 +4,9 @@ import android.content.Context
import android.text.InputType import android.text.InputType
import io.realm.Realm import io.realm.Realm
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.RealmResults
import io.realm.annotations.Ignore import io.realm.annotations.Ignore
import io.realm.annotations.LinkingObjects
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import io.realm.kotlin.where import io.realm.kotlin.where
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
@ -23,14 +25,37 @@ import java.util.Currency
open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable { open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable {
@PrimaryKey @PrimaryKey
override var id = UUID.randomUUID().toString() override var id = UUID.randomUUID().toString()
/**
* The order in the list
*/
var order: Int = 0 var order: Int = 0
var customField: CustomField? = null
/**
* The inverse relationship with CustomField
*/
@LinkingObjects("entries")
val customFields: RealmResults<CustomField>? = null
val customField: CustomField?
get() {
return this.customFields?.first()
}
/**
* The string value of the entry
*/
var value: String = "" var value: String = ""
/**
* The numeric value of the entry
*/
var numericValue: Double? = null var numericValue: Double? = null
@Ignore
override var name: String = value override var name: String = value
get() { return value } get() { return value }
@ -108,14 +133,10 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable {
fun getFormattedValue(currency: Currency? = null): String { fun getFormattedValue(currency: Currency? = null): String {
return when (customField?.type) { return when (customField?.type) {
CustomField.Type.AMOUNT.uniqueIdentifier -> { CustomField.Type.AMOUNT.uniqueIdentifier -> {
numericValue?.let { numericValue?.toCurrency(currency) ?: run { NULL_TEXT }
it.toCurrency(currency)
} ?: run { NULL_TEXT }
} }
CustomField.Type.NUMBER.uniqueIdentifier -> { CustomField.Type.NUMBER.uniqueIdentifier -> {
numericValue?.let { numericValue?.toString() ?: run { NULL_TEXT }
it.toString()
} ?: run { NULL_TEXT }
} }
else -> { else -> {
value value

@ -15,7 +15,6 @@ import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.ComputedStat import net.pokeranalytics.android.calculus.ComputedStat
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.calculus.StatFormattingException import net.pokeranalytics.android.calculus.StatFormattingException
import net.pokeranalytics.android.util.TextFormat
import net.pokeranalytics.android.exceptions.ModelException import net.pokeranalytics.android.exceptions.ModelException
import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.model.Limit
import net.pokeranalytics.android.model.TableSize 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.SeparatorRow
import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT
import net.pokeranalytics.android.util.TextFormat
import net.pokeranalytics.android.util.UserDefaults import net.pokeranalytics.android.util.UserDefaults
import net.pokeranalytics.android.util.extensions.* import net.pokeranalytics.android.util.extensions.*
import java.text.DateFormat import java.text.DateFormat
@ -1024,9 +1024,9 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
CustomField.Type.NUMBER.uniqueIdentifier -> { CustomField.Type.NUMBER.uniqueIdentifier -> {
if (value != null) { if (value != null) {
val customFieldEntry = CustomFieldEntry() val customFieldEntry = CustomFieldEntry()
customFieldEntry.customField = row
customFieldEntry.numericValue = value as Double? customFieldEntry.numericValue = value as Double?
customFieldEntries.add(customFieldEntry) customFieldEntries.add(customFieldEntry)
row.entries.add(customFieldEntry)
} }
} }
CustomField.Type.LIST.uniqueIdentifier -> { CustomField.Type.LIST.uniqueIdentifier -> {

Loading…
Cancel
Save