Merge branch 'dev' of gitlab.com:stax-river/poker-analytics into dev

dev
Laurent 7 years ago
commit 0cf6d6238e
  1. 81
      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. 24
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt
  7. 7
      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
@ -60,22 +61,21 @@ 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.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()
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) : 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) }
} }
@ -84,25 +84,24 @@ 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 = 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") realm.close()
.findAll().sort("value", Sort.ASCENDING)
realm.close() val objects = mutableListOf<QueryCondition.CustomFieldNumberQuery>()
distincts.distinct().mapNotNull {
val objects = mutableListOf<QueryCondition.CustomFieldNumberQuery>() it.numericValue
distincts.distinct().forEach { }.forEach {value ->
val condition: QueryCondition.CustomFieldNumberQuery = val condition: QueryCondition.CustomFieldNumberQuery = QueryCondition.CustomFieldNumberQuery().apply {
QueryCondition.CustomFieldNumberQuery().apply { this.customFieldId = this@ListCriteria.customField.id
this.customFieldId = this@ListCriteria.customFieldId listOfValues = arrayListOf(value)
listOfValues = arrayListOf(it.value) }
} objects.add(condition)
objects.add(condition) objects.sorted()
objects.sorted() return objects.map { Query(it) }
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 ->
@ -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() {
@ -238,7 +232,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
} }
} }
@ -263,8 +257,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
} }
} }
@ -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 }
@ -62,9 +63,9 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable {
override fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowRepresentableEditDescriptor>? { override fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowRepresentableEditDescriptor>? {
val defaultValue: Any? by map val defaultValue: Any? by map
return arrayListOf( return arrayListOf(
RowRepresentableEditDescriptor(defaultValue, R.string.value, InputType.TYPE_CLASS_TEXT) RowRepresentableEditDescriptor(defaultValue, R.string.value, InputType.TYPE_CLASS_TEXT)
) )
} }
override fun isValidForSave(): Boolean { override fun isValidForSave(): Boolean {
@ -91,8 +92,8 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable {
} }
override fun updateValue(value: Any?, row: RowRepresentable) { override fun updateValue(value: Any?, row: RowRepresentable) {
this.value = value as String? ?: "" this.value = value as String? ?: ""
} }
override fun isValidForDelete(context: Context, realm: Realm): Boolean { override fun isValidForDelete(context: Context, realm: Realm): Boolean {
if (realm.where<Session>().contains("customFieldEntries.id", id).findAll().isNotEmpty()) { if (realm.where<Session>().contains("customFieldEntries.id", id).findAll().isNotEmpty()) {
@ -107,12 +108,15 @@ 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
if (row is QueryCondition.CustomFieldRelated) {
this.stringValue = row.customFieldId
}
when (row) { when (row) {
is QueryCondition.CustomFieldRelated -> {
this.setValues(filterElementRows.flatMap { (it as QueryCondition.ListOfString).listOfValues })
this.stringValue = row.customFieldId
}
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