parent
1381887dfd
commit
032c2aa7ae
@ -0,0 +1,76 @@ |
||||
package net.pokeranalytics.android.model.filter |
||||
|
||||
import io.realm.RealmQuery |
||||
import net.pokeranalytics.android.model.filter.interfaces.Filterable |
||||
import java.util.* |
||||
|
||||
enum class DateFilterable : Filterable { |
||||
STARTED_FROM_DATE, |
||||
STARTED_TO_DATE, |
||||
ENDED_FROM_DATE, |
||||
ENDED_TO_DATE, |
||||
DAY_OF_WEEK, |
||||
MONTH, |
||||
YEAR, |
||||
WEEK_DAY, |
||||
WEEK_END, |
||||
; |
||||
|
||||
private enum class Field(var fieldName:String) { |
||||
START_DATE("startDate"), |
||||
END_DATE("endDate"), |
||||
DAY("dayOfWeek"), |
||||
MONTH("month"), |
||||
YEAR("year"), |
||||
} |
||||
|
||||
override var valueMap : Map<String, Any?>? = null |
||||
|
||||
override val filterValuesExceptedKeys : Array<String>? |
||||
get() { |
||||
return when (this) { |
||||
STARTED_FROM_DATE, STARTED_TO_DATE, ENDED_FROM_DATE, ENDED_TO_DATE -> arrayOf("date") |
||||
DAY_OF_WEEK -> arrayOf("dayOfWeek") |
||||
MONTH -> arrayOf("month") |
||||
YEAR -> arrayOf("year") |
||||
else -> null |
||||
} |
||||
} |
||||
|
||||
override fun filter(realmQuery: RealmQuery<*>): RealmQuery<*> { |
||||
return when (this) { |
||||
STARTED_FROM_DATE -> { |
||||
val date : Date by filterValues |
||||
realmQuery.greaterThanOrEqualTo(Field.START_DATE.fieldName, date) |
||||
} |
||||
STARTED_TO_DATE -> { |
||||
val date : Date by filterValues |
||||
realmQuery.lessThanOrEqualTo(Field.START_DATE.fieldName, date) |
||||
} |
||||
ENDED_FROM_DATE -> { |
||||
val date : Date by filterValues |
||||
realmQuery.greaterThanOrEqualTo(Field.END_DATE.fieldName, date) |
||||
} |
||||
ENDED_TO_DATE -> { |
||||
val date : Date by filterValues |
||||
realmQuery.lessThanOrEqualTo(Field.END_DATE.fieldName, date) |
||||
} |
||||
DAY_OF_WEEK -> { |
||||
val dayOfWeek : Int by filterValues |
||||
realmQuery.equalTo(Field.DAY.fieldName, dayOfWeek) |
||||
} |
||||
MONTH -> { |
||||
val month: Int by filterValues |
||||
realmQuery.equalTo(Field.MONTH.fieldName, month) |
||||
} |
||||
YEAR -> { |
||||
val year: Int by filterValues |
||||
realmQuery.equalTo(Field.YEAR.fieldName, year) |
||||
} |
||||
WEEK_END -> { |
||||
realmQuery.`in`(Field.DAY.fieldName, arrayOf(Calendar.SATURDAY,Calendar.SUNDAY)) |
||||
} |
||||
WEEK_DAY -> WEEK_END.filter(realmQuery.not()) |
||||
} |
||||
} |
||||
} |
||||
@ -1,198 +1,5 @@ |
||||
package net.pokeranalytics.android.model.filter |
||||
|
||||
import io.realm.RealmObject |
||||
import io.realm.RealmQuery |
||||
import net.pokeranalytics.android.exceptions.FilterValueMapException |
||||
import net.pokeranalytics.android.model.realm.Session |
||||
import java.time.DayOfWeek |
||||
import java.util.* |
||||
|
||||
|
||||
enum class FilterComponent { |
||||
|
||||
} |
||||
|
||||
interface TimeFilterable { |
||||
|
||||
var dayOfWeek : Int? |
||||
var month : Int? |
||||
var year : Int? |
||||
|
||||
fun updateTimeParameter(startDate:Date?) { |
||||
startDate?.let { |
||||
val cal = Calendar.getInstance() |
||||
cal.time = it |
||||
dayOfWeek = cal.get(Calendar.DAY_OF_WEEK) |
||||
month = cal.get(Calendar.MONTH) |
||||
year = cal.get(Calendar.YEAR) |
||||
} |
||||
} |
||||
} |
||||
|
||||
enum class DateFilterable(var fieldName:String? = null) : Filterable { |
||||
STARTED_FROM_DATE, |
||||
STARTED_TO_DATE, |
||||
ENDED_FROM_DATE, |
||||
ENDED_TO_DATE, |
||||
DAY_OF_WEEK("dayOfWeek"), |
||||
MONTH("month"), |
||||
YEAR("year"), |
||||
WEEK_DAY, |
||||
WEEK_END, |
||||
; |
||||
|
||||
private enum class Field(var fieldName:String) { |
||||
START_DATE("startDate"), |
||||
END_DATE("endDate"), |
||||
} |
||||
|
||||
override var valueMap : Map<String, Any?>? = null |
||||
|
||||
override val filterValuesExceptedKeys : Array<String>? |
||||
get() { |
||||
return when (this) { |
||||
STARTED_FROM_DATE, STARTED_TO_DATE, ENDED_FROM_DATE, ENDED_TO_DATE -> arrayOf("date") |
||||
DAY_OF_WEEK -> arrayOf("dayOfWeek") |
||||
MONTH -> arrayOf("month") |
||||
YEAR -> arrayOf("year") |
||||
else -> null |
||||
} |
||||
} |
||||
|
||||
override fun filter(realmQuery: RealmQuery<*>): RealmQuery<out RealmObject> { |
||||
return when (this) { |
||||
STARTED_FROM_DATE -> { |
||||
val date : Date by filterValues |
||||
realmQuery.greaterThanOrEqualTo(Field.START_DATE.fieldName, date) |
||||
} |
||||
STARTED_TO_DATE -> { |
||||
val date : Date by filterValues |
||||
realmQuery.lessThanOrEqualTo(Field.START_DATE.fieldName, date) |
||||
} |
||||
ENDED_FROM_DATE -> { |
||||
val date : Date by filterValues |
||||
realmQuery.greaterThanOrEqualTo(Field.END_DATE.fieldName, date) |
||||
} |
||||
ENDED_TO_DATE -> { |
||||
val date : Date by filterValues |
||||
realmQuery.lessThanOrEqualTo(Field.END_DATE.fieldName, date) |
||||
} |
||||
DAY_OF_WEEK -> { |
||||
val dayOfWeek : Int by filterValues |
||||
realmQuery.equalTo(this.fieldName, dayOfWeek) |
||||
} |
||||
MONTH -> { |
||||
val month: Int by filterValues |
||||
realmQuery.equalTo(this.fieldName, month) |
||||
} |
||||
YEAR -> { |
||||
val year: Int by filterValues |
||||
realmQuery.equalTo(this.fieldName, year) |
||||
} |
||||
WEEK_END -> { |
||||
realmQuery.equalTo(DAY_OF_WEEK.fieldName, Calendar.SATURDAY).or().equalTo(DAY_OF_WEEK.fieldName, Calendar.SUNDAY) |
||||
} |
||||
WEEK_DAY -> WEEK_END.filter(realmQuery.not()) |
||||
} as RealmQuery<out RealmObject> |
||||
} |
||||
} |
||||
|
||||
enum class SessionFilterable(var fieldName:String? = null) : Filterable { |
||||
LIVE("bankroll.live"), |
||||
CASH("type"), |
||||
ONLINE, |
||||
TOURNAMENT, |
||||
BANKROLL("bankroll.id"), |
||||
GAME("game.id"), |
||||
LIMIT("limit"), |
||||
TABLE_SIZE("tableSize"), |
||||
LOCATION("location.id"), |
||||
NUMBER_OF_TABLE("numberOfTable"), |
||||
COMMENT("comment"), |
||||
TOURNAMENT_TYPE("tournamentType"), |
||||
TOURNAMENT_NAME("tournamentName.id"), |
||||
TOURNAMENT_FEATURES("tournamentFeature.id"), |
||||
TOURNAMENT_NUMBER_OF_PLAYER("tournamentNumberOfPlayers"), |
||||
TOURNAMENT_ENTRY_FEE("tournamentEntryFee"), |
||||
RESULT_BUY_IN("result.buyin"), |
||||
RESULT_CASHED_OUT("result.cashout"), |
||||
RESULT_NET("result.ratedNet"), |
||||
RESULT_TIPS("result.tips"), |
||||
BLINDS, |
||||
; |
||||
|
||||
private enum class Field(var fieldName:String) { |
||||
START_DATE("startDate"), |
||||
END_DATE("endDate"), |
||||
CURRENCY("bankroll.currency"), |
||||
CURRENCY_CODE("bankroll.currency.code"), |
||||
BIG_BLIND("cgBigBlind"), |
||||
SMALL_BLIND("cgSmallBlind"); |
||||
} |
||||
|
||||
override var valueMap : Map<String, Any?>? = null |
||||
|
||||
override val filterValuesExceptedKeys : Array<String>? |
||||
get() { |
||||
return when (this) { |
||||
BANKROLL -> arrayOf("ids") |
||||
BLINDS -> arrayOf("map") |
||||
else -> null |
||||
} |
||||
} |
||||
|
||||
override fun filter(realmQuery: RealmQuery<*>): RealmQuery<out RealmObject> { |
||||
return when (this) { |
||||
LIVE -> realmQuery.equalTo(this.fieldName, true) |
||||
CASH -> realmQuery.equalTo(this.fieldName, Session.Type.CASH_GAME.ordinal) |
||||
ONLINE -> LIVE.filter(realmQuery.not()) |
||||
TOURNAMENT -> CASH.filter(realmQuery.not()) |
||||
BANKROLL -> { |
||||
val ids : Array<String> by filterValues |
||||
realmQuery.`in`(this.fieldName, ids) |
||||
} |
||||
BLINDS -> { |
||||
val map : Array<Map<String,Any?>> by filterValues |
||||
var finalQuery = realmQuery |
||||
val expectedSubKeys = arrayOf("sb", "bb", "code") as Array<String> |
||||
map.forEachIndexed { index, subMap -> |
||||
var missingKeys = subMap.keys.filter { !expectedSubKeys.contains(it) } |
||||
if (subMap.keys.size == expectedSubKeys.size && missingKeys.isNotEmpty()) { |
||||
throw FilterValueMapException("subValueMap does not contain ${missingKeys}") |
||||
} |
||||
|
||||
val sb : Double? by subMap |
||||
val bb : Double? by subMap |
||||
val code : String? by subMap |
||||
|
||||
finalQuery |
||||
.beginGroup() |
||||
|
||||
sb?.let { |
||||
finalQuery |
||||
.equalTo(Field.SMALL_BLIND.fieldName, sb) |
||||
.and() |
||||
} |
||||
|
||||
finalQuery |
||||
.equalTo(Field.BIG_BLIND.fieldName, bb) |
||||
.and() |
||||
|
||||
code?.let { |
||||
finalQuery.equalTo(Field.CURRENCY_CODE.fieldName, code) |
||||
} ?: run { |
||||
finalQuery.isNull(Field.CURRENCY_CODE.fieldName) |
||||
} |
||||
|
||||
finalQuery.endGroup() |
||||
|
||||
if (index < map.size - 1) { |
||||
finalQuery.or() |
||||
} |
||||
} |
||||
finalQuery |
||||
} |
||||
else -> realmQuery |
||||
} as RealmQuery<out RealmObject> |
||||
} |
||||
} |
||||
@ -0,0 +1,108 @@ |
||||
package net.pokeranalytics.android.model.filter |
||||
|
||||
import io.realm.RealmQuery |
||||
import net.pokeranalytics.android.exceptions.FilterValueMapException |
||||
import net.pokeranalytics.android.model.filter.interfaces.Filterable |
||||
import net.pokeranalytics.android.model.realm.Session |
||||
|
||||
enum class SessionFilterable: Filterable { |
||||
LIVE, |
||||
CASH, |
||||
ONLINE, |
||||
TOURNAMENT, |
||||
BANKROLL, |
||||
BLINDS, |
||||
; |
||||
|
||||
private enum class Field(var fieldName:String) { |
||||
LIVE("bankroll.live"), |
||||
CASH("type"), |
||||
BANKROLL("bankroll.id"), |
||||
START_DATE("startDate"), |
||||
END_DATE("endDate"), |
||||
CURRENCY("bankroll.currency"), |
||||
CURRENCY_CODE("bankroll.currency.code"), |
||||
BIG_BLIND("cgBigBlind"), |
||||
SMALL_BLIND("cgSmallBlind"), |
||||
GAME("game.id"), |
||||
LIMIT("limit"), |
||||
TABLE_SIZE("tableSize"), |
||||
LOCATION("location.id"), |
||||
NUMBER_OF_TABLE("numberOfTable"), |
||||
COMMENT("comment"), |
||||
TOURNAMENT_TYPE("tournamentType"), |
||||
TOURNAMENT_NAME("tournamentName.id"), |
||||
TOURNAMENT_FEATURES("tournamentFeature.id"), |
||||
TOURNAMENT_NUMBER_OF_PLAYER("tournamentNumberOfPlayers"), |
||||
TOURNAMENT_ENTRY_FEE("tournamentEntryFee"), |
||||
RESULT_BUY_IN("result.buyin"), |
||||
RESULT_CASHED_OUT("result.cashout"), |
||||
RESULT_NET("result.ratedNet"), |
||||
RESULT_TIPS("result.tips"), |
||||
; |
||||
} |
||||
|
||||
override var valueMap : Map<String, Any?>? = null |
||||
|
||||
override val filterValuesExceptedKeys : Array<String>? |
||||
get() { |
||||
return when (this) { |
||||
BANKROLL -> arrayOf("ids") |
||||
BLINDS -> arrayOf("map") |
||||
else -> null |
||||
} |
||||
} |
||||
|
||||
override fun filter(realmQuery: RealmQuery<*>): RealmQuery<*> { |
||||
return when (this) { |
||||
LIVE -> realmQuery.equalTo(Field.LIVE.fieldName, true) |
||||
CASH -> realmQuery.equalTo(Field.CASH.fieldName, Session.Type.CASH_GAME.ordinal) |
||||
ONLINE -> LIVE.filter(realmQuery.not()) |
||||
TOURNAMENT -> CASH.filter(realmQuery.not()) |
||||
BANKROLL -> { |
||||
val ids : Array<String> by filterValues |
||||
realmQuery.`in`(Field.BANKROLL.fieldName, ids) |
||||
} |
||||
BLINDS -> { |
||||
val map : Array<Map<String,Any?>> by filterValues |
||||
val expectedSubKeys = arrayOf("sb", "bb", "code") |
||||
map.forEachIndexed { index, subMap -> |
||||
val missingKeys = subMap.keys.filter { !expectedSubKeys.contains(it) } |
||||
if (subMap.keys.size == expectedSubKeys.size && missingKeys.isNotEmpty()) { |
||||
throw FilterValueMapException("subValueMap does not contain $missingKeys") |
||||
} |
||||
|
||||
val sb : Double? by subMap |
||||
val bb : Double? by subMap |
||||
val code : String? by subMap |
||||
|
||||
realmQuery |
||||
.beginGroup() |
||||
|
||||
sb?.let { |
||||
realmQuery |
||||
.equalTo(Field.SMALL_BLIND.fieldName, sb) |
||||
.and() |
||||
} |
||||
|
||||
realmQuery |
||||
.equalTo(Field.BIG_BLIND.fieldName, bb) |
||||
.and() |
||||
|
||||
code?.let { |
||||
realmQuery.equalTo(Field.CURRENCY_CODE.fieldName, code) |
||||
} ?: run { |
||||
realmQuery.isNull(Field.CURRENCY_CODE.fieldName) |
||||
} |
||||
|
||||
realmQuery.endGroup() |
||||
|
||||
if (index < map.size - 1) { |
||||
realmQuery.or() |
||||
} |
||||
} |
||||
realmQuery |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,7 @@ |
||||
package net.pokeranalytics.android.model.filter.interfaces |
||||
|
||||
import io.realm.RealmQuery |
||||
|
||||
interface Filterable : ValueFilterable { |
||||
fun filter(realmQuery: RealmQuery<*>): RealmQuery<*> |
||||
} |
||||
@ -0,0 +1,20 @@ |
||||
package net.pokeranalytics.android.model.filter.interfaces |
||||
|
||||
import java.util.* |
||||
|
||||
interface TimeFilterable { |
||||
|
||||
var dayOfWeek : Int? |
||||
var month : Int? |
||||
var year : Int? |
||||
|
||||
fun updateTimeParameter(startDate: Date?) { |
||||
startDate?.let { |
||||
val cal = Calendar.getInstance() |
||||
cal.time = it |
||||
dayOfWeek = cal.get(Calendar.DAY_OF_WEEK) |
||||
month = cal.get(Calendar.MONTH) |
||||
year = cal.get(Calendar.YEAR) |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,28 @@ |
||||
package net.pokeranalytics.android.model.filter.interfaces |
||||
|
||||
import net.pokeranalytics.android.exceptions.FilterValueMapException |
||||
|
||||
interface ValueFilterable { |
||||
|
||||
var valueMap: Map<String, Any?>? |
||||
|
||||
var filterValues : Map<String, Any?>? |
||||
get() { |
||||
this.filterValuesExceptedKeys?.let { valueMapExceptedKeys -> |
||||
valueMap?.let { map -> |
||||
var missingKeys = map.keys.filter { !valueMapExceptedKeys.contains(it) } |
||||
if (map.keys.size == valueMapExceptedKeys.size && missingKeys.isNotEmpty()) { |
||||
throw FilterValueMapException("valueMap does not contain ${missingKeys}") |
||||
} |
||||
} ?: run { |
||||
throw FilterValueMapException("valueMap null not expected") |
||||
} |
||||
} |
||||
return this.valueMap |
||||
} |
||||
set(value) { |
||||
valueMap = value |
||||
} |
||||
|
||||
val filterValuesExceptedKeys : Array<String>? |
||||
} |
||||
Loading…
Reference in new issue