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.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
@ -63,7 +64,7 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row
if (this is ListCustomFields) {
val objects = mutableListOf<QueryCondition.CustomFieldListQuery>()
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.sorted()
@ -74,8 +75,7 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row
}
}
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> {
return conditions.map { Query(it) }
}
@ -86,17 +86,16 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row
if (this is ValueCustomFields) {
val realm = Realm.getDefaultInstance()
val distincts =
realm.where<CustomFieldEntry>().equalTo("customField.id", this.customFieldId).distinct("value")
.findAll().sort("value", Sort.ASCENDING)
val distincts = realm.where<CustomFieldEntry>().equalTo("customField.id", this.customField.id).distinct("numericValue").findAll().sort("numericValue", Sort.ASCENDING)
realm.close()
val objects = mutableListOf<QueryCondition.CustomFieldNumberQuery>()
distincts.distinct().forEach {
val condition: QueryCondition.CustomFieldNumberQuery =
QueryCondition.CustomFieldNumberQuery().apply {
this.customFieldId = this@ListCriteria.customFieldId
listOfValues = arrayListOf(it.value)
distincts.distinct().mapNotNull {
it.numericValue
}.forEach {value ->
val condition: QueryCondition.CustomFieldNumberQuery = QueryCondition.CustomFieldNumberQuery().apply {
this.customFieldId = this@ListCriteria.customField.id
listOfValues = arrayListOf(value)
}
objects.add(condition)
objects.sorted()
@ -158,13 +157,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(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
}
data class ListCustomFields(var customField: CustomField) : RealmCriteria(21)
data class ValueCustomFields(var customField: CustomField) : ListCriteria(22)
val queries: List<Query>
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 {
it is QueryCondition.Last
}.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 operator: Operator = Operator.EQUALS
constructor(customFieldId: String, value: Double): this() {
this.listOfValues = arrayListOf(value.toString())
this.listOfValues = arrayListOf(value)
this.customFieldId = customFieldId
}
@ -557,8 +557,8 @@ sealed class QueryCondition : FilterElementRow {
return completeLabel
}
override fun labelForValue(value: String, context: Context): String {
return value
override fun labelForValue(value: Double, context: Context): String {
return value.toString()
}
override fun updateValueBy(filterCondition: FilterCondition) {
@ -569,8 +569,8 @@ sealed class QueryCondition : FilterElementRow {
}
class CustomFieldAmountQuery : CustomFieldNumberQuery() {
override fun labelForValue(value: String, context: Context): String {
return value.toDouble().toCurrency(UserDefaults.currency)
override fun labelForValue(value: Double, context: Context): String {
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) {
Operator.EQUALS -> {
when (this) {

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

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

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

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

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

Loading…
Cancel
Save