|
|
|
|
@ -1,6 +1,7 @@ |
|
|
|
|
package net.pokeranalytics.android.model.filter |
|
|
|
|
|
|
|
|
|
import android.content.Context |
|
|
|
|
import com.ibm.icu.text.RuleBasedNumberFormat |
|
|
|
|
import io.realm.Realm |
|
|
|
|
import io.realm.RealmQuery |
|
|
|
|
import io.realm.RealmResults |
|
|
|
|
@ -113,52 +114,58 @@ sealed class QueryCondition : FilterElementRow { |
|
|
|
|
abstract var listOfValues: ArrayList<T> |
|
|
|
|
abstract fun labelForValue(value:T, context: Context): String |
|
|
|
|
|
|
|
|
|
open fun entityName(context: Context): String { |
|
|
|
|
return baseId |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun getDisplayName(context: Context): String { |
|
|
|
|
val prefix = this.resId?.let { |
|
|
|
|
context.getString(it)+" " |
|
|
|
|
} ?: "" |
|
|
|
|
|
|
|
|
|
return when (listOfValues.size) { |
|
|
|
|
0 -> return NULL_TEXT |
|
|
|
|
1,2 -> listOfValues.map { labelForValue(it, context) }.joinToString(", ") |
|
|
|
|
else -> "${listOfValues.size} $baseId" |
|
|
|
|
1,2 -> prefix+ listOfValues.map { labelForValue(it, context) }.joinToString(", ") |
|
|
|
|
else -> "${listOfValues.size} $prefix ${entityName(context)}" |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun compareTo(other: ListOfValues<T>): Int { |
|
|
|
|
return listOfValues.sorted().first().compareTo(other.listOfValues.sorted().first()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fun firstValue(context:Context): String? { |
|
|
|
|
return this.listOfValues.firstOrNull()?.let { this.labelForValue(it, context) } |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
abstract class SingleValue<T>: ListOfValues<T>() where T:Comparable<T> { |
|
|
|
|
override var listOfValues = ArrayList<T>() |
|
|
|
|
abstract var singleValue : T |
|
|
|
|
abstract var singleValue : T? |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
abstract class ListOfDouble: ListOfValues<Double>() { |
|
|
|
|
open var sign: Int = 1 |
|
|
|
|
override var operator: Operator = Operator.ANY |
|
|
|
|
override var listOfValues = arrayListOf(0.0) |
|
|
|
|
override var listOfValues : ArrayList<Double> = arrayListOf() |
|
|
|
|
override fun updateValueBy(filterCondition: FilterCondition) { |
|
|
|
|
super.updateValueBy(filterCondition) |
|
|
|
|
listOfValues = filterCondition.getValues() |
|
|
|
|
} |
|
|
|
|
override fun labelForValue(value: Double, context: Context): String { |
|
|
|
|
val prefix = this.resId?.let { |
|
|
|
|
context.getString(it)+" " |
|
|
|
|
} ?: "" |
|
|
|
|
return prefix+value.toCurrency(UserDefaults.currency) |
|
|
|
|
return value.toCurrency(UserDefaults.currency) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
abstract class ListOfInt: ListOfValues<Int>() { |
|
|
|
|
override var operator: Operator = Operator.ANY |
|
|
|
|
override var listOfValues = arrayListOf(0) |
|
|
|
|
override var listOfValues : ArrayList<Int> = arrayListOf() |
|
|
|
|
override fun updateValueBy(filterCondition: FilterCondition) { |
|
|
|
|
super.updateValueBy(filterCondition) |
|
|
|
|
listOfValues = filterCondition.getValues() |
|
|
|
|
} |
|
|
|
|
override fun labelForValue(value: Int, context: Context): String { |
|
|
|
|
val prefix = this.resId?.let { |
|
|
|
|
context.getString(it)+" " |
|
|
|
|
} ?: "" |
|
|
|
|
return prefix+value.toString() |
|
|
|
|
return value.toString() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -174,19 +181,16 @@ sealed class QueryCondition : FilterElementRow { |
|
|
|
|
|
|
|
|
|
abstract class SingleDate: SingleValue<Date>() { |
|
|
|
|
override fun labelForValue(value: Date, context: Context): String { |
|
|
|
|
val prefix = this.resId?.let { |
|
|
|
|
context.getString(it)+" " |
|
|
|
|
} ?: "" |
|
|
|
|
return prefix+value.shortDate() |
|
|
|
|
return value.shortDate() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override var listOfValues = ArrayList<Date>() |
|
|
|
|
|
|
|
|
|
override var singleValue: Date |
|
|
|
|
get() { return listOfValues.firstOrNull() ?: Date() } |
|
|
|
|
override var singleValue: Date? |
|
|
|
|
get() { return listOfValues.firstOrNull() } |
|
|
|
|
set(value) { |
|
|
|
|
listOfValues.removeAll(this.listOfValues) |
|
|
|
|
listOfValues.add(value) |
|
|
|
|
value?.let { listOfValues.add(it) } |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun updateValueBy(filterCondition: FilterCondition) { |
|
|
|
|
@ -197,17 +201,14 @@ sealed class QueryCondition : FilterElementRow { |
|
|
|
|
|
|
|
|
|
abstract class SingleInt: SingleValue<Int>() { |
|
|
|
|
override fun labelForValue(value: Int, context: Context): String { |
|
|
|
|
val prefix = this.resId?.let { |
|
|
|
|
context.getString(it)+" " |
|
|
|
|
} ?: "" |
|
|
|
|
return prefix+value.toString() |
|
|
|
|
return value.toString() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override var singleValue: Int |
|
|
|
|
get() { return listOfValues.firstOrNull() ?: 0 } |
|
|
|
|
override var singleValue: Int? |
|
|
|
|
get() { return listOfValues.firstOrNull() } |
|
|
|
|
set(value) { |
|
|
|
|
listOfValues.removeAll(this.listOfValues) |
|
|
|
|
listOfValues.add(value) |
|
|
|
|
value?.let { listOfValues.add(it) } |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun updateValueBy(filterCondition: FilterCondition) { |
|
|
|
|
@ -235,17 +236,22 @@ sealed class QueryCondition : FilterElementRow { |
|
|
|
|
|
|
|
|
|
override fun getDisplayName(context: Context): String { |
|
|
|
|
val realm = Realm.getDefaultInstance() |
|
|
|
|
val entityName = entityName(realm) |
|
|
|
|
val completeLabel = when (listOfValues.size) { |
|
|
|
|
0 -> return NULL_TEXT |
|
|
|
|
0 -> NULL_TEXT |
|
|
|
|
1,2 -> { |
|
|
|
|
return listOfValues.map { labelForValue(realm, it) }.joinToString(", ") |
|
|
|
|
listOfValues.map { labelForValue(realm, it) }.joinToString(", ") |
|
|
|
|
} |
|
|
|
|
else -> "${listOfValues.size} $baseId" |
|
|
|
|
else -> "${listOfValues.size} $entityName" |
|
|
|
|
} |
|
|
|
|
realm.close() |
|
|
|
|
return completeLabel |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
open fun entityName(realm: Realm): String { |
|
|
|
|
return baseId |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private fun labelForValue(realm:Realm, value:String): String { |
|
|
|
|
val query = realm.where(entity) |
|
|
|
|
return query.equalTo("id", value).findFirst()?.name ?: NULL_TEXT |
|
|
|
|
@ -260,6 +266,15 @@ sealed class QueryCondition : FilterElementRow { |
|
|
|
|
abstract class DateQuery: SingleDate(), DateTime { |
|
|
|
|
override val showTime: Boolean = false |
|
|
|
|
|
|
|
|
|
override fun labelForValue(value: Date, context: Context): String { |
|
|
|
|
return singleValue?.let { |
|
|
|
|
if (showTime) { |
|
|
|
|
it.shortTime() |
|
|
|
|
} else { |
|
|
|
|
it.shortDate() |
|
|
|
|
} |
|
|
|
|
} ?: NULL_TEXT |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
abstract class TimeQuery: DateQuery() { |
|
|
|
|
@ -358,10 +373,11 @@ sealed class QueryCondition : FilterElementRow { |
|
|
|
|
|
|
|
|
|
class NumberOfTable: ListOfInt() { |
|
|
|
|
override fun labelForValue(value: Int, context: Context): String { |
|
|
|
|
val prefix = this.resId?.let { |
|
|
|
|
context.getString(it) + " " |
|
|
|
|
} ?: "" |
|
|
|
|
return prefix + value.toString() + " " + context.getString(R.string.tables) |
|
|
|
|
return value.toString() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun entityName(context: Context): String { |
|
|
|
|
return context.getString(R.string.number_of_tables) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -372,10 +388,7 @@ sealed class QueryCondition : FilterElementRow { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun labelForValue(value: Double, context: Context): String { |
|
|
|
|
val prefix = this.resId?.let { |
|
|
|
|
context.getString(it) + " " |
|
|
|
|
} ?: "" |
|
|
|
|
return prefix + value.toString() |
|
|
|
|
return value.toString() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -386,11 +399,8 @@ sealed class QueryCondition : FilterElementRow { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun labelForValue(value: Int, context: Context): String { |
|
|
|
|
val prefix = this.resId?.let { |
|
|
|
|
context.getString(it) + " " |
|
|
|
|
} ?: "" |
|
|
|
|
//TODO add a int helper to display 1st, 2nd, 3rd, 4th, etc. |
|
|
|
|
return prefix + value.toString() |
|
|
|
|
val nf = RuleBasedNumberFormat(Locale.getDefault(), RuleBasedNumberFormat.ORDINAL) |
|
|
|
|
return nf.format(value) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -401,10 +411,11 @@ sealed class QueryCondition : FilterElementRow { |
|
|
|
|
|
|
|
|
|
class TournamentNumberOfPlayer: ListOfInt() { |
|
|
|
|
override fun labelForValue(value: Int, context: Context): String { |
|
|
|
|
val prefix = this.resId?.let { |
|
|
|
|
context.getString(it) + " " |
|
|
|
|
} ?: "" |
|
|
|
|
return prefix + value.toString() + context.getString(R.string.number_of_players) |
|
|
|
|
return value.toString() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun entityName(context: Context): String { |
|
|
|
|
return context.getString(R.string.number_of_players) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -450,10 +461,7 @@ sealed class QueryCondition : FilterElementRow { |
|
|
|
|
|
|
|
|
|
class TournamentFee: ListOfDouble() { |
|
|
|
|
override fun labelForValue(value: Double, context: Context): String { |
|
|
|
|
val prefix = this.resId?.let { |
|
|
|
|
context.getString(it)+" " |
|
|
|
|
} ?: "" |
|
|
|
|
return prefix+value.toCurrency(UserDefaults.currency) |
|
|
|
|
return value.toCurrency(UserDefaults.currency) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -462,52 +470,118 @@ sealed class QueryCondition : FilterElementRow { |
|
|
|
|
override val viewType: Int = RowViewType.TITLE_VALUE_CHECK.ordinal |
|
|
|
|
|
|
|
|
|
override fun labelForValue(value: Int, context: Context): String { |
|
|
|
|
val suffix = this.resId?.let { |
|
|
|
|
return value.toString() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun entityName(context: Context): String { |
|
|
|
|
return this.resId?.let { |
|
|
|
|
" "+context.getString(it) |
|
|
|
|
} ?: "" |
|
|
|
|
return value.toString() + suffix |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
class Duration: SingleInt() { |
|
|
|
|
override var operator = Operator.EQUALS |
|
|
|
|
var minutes:Int |
|
|
|
|
var minutes:Int? |
|
|
|
|
get() { return singleValue } |
|
|
|
|
set(value) { listOfValues = arrayListOf(value) } |
|
|
|
|
set(value) { singleValue = value } |
|
|
|
|
|
|
|
|
|
override val viewType: Int = RowViewType.TITLE_VALUE_CHECK.ordinal |
|
|
|
|
override val bottomSheetType: BottomSheetType = BottomSheetType.DOUBLE_EDIT_TEXT |
|
|
|
|
|
|
|
|
|
override fun labelForValue(value: Int, context: Context): String { |
|
|
|
|
val nf = RuleBasedNumberFormat(Locale.getDefault(), RuleBasedNumberFormat.DURATION) |
|
|
|
|
return nf.format(value.toDouble()) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
class StartedFromTime(startTime:Date = Date().startOfDay()): TimeQuery() { |
|
|
|
|
class StartedFromTime: TimeQuery() { |
|
|
|
|
override var operator = Operator.MORE |
|
|
|
|
init { |
|
|
|
|
this.listOfValues = arrayListOf(startTime) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
class EndedToTime(endTime:Date = Date().endOfDay()): TimeQuery() { |
|
|
|
|
class EndedToTime: TimeQuery() { |
|
|
|
|
override var operator = Operator.LESS |
|
|
|
|
init { |
|
|
|
|
this.listOfValues = arrayListOf(endTime) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
interface CustomFieldQuery { |
|
|
|
|
interface CustomFieldRelated { |
|
|
|
|
var customFieldId : String? |
|
|
|
|
|
|
|
|
|
fun customFieldName(realm: Realm): String { |
|
|
|
|
val query = realm.where(CustomField::class.java) |
|
|
|
|
val name = query.equalTo("id", customFieldId).findFirst()?.name |
|
|
|
|
return name?.let { |
|
|
|
|
"$it " |
|
|
|
|
} ?: run { "" } |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
class CustomFieldQuery() : QueryDataCondition<CustomField>() { |
|
|
|
|
override var entity: Class<CustomField> = CustomField::class.java |
|
|
|
|
constructor(customField: CustomField): this() { |
|
|
|
|
this.setObject(customField) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
class CustomFieldNumberQuery : ListOfDouble(), CustomFieldQuery { |
|
|
|
|
open class CustomFieldNumberQuery() : ListOfString(), CustomFieldRelated { |
|
|
|
|
override var customFieldId : String? = null |
|
|
|
|
override var operator: Operator = Operator.EQUALS |
|
|
|
|
constructor(customFieldId: String, value: Double): this() { |
|
|
|
|
this.listOfValues = arrayListOf(value.toString()) |
|
|
|
|
this.customFieldId = customFieldId |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun getDisplayName(context: Context): String { |
|
|
|
|
val realm = Realm.getDefaultInstance() |
|
|
|
|
val name = customFieldName(realm) |
|
|
|
|
val prefix = this.resId?.let { |
|
|
|
|
context.getString(it)+" " |
|
|
|
|
} ?: "" |
|
|
|
|
|
|
|
|
|
val completeLabel = when (listOfValues.size) { |
|
|
|
|
0 -> return NULL_TEXT |
|
|
|
|
1,2 -> { |
|
|
|
|
return name+prefix+listOfValues.map { labelForValue(it, context) }.joinToString(", ") |
|
|
|
|
} |
|
|
|
|
else -> "${listOfValues.size} $prefix $name" |
|
|
|
|
} |
|
|
|
|
realm.close() |
|
|
|
|
return completeLabel |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun labelForValue(value: String, context: Context): String { |
|
|
|
|
return value |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun updateValueBy(filterCondition: FilterCondition) { |
|
|
|
|
super.updateValueBy(filterCondition) |
|
|
|
|
listOfValues = filterCondition.getValues() |
|
|
|
|
customFieldId = filterCondition.stringValue |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
class CustomFieldAmountQuery : CustomFieldNumberQuery() { |
|
|
|
|
override fun labelForValue(value: String, context: Context): String { |
|
|
|
|
return value.toDouble().toCurrency(UserDefaults.currency) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
class CustomFieldListQuery() : QueryDataCondition<CustomFieldEntry>(), CustomFieldQuery { |
|
|
|
|
class CustomFieldListQuery() : QueryDataCondition<CustomFieldEntry>(), CustomFieldRelated { |
|
|
|
|
override var entity: Class<CustomFieldEntry> = CustomFieldEntry::class.java |
|
|
|
|
override var customFieldId : String? = null |
|
|
|
|
constructor(customFieldEntry: CustomFieldEntry): this() { |
|
|
|
|
this.setObject(customFieldEntry) |
|
|
|
|
this.customFieldId = customFieldEntry.customField?.id |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun entityName(realm: Realm): String { |
|
|
|
|
return customFieldName(realm) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun updateValueBy(filterCondition: FilterCondition) { |
|
|
|
|
super.updateValueBy(filterCondition) |
|
|
|
|
listOfValues = filterCondition.getValues() |
|
|
|
|
customFieldId = filterCondition.stringValue |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
@ -550,11 +624,14 @@ sealed class QueryCondition : FilterElementRow { |
|
|
|
|
return realmQuery.greaterThanOrEqualTo(fieldName, calendar.time.startOfDay()).and().lessThanOrEqualTo(fieldName, calendar.time.endOfDay()) |
|
|
|
|
} |
|
|
|
|
is PastDay -> { |
|
|
|
|
val startDate = Date() |
|
|
|
|
val calendar = Calendar.getInstance() |
|
|
|
|
calendar.time = startDate |
|
|
|
|
calendar.add(Calendar.DAY_OF_YEAR, -singleValue) |
|
|
|
|
return realmQuery.greaterThanOrEqualTo(fieldName, calendar.time.startOfDay()).and().lessThanOrEqualTo(fieldName, startDate.endOfDay()) |
|
|
|
|
singleValue?.let { |
|
|
|
|
val startDate = Date() |
|
|
|
|
val calendar = Calendar.getInstance() |
|
|
|
|
calendar.time = startDate |
|
|
|
|
calendar.add(Calendar.DAY_OF_YEAR, -it) |
|
|
|
|
return realmQuery.greaterThanOrEqualTo(fieldName, calendar.time.startOfDay()).and().lessThanOrEqualTo(fieldName, startDate.endOfDay()) |
|
|
|
|
} |
|
|
|
|
return realmQuery |
|
|
|
|
} |
|
|
|
|
is DuringThisWeek -> { |
|
|
|
|
val startDate = Date() |
|
|
|
|
@ -599,11 +676,17 @@ sealed class QueryCondition : FilterElementRow { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (this is CustomFieldRelated) { |
|
|
|
|
FilterHelper.fieldNameForQueryType<T>(CustomFieldQuery::class.java)?.let { |
|
|
|
|
realmQuery.equalTo(it, customFieldId) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return when (operator) { |
|
|
|
|
Operator.EQUALS -> { |
|
|
|
|
when (this) { |
|
|
|
|
is SingleDate -> realmQuery.equalTo(fieldName, singleValue) |
|
|
|
|
is SingleInt -> realmQuery.equalTo(fieldName, singleValue) |
|
|
|
|
is SingleDate -> realmQuery.equalTo(fieldName, singleValue?:throw PokerAnalyticsException.FilterElementExpectedValueMissing) |
|
|
|
|
is SingleInt -> realmQuery.equalTo(fieldName, singleValue?:throw PokerAnalyticsException.FilterElementExpectedValueMissing) |
|
|
|
|
is ListOfInt -> realmQuery.equalTo(fieldName, listOfValues.first()) |
|
|
|
|
is ListOfDouble -> realmQuery.equalTo(fieldName, listOfValues.first() * sign) |
|
|
|
|
is ListOfString -> realmQuery.equalTo(fieldName, listOfValues.first()) |
|
|
|
|
@ -612,8 +695,8 @@ sealed class QueryCondition : FilterElementRow { |
|
|
|
|
} |
|
|
|
|
Operator.MORE -> { |
|
|
|
|
when (this) { |
|
|
|
|
is SingleDate -> realmQuery.greaterThanOrEqualTo(fieldName, singleValue) |
|
|
|
|
is SingleInt -> realmQuery.greaterThanOrEqualTo(fieldName, singleValue) |
|
|
|
|
is SingleDate -> realmQuery.greaterThanOrEqualTo(fieldName, singleValue?:throw PokerAnalyticsException.FilterElementExpectedValueMissing) |
|
|
|
|
is SingleInt -> realmQuery.greaterThanOrEqualTo(fieldName, singleValue?:throw PokerAnalyticsException.FilterElementExpectedValueMissing) |
|
|
|
|
is ListOfInt -> realmQuery.greaterThanOrEqualTo(fieldName, listOfValues.first()) |
|
|
|
|
is ListOfDouble -> realmQuery.greaterThanOrEqualTo(fieldName, listOfValues.first() * sign) |
|
|
|
|
else -> realmQuery |
|
|
|
|
@ -621,8 +704,8 @@ sealed class QueryCondition : FilterElementRow { |
|
|
|
|
} |
|
|
|
|
Operator.LESS -> { |
|
|
|
|
when (this) { |
|
|
|
|
is SingleDate -> realmQuery.lessThanOrEqualTo(fieldName, singleValue) |
|
|
|
|
is SingleInt -> realmQuery.lessThanOrEqualTo(fieldName, singleValue) |
|
|
|
|
is SingleDate -> realmQuery.lessThanOrEqualTo(fieldName, singleValue?:throw PokerAnalyticsException.FilterElementExpectedValueMissing) |
|
|
|
|
is SingleInt -> realmQuery.lessThanOrEqualTo(fieldName, singleValue?:throw PokerAnalyticsException.FilterElementExpectedValueMissing) |
|
|
|
|
is ListOfInt -> realmQuery.lessThanOrEqualTo(fieldName, listOfValues.first()) |
|
|
|
|
is ListOfDouble -> realmQuery.lessThanOrEqualTo(fieldName, listOfValues.first() * sign) |
|
|
|
|
else -> realmQuery |
|
|
|
|
|