add a new numericValue to customFieldEntry to handle the numeric value type (amount & numeric)

fix issue with more / less filtering on custom field of type amount & numeric
dev
Razmig Sarkissian 7 years ago
parent f25644cc4a
commit 298cb671d1
  1. 35
      app/src/main/java/net/pokeranalytics/android/model/Criteria.kt
  2. 2
      app/src/main/java/net/pokeranalytics/android/model/filter/Query.kt
  3. 16
      app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt
  4. 1
      app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt
  5. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt
  6. 14
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt
  7. 5
      app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt
  8. 6
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.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.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
@ -63,7 +64,7 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row
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.customFieldId).findAll().forEach { realm.where<CustomFieldEntry>().equalTo("customField.id", this.customField.id).findAll().forEach {
objects.add(QueryCondition.CustomFieldListQuery(it)) objects.add(QueryCondition.CustomFieldListQuery(it))
} }
objects.sorted() objects.sorted()
@ -74,8 +75,7 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row
} }
} }
abstract class SimpleCriteria(private val conditions: List<QueryCondition>, uniqueIdentifier: Int) : abstract class SimpleCriteria(private val conditions: List<QueryCondition>, uniqueIdentifier: Int) : Criteria(uniqueIdentifier) {
Criteria(uniqueIdentifier) {
fun comparison(): List<Query> { fun comparison(): List<Query> {
return conditions.map { Query(it) } return conditions.map { Query(it) }
} }
@ -86,17 +86,16 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row
if (this is ValueCustomFields) { if (this is ValueCustomFields) {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
val distincts = val distincts = realm.where<CustomFieldEntry>().equalTo("customField.id", this.customField.id).distinct("numericValue").findAll().sort("numericValue", Sort.ASCENDING)
realm.where<CustomFieldEntry>().equalTo("customField.id", this.customFieldId).distinct("value")
.findAll().sort("value", Sort.ASCENDING)
realm.close() realm.close()
val objects = mutableListOf<QueryCondition.CustomFieldNumberQuery>() val objects = mutableListOf<QueryCondition.CustomFieldNumberQuery>()
distincts.distinct().forEach { distincts.distinct().mapNotNull {
val condition: QueryCondition.CustomFieldNumberQuery = it.numericValue
QueryCondition.CustomFieldNumberQuery().apply { }.forEach {value ->
this.customFieldId = this@ListCriteria.customFieldId val condition: QueryCondition.CustomFieldNumberQuery = QueryCondition.CustomFieldNumberQuery().apply {
listOfValues = arrayListOf(it.value) this.customFieldId = this@ListCriteria.customField.id
listOfValues = arrayListOf(value)
} }
objects.add(condition) objects.add(condition)
objects.sorted() objects.sorted()
@ -158,13 +157,8 @@ 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(override var customField: CustomField) : RealmCriteria(21), CustomFieldCriteria { data class ListCustomFields(var customField: CustomField) : RealmCriteria(21)
override var customFieldId: String = customField.id data class ValueCustomFields(var customField: CustomField) : ListCriteria(22)
}
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() {
@ -316,8 +310,3 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row
} }
interface CustomFieldCriteria {
var customField: CustomField
var customFieldId: String
}

@ -77,7 +77,7 @@ class Query {
} }
} }
// println("<<<<<< ${realmQuery.description}") //println("<<<<<< ${realmQuery}")
val queryLast = this.conditions.filter { val queryLast = this.conditions.filter {
it is QueryCondition.Last it is QueryCondition.Last
}.firstOrNull() }.firstOrNull()

@ -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 customFieldId : String? = null
override var operator: Operator = Operator.EQUALS override var operator: Operator = Operator.EQUALS
constructor(customFieldId: String, value: Double): this() { constructor(customFieldId: String, value: Double): this() {
this.listOfValues = arrayListOf(value.toString()) this.listOfValues = arrayListOf(value)
this.customFieldId = customFieldId this.customFieldId = customFieldId
} }
@ -557,8 +557,8 @@ sealed class QueryCondition : FilterElementRow {
return completeLabel return completeLabel
} }
override fun labelForValue(value: String, context: Context): String { override fun labelForValue(value: Double, context: Context): String {
return value return value.toString()
} }
override fun updateValueBy(filterCondition: FilterCondition) { override fun updateValueBy(filterCondition: FilterCondition) {
@ -569,8 +569,8 @@ sealed class QueryCondition : FilterElementRow {
} }
class CustomFieldAmountQuery : CustomFieldNumberQuery() { class CustomFieldAmountQuery : CustomFieldNumberQuery() {
override fun labelForValue(value: String, context: Context): String { override fun labelForValue(value: Double, context: Context): String {
return value.toDouble().toCurrency(UserDefaults.currency) 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) { return when (operator) {
Operator.EQUALS -> { Operator.EQUALS -> {
when (this) { when (this) {

@ -108,6 +108,7 @@ class PokerAnalyticsMigration : RealmMigration {
it.addField("value", String::class.java).setNullable("value", false) it.addField("value", String::class.java).setNullable("value", false)
it.addField("order", Integer::class.java).setNullable("order", false) it.addField("order", Integer::class.java).setNullable("order", false)
it.addField("customField", CustomField::class.java).setNullable("customField", false) it.addField("customField", CustomField::class.java).setNullable("customField", false)
it.addField("numericValue", Double::class.java).setNullable("numericValue", true)
} }
schema.get("CustomField")?.let { schema.get("CustomField")?.let {
it.addField("type", Integer::class.java).setNullable("type", false) it.addField("type", Integer::class.java).setNullable("type", false)

@ -135,7 +135,7 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
get() { get() {
return when (type) { return when (type) {
Type.LIST.uniqueIdentifier -> BottomSheetType.LIST_STATIC 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 -> { else -> {
val defaultValue: String? by map val defaultValue: Double? by map
arrayListOf( arrayListOf(
RowRepresentableEditDescriptor( RowRepresentableEditDescriptor(
defaultValue, inputType = InputType.TYPE_CLASS_NUMBER defaultValue, inputType = InputType.TYPE_CLASS_NUMBER

@ -29,6 +29,7 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable {
var customField: CustomField? = null var customField: CustomField? = null
var value: String = "" var value: String = ""
var numericValue: Double? = null
override var name: String = value override var name: String = value
get() { return value } get() { return value }
@ -107,11 +108,14 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable {
fun getFormattedValue(currency: Currency? = null): String { fun getFormattedValue(currency: Currency? = null): String {
return when (customField?.type) { return when (customField?.type) {
CustomField.Type.AMOUNT.uniqueIdentifier -> { CustomField.Type.AMOUNT.uniqueIdentifier -> {
try { numericValue?.let {
value.toDouble().toCurrency(currency) it.toCurrency(currency)
} catch (e: Exception) { } ?: run { NULL_TEXT }
NULL_TEXT }
} CustomField.Type.NUMBER.uniqueIdentifier -> {
numericValue?.let {
it.toString()
} ?: run { NULL_TEXT }
} }
else -> { else -> {
value value

@ -18,11 +18,10 @@ open class FilterCondition() : RealmObject() {
val row = filterElementRows.first() val row = filterElementRows.first()
this.filterName ?: throw PokerAnalyticsException.FilterElementUnknownName this.filterName ?: throw PokerAnalyticsException.FilterElementUnknownName
this.operator = row.operator.ordinal this.operator = row.operator.ordinal
when (row) { if (row is QueryCondition.CustomFieldRelated) {
is QueryCondition.CustomFieldRelated -> {
this.setValues(filterElementRows.flatMap { (it as QueryCondition.ListOfString).listOfValues })
this.stringValue = row.customFieldId this.stringValue = row.customFieldId
} }
when (row) {
is QueryCondition.SingleInt -> this.setValue(row.singleValue?:throw PokerAnalyticsException.FilterElementExpectedValueMissing) is QueryCondition.SingleInt -> this.setValue(row.singleValue?:throw PokerAnalyticsException.FilterElementExpectedValueMissing)
is QueryCondition.SingleDate -> 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 }) is QueryCondition.ListOfDouble -> this.setValues(filterElementRows.flatMap { (it as QueryCondition.ListOfDouble).listOfValues })

@ -108,7 +108,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
EndedToTime::class.java -> "endDateHourMinuteComponent" EndedToTime::class.java -> "endDateHourMinuteComponent"
Duration::class.java -> "netDuration" Duration::class.java -> "netDuration"
CustomFieldListQuery::class.java -> "customFieldEntries.id" 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" CustomFieldQuery::class.java -> "customFieldEntries.customField.id"
else -> null else -> null
} }
@ -890,7 +890,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
"data" to row.entries "data" to row.entries
) )
else -> mapOf( 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) { if (value != null) {
val customFieldEntry = CustomFieldEntry() val customFieldEntry = CustomFieldEntry()
customFieldEntry.customField = row customFieldEntry.customField = row
customFieldEntry.value = value.toString() customFieldEntry.numericValue = value as Double?
customFieldEntries.add(customFieldEntry) customFieldEntries.add(customFieldEntry)
} }
} }

Loading…
Cancel
Save