diff --git a/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt b/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt index 5133ab5c..c0804e68 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt @@ -16,6 +16,7 @@ import net.pokeranalytics.android.model.Criteria.TournamentFees.comparison import net.pokeranalytics.android.model.Criteria.TournamentNames.comparison import net.pokeranalytics.android.model.Criteria.TournamentTypes.comparison import net.pokeranalytics.android.model.Criteria.TransactionTypes.comparison +import net.pokeranalytics.android.model.filter.FilterHelper import net.pokeranalytics.android.model.filter.Query import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.interfaces.NameManageable @@ -60,22 +61,21 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row abstract class RealmCriteria(uniqueIdentifier: Int) : Criteria(uniqueIdentifier) { inline fun comparison(): List { - if (this is ListCustomFields) { - val objects = mutableListOf() - val realm = Realm.getDefaultInstance() - realm.where().equalTo("customField.id", this.customFieldId).findAll().forEach { - objects.add(QueryCondition.CustomFieldListQuery(it)) - } - objects.sorted() - realm.close() - return objects.map { Query(it) } - } + if (this is ListCustomFields) { + val objects = mutableListOf() + val realm = Realm.getDefaultInstance() + realm.where().equalTo("customField.id", this.customField.id).findAll().forEach { + objects.add(QueryCondition.CustomFieldListQuery(it)) + } + objects.sorted() + realm.close() + return objects.map { Query(it) } + } return compare, T>() } } - abstract class SimpleCriteria(private val conditions: List, uniqueIdentifier: Int) : - Criteria(uniqueIdentifier) { + abstract class SimpleCriteria(private val conditions: List, uniqueIdentifier: Int) : Criteria(uniqueIdentifier) { fun comparison(): List { return conditions.map { Query(it) } } @@ -84,25 +84,24 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row abstract class ListCriteria(uniqueIdentifier: Int) : Criteria(uniqueIdentifier) { inline fun , reified S : Comparable> comparison(): List { - if (this is ValueCustomFields) { - val realm = Realm.getDefaultInstance() - val distincts = - realm.where().equalTo("customField.id", this.customFieldId).distinct("value") - .findAll().sort("value", Sort.ASCENDING) - realm.close() - - val objects = mutableListOf() - distincts.distinct().forEach { - val condition: QueryCondition.CustomFieldNumberQuery = - QueryCondition.CustomFieldNumberQuery().apply { - this.customFieldId = this@ListCriteria.customFieldId - listOfValues = arrayListOf(it.value) - } - objects.add(condition) - objects.sorted() - return objects.map { Query(it) } - } - } + if (this is ValueCustomFields) { + val realm = Realm.getDefaultInstance() + val distincts = realm.where().equalTo("customField.id", this.customField.id).distinct("numericValue").findAll().sort("numericValue", Sort.ASCENDING) + realm.close() + + val objects = mutableListOf() + distincts.distinct().mapNotNull { + it.numericValue + }.forEach {value -> + val condition: QueryCondition.CustomFieldNumberQuery = QueryCondition.CustomFieldNumberQuery().apply { + this.customFieldId = this@ListCriteria.customField.id + listOfValues = arrayListOf(value) + } + objects.add(condition) + objects.sorted() + return objects.map { Query(it) } + } + } QueryCondition.distinct()?.let { val values = it.mapNotNull { session -> @@ -158,13 +157,8 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row object TournamentFees : ListCriteria(18) object Cash : SimpleCriteria(listOf(QueryCondition.IsCash), 19) object Tournament : SimpleCriteria(listOf(QueryCondition.IsTournament), 20) - data class ListCustomFields(override var customField: CustomField) : RealmCriteria(21), CustomFieldCriteria { - override var customFieldId: String = customField.id - } - - data class ValueCustomFields(override var customField: CustomField) : ListCriteria(22), CustomFieldCriteria { - override var customFieldId: String = customField.id - } + data class ListCustomFields(var customField: CustomField) : RealmCriteria(21) + data class ValueCustomFields(var customField: CustomField) : ListCriteria(22) val queries: List get() { @@ -238,7 +232,7 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row years } is Blinds -> comparison() - is ListCustomFields -> comparison() + is ListCustomFields -> comparison() else -> throw PokerAnalyticsException.QueryTypeUnhandled } } @@ -263,8 +257,8 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row AllMonthsUpToNow -> R.string.month Blinds -> R.string.blind TournamentFees -> R.string.entry_fees - is ListCustomFields -> this.customField.resId - is ValueCustomFields -> this.customField.resId + is ListCustomFields -> this.customField.resId + is ValueCustomFields -> this.customField.resId else -> null } } @@ -316,8 +310,3 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row } - -interface CustomFieldCriteria { - var customField: CustomField - var customFieldId: String -} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/Query.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/Query.kt index 8e64dc1f..ef2f0b2b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/Query.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/Query.kt @@ -77,7 +77,7 @@ class Query { } } - // println("<<<<<< ${realmQuery.description}") + //println("<<<<<< ${realmQuery}") val queryLast = this.conditions.filter { it is QueryCondition.Last }.firstOrNull() diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt index 447f5132..b2af94d8 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt @@ -531,11 +531,11 @@ sealed class QueryCondition : FilterElementRow { } } - open class CustomFieldNumberQuery() : ListOfString(), CustomFieldRelated { + open class CustomFieldNumberQuery() : ListOfDouble(), CustomFieldRelated { override var customFieldId : String? = null override var operator: Operator = Operator.EQUALS constructor(customFieldId: String, value: Double): this() { - this.listOfValues = arrayListOf(value.toString()) + this.listOfValues = arrayListOf(value) this.customFieldId = customFieldId } @@ -557,8 +557,8 @@ sealed class QueryCondition : FilterElementRow { return completeLabel } - override fun labelForValue(value: String, context: Context): String { - return value + override fun labelForValue(value: Double, context: Context): String { + return value.toString() } override fun updateValueBy(filterCondition: FilterCondition) { @@ -569,8 +569,8 @@ sealed class QueryCondition : FilterElementRow { } class CustomFieldAmountQuery : CustomFieldNumberQuery() { - override fun labelForValue(value: String, context: Context): String { - return value.toDouble().toCurrency(UserDefaults.currency) + override fun labelForValue(value: Double, context: Context): String { + return value.toCurrency(UserDefaults.currency) } } @@ -691,6 +691,10 @@ sealed class QueryCondition : FilterElementRow { } } + if (this is ListOfValues<*>) { + if (this.listOfValues.isEmpty()) return realmQuery + } + return when (operator) { Operator.EQUALS -> { when (this) { 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 bb59dd3c..a274f554 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 @@ -108,6 +108,7 @@ class PokerAnalyticsMigration : RealmMigration { 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.addField("numericValue", Double::class.java).setNullable("numericValue", true) } schema.get("CustomField")?.let { it.addField("type", Integer::class.java).setNullable("type", false) 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 9d7379d9..15dcfc56 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 @@ -135,7 +135,7 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa get() { return when (type) { Type.LIST.uniqueIdentifier -> BottomSheetType.LIST_STATIC - else -> BottomSheetType.EDIT_TEXT + else -> BottomSheetType.NUMERIC_TEXT } } @@ -167,7 +167,7 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa ) } else -> { - val defaultValue: String? by map + val defaultValue: Double? by map arrayListOf( RowRepresentableEditDescriptor( defaultValue, inputType = InputType.TYPE_CLASS_NUMBER 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 ff8ead6b..a49cb5ac 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 @@ -29,6 +29,7 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable { var customField: CustomField? = null var value: String = "" + var numericValue: Double? = null override var name: String = value get() { return value } @@ -62,9 +63,9 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable { override fun editingDescriptors(map: Map): ArrayList? { val defaultValue: Any? by map - return arrayListOf( - RowRepresentableEditDescriptor(defaultValue, R.string.value, InputType.TYPE_CLASS_TEXT) - ) + return arrayListOf( + RowRepresentableEditDescriptor(defaultValue, R.string.value, InputType.TYPE_CLASS_TEXT) + ) } override fun isValidForSave(): Boolean { @@ -91,8 +92,8 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable { } override fun updateValue(value: Any?, row: RowRepresentable) { - this.value = value as String? ?: "" - } + this.value = value as String? ?: "" + } override fun isValidForDelete(context: Context, realm: Realm): Boolean { if (realm.where().contains("customFieldEntries.id", id).findAll().isNotEmpty()) { @@ -107,12 +108,15 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable { fun getFormattedValue(currency: Currency? = null): String { return when (customField?.type) { CustomField.Type.AMOUNT.uniqueIdentifier -> { - try { - value.toDouble().toCurrency(currency) - } catch (e: Exception) { - NULL_TEXT - } + numericValue?.let { + it.toCurrency(currency) + } ?: run { NULL_TEXT } } + CustomField.Type.NUMBER.uniqueIdentifier -> { + numericValue?.let { + it.toString() + } ?: run { NULL_TEXT } + } else -> { value } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt index 35e8fba9..fe40468a 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt @@ -18,11 +18,10 @@ open class FilterCondition() : RealmObject() { val row = filterElementRows.first() this.filterName ?: throw PokerAnalyticsException.FilterElementUnknownName this.operator = row.operator.ordinal + if (row is QueryCondition.CustomFieldRelated) { + this.stringValue = row.customFieldId + } when (row) { - is QueryCondition.CustomFieldRelated -> { - this.setValues(filterElementRows.flatMap { (it as QueryCondition.ListOfString).listOfValues }) - this.stringValue = row.customFieldId - } is QueryCondition.SingleInt -> this.setValue(row.singleValue?:throw PokerAnalyticsException.FilterElementExpectedValueMissing) is QueryCondition.SingleDate -> this.setValue(row.singleValue?:throw PokerAnalyticsException.FilterElementExpectedValueMissing) is QueryCondition.ListOfDouble -> this.setValues(filterElementRows.flatMap { (it as QueryCondition.ListOfDouble).listOfValues }) 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 8de86f78..135b152e 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 @@ -108,7 +108,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat EndedToTime::class.java -> "endDateHourMinuteComponent" Duration::class.java -> "netDuration" CustomFieldListQuery::class.java -> "customFieldEntries.id" - CustomFieldAmountQuery::class.java, CustomFieldNumberQuery::class.java -> "customFieldEntries.value" + CustomFieldAmountQuery::class.java, CustomFieldNumberQuery::class.java -> "customFieldEntries.numericValue" CustomFieldQuery::class.java -> "customFieldEntries.customField.id" else -> null } @@ -890,7 +890,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat "data" to row.entries ) else -> mapOf( - "defaultValue" to customFieldEntries.find { it.customField?.id == row.id }?.value + "defaultValue" to customFieldEntries.find { it.customField?.id == row.id }?.numericValue ) } ) @@ -1025,7 +1025,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat if (value != null) { val customFieldEntry = CustomFieldEntry() customFieldEntry.customField = row - customFieldEntry.value = value.toString() + customFieldEntry.numericValue = value as Double? customFieldEntries.add(customFieldEntry) } }