From 8c186d3cf3d79ba075bb4700c650f933372ec9b4 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 27 May 2019 13:53:22 +0200 Subject: [PATCH] Added Custom Fields to comparators --- .../pokeranalytics/android/model/Criteria.kt | 79 +++++++++++-------- .../ui/fragment/ReportCreationFragment.kt | 51 ++++++++++-- .../view/rowrepresentable/FilterSectionRow.kt | 1 - 3 files changed, 92 insertions(+), 39 deletions(-) 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 6af0cf14..5133ab5c 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt @@ -16,7 +16,6 @@ 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 @@ -61,21 +60,22 @@ 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.customField.id).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.customFieldId).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,22 +84,25 @@ 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.customField.id).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.customField.id - 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.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) } + } + } QueryCondition.distinct()?.let { val values = it.mapNotNull { session -> @@ -155,8 +158,13 @@ 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(var customField: CustomField) : RealmCriteria(21) - data class ValueCustomFields(var customField: CustomField) : ListCriteria(22) + 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 + } val queries: List get() { @@ -230,7 +238,7 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row years } is Blinds -> comparison() - is ListCustomFields -> comparison() + is ListCustomFields -> comparison() else -> throw PokerAnalyticsException.QueryTypeUnhandled } } @@ -255,8 +263,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 } } @@ -308,3 +316,8 @@ 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/ui/fragment/ReportCreationFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt index 33266a4d..7c14d5e2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt @@ -11,6 +11,8 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.Criteria +import net.pokeranalytics.android.model.CustomFieldCriteria +import net.pokeranalytics.android.model.realm.CustomField import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.ui.activity.FiltersActivity import net.pokeranalytics.android.ui.activity.ReportCreationActivity @@ -23,6 +25,7 @@ import net.pokeranalytics.android.ui.interfaces.FilterableType import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.SeparatorRow import net.pokeranalytics.android.util.extensions.sorted class ReportCreationFragment : RealmFragment(), RowRepresentableDataSource, RowRepresentableDelegate { @@ -68,7 +71,11 @@ class ReportCreationFragment : RealmFragment(), RowRepresentableDataSource, RowR when (item?.itemId) { R.id.add -> { if (this.assistant.step == Assistant.Step.FILTER) { - FiltersActivity.newInstanceForResult(this, currentFilterable = FilterableType.SESSION, hideMostUsedFilters = true) + FiltersActivity.newInstanceForResult( + this, + currentFilterable = FilterableType.SESSION, + hideMostUsedFilters = true + ) } } } @@ -238,7 +245,22 @@ class Assistant { } } Step.COMPARATOR -> { - val comparator = this.dataSource[position] as Criteria + val item = this.dataSource[position] + + val comparator = when (item) { + is CustomField -> { + val criteria: Criteria = when (item.type) { + CustomField.Type.LIST.ordinal -> Criteria.ListCustomFields(item) + else -> Criteria.ValueCustomFields(item) + } + criteria + } + is Criteria -> item + else -> { + throw IllegalStateException("Unmanaged data type: $item") + } + } + if (this.comparators.contains(comparator)) { this.comparators.remove(comparator) } else { @@ -257,7 +279,17 @@ class Assistant { fun isSelected(row: RowRepresentable): Boolean { return when (this.step) { Step.STAT -> this.stats.contains(row as Stat) - Step.COMPARATOR -> this.comparators.contains(row as Criteria) + Step.COMPARATOR -> { + when (row) { + is Criteria -> this.comparators.contains(row) + is CustomField -> { + val cfCriteria = this.comparators.filterIsInstance() + val cfCriterion = cfCriteria.firstOrNull { it.customField == row } + return cfCriterion != null + } + else -> false + } + } Step.FILTER -> this.filter == row else -> false } @@ -308,9 +340,18 @@ class Assistant { else -> Stat.userSelectableList } } - Step.COMPARATOR -> Criteria.all + Step.COMPARATOR -> { + val list = mutableListOf() + + val realm = Realm.getDefaultInstance() + val customFields = realm.sorted() + list.addAll(customFields) + list.add(SeparatorRow()) + list.addAll(Criteria.all) + realm.close() + return list + } Step.FILTER -> { - val data = ArrayList() val realm = Realm.getDefaultInstance() val filters = realm.sorted(Filter::class.java) realm.close() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt index 414a73bc..c26f29fd 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt @@ -6,7 +6,6 @@ import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.model.Criteria import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.mapFirstCondition -import net.pokeranalytics.android.model.realm.CustomField import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType