Manages custom field comparator

dev
Laurent 7 years ago
parent 32182a7687
commit f548bf24c6
  1. 43
      app/src/main/java/net/pokeranalytics/android/model/Criteria.kt
  2. 1
      app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt
  3. 15
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt
  4. 19
      app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt
  5. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt
  6. 8
      app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt
  7. 12
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.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<Query>
get() {
@ -249,11 +242,14 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row
is Blinds -> comparison<QueryCondition.AnyBlind, String>()
is ListCustomFields -> comparison<CustomFieldEntry>()
is ValueCustomFields -> {
when (customFieldType) {
val realm = Realm.getDefaultInstance()
val queries = when (this.customFieldType(realm)) {
CustomField.Type.AMOUNT.uniqueIdentifier -> comparison<QueryCondition.CustomFieldAmountQuery, Double >()
CustomField.Type.NUMBER.uniqueIdentifier -> comparison<QueryCondition.CustomFieldNumberQuery, Double >()
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<Criteria> {
return all.toTypedArray()
}
val all: List<Criteria>
get() {
return listOf(
@ -323,17 +324,19 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row
AllMonthsUpToNow, Blinds, TournamentFees
)
}
// SavableEnum
override fun valuesInternal(): Array<Criteria> {
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
}
}

@ -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 ->

@ -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<CustomFieldEntry>().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)
}
}
}

@ -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<Int> = RealmList()
/**
* An optional list of custom fields ids to be compared
*/
var criteriaCustomFieldIds: RealmList<String> = 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<CustomField>(it) }
val cfCriteria = customFields.map { it.criteria }
val allCriteria = mutableListOf<Criteria>()
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

@ -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
}

@ -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

@ -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<QueryCondition.CustomFieldAmountQuery>().apply {
this.forEach {
it.customFieldId = this@FilterSectionRow.customField.id
it.customFieldId = cf.id
}
}
} else {
QueryCondition.moreOrLess<QueryCondition.CustomFieldNumberQuery>().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
}
}
}

Loading…
Cancel
Save