Added Custom Fields to comparators

dev
Laurent 7 years ago
parent 3aa289525d
commit 8c186d3cf3
  1. 79
      app/src/main/java/net/pokeranalytics/android/model/Criteria.kt
  2. 51
      app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt
  3. 1
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.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.TournamentNames.comparison
import net.pokeranalytics.android.model.Criteria.TournamentTypes.comparison import net.pokeranalytics.android.model.Criteria.TournamentTypes.comparison
import net.pokeranalytics.android.model.Criteria.TransactionTypes.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.Query
import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.interfaces.NameManageable 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) { abstract class RealmCriteria(uniqueIdentifier: Int) : Criteria(uniqueIdentifier) {
inline fun <reified T : NameManageable> comparison(): List<Query> { inline fun <reified T : NameManageable> comparison(): List<Query> {
if (this is ListCustomFields) { if (this is ListCustomFields) {
val objects = mutableListOf<QueryCondition.CustomFieldListQuery>() val objects = mutableListOf<QueryCondition.CustomFieldListQuery>()
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
realm.where<CustomFieldEntry>().equalTo("customField.id", this.customField.id).findAll().forEach { realm.where<CustomFieldEntry>().equalTo("customField.id", this.customFieldId).findAll().forEach {
objects.add(QueryCondition.CustomFieldListQuery(it)) objects.add(QueryCondition.CustomFieldListQuery(it))
} }
objects.sorted() objects.sorted()
realm.close() realm.close()
return objects.map { Query(it) } return objects.map { Query(it) }
} }
return compare<QueryCondition.QueryDataCondition<NameManageable>, T>() return compare<QueryCondition.QueryDataCondition<NameManageable>, T>()
} }
} }
abstract class SimpleCriteria(private val conditions: List<QueryCondition>, uniqueIdentifier: Int) : Criteria(uniqueIdentifier) { abstract class SimpleCriteria(private val conditions: List<QueryCondition>, uniqueIdentifier: Int) :
Criteria(uniqueIdentifier) {
fun comparison(): List<Query> { fun comparison(): List<Query> {
return conditions.map { Query(it) } 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) { abstract class ListCriteria(uniqueIdentifier: Int) : Criteria(uniqueIdentifier) {
inline fun <reified T : QueryCondition.ListOfValues<S>, reified S : Comparable<S>> comparison(): List<Query> { inline fun <reified T : QueryCondition.ListOfValues<S>, reified S : Comparable<S>> comparison(): List<Query> {
if (this is ValueCustomFields) { if (this is ValueCustomFields) {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
val distincts = realm.where<CustomFieldEntry>().equalTo("customField.id", this.customField.id).distinct("value").findAll().sort("value", Sort.ASCENDING) val distincts =
realm.close() realm.where<CustomFieldEntry>().equalTo("customField.id", this.customFieldId).distinct("value")
.findAll().sort("value", Sort.ASCENDING)
val objects = mutableListOf<QueryCondition.CustomFieldNumberQuery>() realm.close()
distincts.distinct().forEach {
val condition: QueryCondition.CustomFieldNumberQuery = QueryCondition.CustomFieldNumberQuery().apply { val objects = mutableListOf<QueryCondition.CustomFieldNumberQuery>()
this.customFieldId = this@ListCriteria.customField.id distincts.distinct().forEach {
listOfValues = arrayListOf(it.value) val condition: QueryCondition.CustomFieldNumberQuery =
} QueryCondition.CustomFieldNumberQuery().apply {
objects.add(condition) this.customFieldId = this@ListCriteria.customFieldId
objects.sorted() listOfValues = arrayListOf(it.value)
return objects.map { Query(it) } }
} objects.add(condition)
} objects.sorted()
return objects.map { Query(it) }
}
}
QueryCondition.distinct<Session, T, S>()?.let { QueryCondition.distinct<Session, T, S>()?.let {
val values = it.mapNotNull { session -> val values = it.mapNotNull { session ->
@ -155,8 +158,13 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row
object TournamentFees : ListCriteria(18) object TournamentFees : ListCriteria(18)
object Cash : SimpleCriteria(listOf(QueryCondition.IsCash), 19) object Cash : SimpleCriteria(listOf(QueryCondition.IsCash), 19)
object Tournament : SimpleCriteria(listOf(QueryCondition.IsTournament), 20) object Tournament : SimpleCriteria(listOf(QueryCondition.IsTournament), 20)
data class ListCustomFields(var customField: CustomField) : RealmCriteria(21) data class ListCustomFields(override var customField: CustomField) : RealmCriteria(21), CustomFieldCriteria {
data class ValueCustomFields(var customField: CustomField) : ListCriteria(22) 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<Query> val queries: List<Query>
get() { get() {
@ -230,7 +238,7 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row
years years
} }
is Blinds -> comparison<QueryCondition.AnyBlind, String>() is Blinds -> comparison<QueryCondition.AnyBlind, String>()
is ListCustomFields -> comparison<CustomFieldEntry>() is ListCustomFields -> comparison<CustomFieldEntry>()
else -> throw PokerAnalyticsException.QueryTypeUnhandled else -> throw PokerAnalyticsException.QueryTypeUnhandled
} }
} }
@ -255,8 +263,8 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row
AllMonthsUpToNow -> R.string.month AllMonthsUpToNow -> R.string.month
Blinds -> R.string.blind Blinds -> R.string.blind
TournamentFees -> R.string.entry_fees TournamentFees -> R.string.entry_fees
is ListCustomFields -> this.customField.resId is ListCustomFields -> this.customField.resId
is ValueCustomFields -> this.customField.resId is ValueCustomFields -> this.customField.resId
else -> null else -> null
} }
} }
@ -308,3 +316,8 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row
} }
interface CustomFieldCriteria {
var customField: CustomField
var customFieldId: String
}

@ -11,6 +11,8 @@ import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.Criteria 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.model.realm.Filter
import net.pokeranalytics.android.ui.activity.FiltersActivity import net.pokeranalytics.android.ui.activity.FiltersActivity
import net.pokeranalytics.android.ui.activity.ReportCreationActivity 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.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.SeparatorRow
import net.pokeranalytics.android.util.extensions.sorted import net.pokeranalytics.android.util.extensions.sorted
class ReportCreationFragment : RealmFragment(), RowRepresentableDataSource, RowRepresentableDelegate { class ReportCreationFragment : RealmFragment(), RowRepresentableDataSource, RowRepresentableDelegate {
@ -68,7 +71,11 @@ class ReportCreationFragment : RealmFragment(), RowRepresentableDataSource, RowR
when (item?.itemId) { when (item?.itemId) {
R.id.add -> { R.id.add -> {
if (this.assistant.step == Assistant.Step.FILTER) { 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 -> { 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)) { if (this.comparators.contains(comparator)) {
this.comparators.remove(comparator) this.comparators.remove(comparator)
} else { } else {
@ -257,7 +279,17 @@ class Assistant {
fun isSelected(row: RowRepresentable): Boolean { fun isSelected(row: RowRepresentable): Boolean {
return when (this.step) { return when (this.step) {
Step.STAT -> this.stats.contains(row as Stat) 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<CustomFieldCriteria>()
val cfCriterion = cfCriteria.firstOrNull { it.customField == row }
return cfCriterion != null
}
else -> false
}
}
Step.FILTER -> this.filter == row Step.FILTER -> this.filter == row
else -> false else -> false
} }
@ -308,9 +340,18 @@ class Assistant {
else -> Stat.userSelectableList else -> Stat.userSelectableList
} }
} }
Step.COMPARATOR -> Criteria.all Step.COMPARATOR -> {
val list = mutableListOf<RowRepresentable>()
val realm = Realm.getDefaultInstance()
val customFields = realm.sorted<CustomField>()
list.addAll(customFields)
list.add(SeparatorRow())
list.addAll(Criteria.all)
realm.close()
return list
}
Step.FILTER -> { Step.FILTER -> {
val data = ArrayList<RowRepresentable>()
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
val filters = realm.sorted(Filter::class.java) val filters = realm.sorted(Filter::class.java)
realm.close() realm.close()

@ -6,7 +6,6 @@ import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.model.Criteria import net.pokeranalytics.android.model.Criteria
import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.filter.mapFirstCondition 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.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType

Loading…
Cancel
Save