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 d4f11e43..a9ebd134 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt @@ -96,7 +96,7 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row distincts.mapNotNull { it.numericValue }.distinct().forEach {value -> - val condition: QueryCondition.CustomFieldNumberQuery = when (this.customFieldType) { + val condition: QueryCondition.CustomFieldNumberQuery = when (this.customFieldType(realm)) { CustomField.Type.AMOUNT.uniqueIdentifier -> QueryCondition.CustomFieldNumberQuery() CustomField.Type.NUMBER.uniqueIdentifier -> QueryCondition.CustomFieldAmountQuery() else -> throw PokerAnalyticsException.QueryValueMapUnexpectedValue @@ -165,15 +165,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(var customField: CustomField) : RealmCriteria(21), CustomFieldCriteria { - override var customFieldId: String = customField.id - override var customFieldType: Int = customField.type - } - - data class ValueCustomFields(var customField: CustomField) : ListCriteria(22), CustomFieldCriteria { - override var customFieldId: String = customField.id - override var customFieldType: Int = customField.type - } + data class ListCustomFields(override var customFieldId: String) : RealmCriteria(21), CustomFieldCriteria + data class ValueCustomFields(override var customFieldId: String) : ListCriteria(22), CustomFieldCriteria val queries: List get() { @@ -249,11 +242,14 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row is Blinds -> comparison() is ListCustomFields -> comparison() is ValueCustomFields -> { - when (customFieldType) { + val realm = Realm.getDefaultInstance() + val queries = when (this.customFieldType(realm)) { CustomField.Type.AMOUNT.uniqueIdentifier -> comparison() CustomField.Type.NUMBER.uniqueIdentifier -> comparison() else -> throw PokerAnalyticsException.QueryTypeUnhandled } + realm.close() + queries } else -> throw PokerAnalyticsException.QueryTypeUnhandled } @@ -279,8 +275,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 } } @@ -313,6 +309,11 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row return objects.map { Query(it) } } + // SavableEnum + override fun valuesInternal(): Array { + return all.toTypedArray() + } + val all: List get() { return listOf( @@ -323,17 +324,19 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row AllMonthsUpToNow, Blinds, TournamentFees ) } - - // SavableEnum - override fun valuesInternal(): Array { - return all.toTypedArray() - } } - } interface CustomFieldCriteria { var customFieldId: String - var customFieldType: Int + + fun customField(realm: Realm) : CustomField { + return realm.findById(this.customFieldId) ?: throw IllegalStateException("Custom field not found") + } + + fun customFieldType(realm: Realm): Int { + return this.customField(realm).type + } + } \ No newline at end of file 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 c338dbc5..e7a82b7c 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 @@ -131,6 +131,7 @@ class PokerAnalyticsMigration : RealmMigration { schema.get("ReportSetup")?.let { it.addRealmListField("statIds", Int::class.java).setNullable("statIds", true) + it.addRealmListField("criteriaCustomFieldIds", String::class.java).setNullable("criteriaCustomFieldIds", true) it.addRealmListField("criteriaIds", Int::class.java).setNullable("criteriaIds", true) it.removeField("filters") schema.get("Filter")?.let { filterSchema -> 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 509a16dc..719c3656 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 @@ -9,6 +9,7 @@ import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey import io.realm.kotlin.where import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.Criteria import net.pokeranalytics.android.model.interfaces.DeleteValidityStatus import net.pokeranalytics.android.model.interfaces.NameManageable import net.pokeranalytics.android.model.interfaces.SaveValidityStatus @@ -207,7 +208,7 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa rows.add(SimpleRow.NAME) rows.add(CustomFieldRow.TYPE) - if (type == Type.LIST.ordinal && entries.size >= 0) { + if (type == Type.LIST.uniqueIdentifier && entries.size >= 0) { if (entries.isNotEmpty()) { rows.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, R.string.items_list)) sortEntries() @@ -271,6 +272,7 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa entries.clear() } + // @TODO entriesToDelete.forEach { Timber.d("Delete entry: ${it.value} / ${it.id}") realm.where().equalTo("id", it.id).findFirst()?.deleteFromRealm() @@ -279,4 +281,15 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa } } + /** + * Returns a comparison criteria based on this custom field + */ + val criteria: Criteria + get() { + return when (this.type) { + CustomField.Type.LIST.uniqueIdentifier -> Criteria.ListCustomFields(this.id) + else -> Criteria.ValueCustomFields(this.id) + } + } + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt index 82b996e8..2db6f02e 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt @@ -13,6 +13,7 @@ import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.interfaces.DeleteValidityStatus import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType +import net.pokeranalytics.android.util.extensions.findById import java.util.* @@ -38,6 +39,11 @@ open class ReportSetup : RealmObject(), RowRepresentable, Deletable { */ var criteriaIds: RealmList = RealmList() + /** + * An optional list of custom fields ids to be compared + */ + var criteriaCustomFieldIds: RealmList = RealmList() + /** * An optional filter to narrow the results */ @@ -56,12 +62,23 @@ open class ReportSetup : RealmObject(), RowRepresentable, Deletable { */ val options: Calculator.Options get() { + + val realm = Realm.getDefaultInstance() val stats = this.statIds.map { Stat.valueByIdentifier(it) } + + // Comparison criteria val criteria = this.criteriaIds.map { Criteria.valueByIdentifier(it) } + val customFields = this.criteriaCustomFieldIds.mapNotNull { realm.findById(it) } + val cfCriteria = customFields.map { it.criteria } + + val allCriteria = mutableListOf() + allCriteria.addAll(criteria) + allCriteria.addAll(cfCriteria) + return Calculator.Options( display = Calculator.Options.Display.values()[this.display], stats = stats, - criterias = criteria, + criterias = allCriteria, filter = this.filter, userGenerated = true, reportSetupId = this.id 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 4b99e03a..0584020b 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 @@ -257,8 +257,8 @@ class Assistant { val comparator = when (item) { is CustomField -> { val criteria: Criteria = when (item.type) { - CustomField.Type.LIST.ordinal -> Criteria.ListCustomFields(item) - else -> Criteria.ValueCustomFields(item) + CustomField.Type.LIST.ordinal -> Criteria.ListCustomFields(item.id) + else -> Criteria.ValueCustomFields(item.id) } criteria } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt index d89dafc6..65ac8674 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt @@ -7,6 +7,7 @@ import androidx.appcompat.app.AlertDialog import kotlinx.android.synthetic.main.fragment_progress_report.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Report +import net.pokeranalytics.android.model.CustomFieldCriteria import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.realm.ReportSetup import net.pokeranalytics.android.ui.fragment.data.DataManagerFragment @@ -84,8 +85,11 @@ abstract class AbstractReportFragment : DataManagerFragment() { options.stats.forEach { rs.statIds.add(it.uniqueIdentifier) } - options.criterias.forEach { - rs.criteriaIds.add(it.uniqueIdentifier) + options.criterias.forEach { criteria -> + when (criteria) { + is CustomFieldCriteria -> rs.criteriaCustomFieldIds.add(criteria.customFieldId) + else -> rs.criteriaIds.add(criteria.uniqueIdentifier) + } } options.filterId?.let { id -> String 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 c26f29fd..319eee8d 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 @@ -131,18 +131,19 @@ sealed class FilterSectionRow(override val resId: Int?) : RowRepresentable { } TransactionType -> Criteria.TransactionTypes.queryConditions.mapFirstCondition() is CustomField -> { - if (this@FilterSectionRow.customField.isListType) { - Criteria.ListCustomFields(this@FilterSectionRow.customField).queryConditions.mapFirstCondition() - } else if (this@FilterSectionRow.customField.isAmountType) { + val cf = this@FilterSectionRow.customField + if (cf.isListType) { + Criteria.ListCustomFields(cf.id).queryConditions.mapFirstCondition() + } else if (cf.isAmountType) { QueryCondition.moreOrLess().apply { this.forEach { - it.customFieldId = this@FilterSectionRow.customField.id + it.customFieldId = cf.id } } } else { QueryCondition.moreOrLess().apply { this.forEach { - it.customFieldId = this@FilterSectionRow.customField.id + it.customFieldId = cf.id } } } @@ -180,4 +181,5 @@ sealed class FilterSectionRow(override val resId: Int?) : RowRepresentable { else -> null } } + }