refactoring of FilterElementRow to an Interface followed by QueryCondition

feature/top10
Razmig Sarkissian 7 years ago
parent 125993d285
commit a3e4438b54
  1. 45
      app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/BlindFilterInstrumentedTest.kt
  2. 15
      app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/DateFilterInstrumentedUnitTest.kt
  3. 2
      app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/RealmFilterInstrumentedUnitTest.kt
  4. 60
      app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/SessionFilterInstrumentedUnitTest.kt
  5. 11
      app/src/main/java/net/pokeranalytics/android/model/Criteria.kt
  6. 51
      app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt
  7. 434
      app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt
  8. 29
      app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt
  9. 61
      app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt
  10. 16
      app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt
  11. 54
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt
  12. 488
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt
  13. 82
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt

@ -41,15 +41,18 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() {
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.BLIND() val filter = QueryCondition.BLIND()
val blind = FilterElementRow.Blind(s1.blinds!!, true)
val blind = QueryCondition.BLIND().apply {
blind = s1.blinds!!
hasDefaultCurrency = false
}
blind.filterSectionRow = FilterSectionRow.BLIND blind.filterSectionRow = FilterSectionRow.BLIND
val filterElement = FilterCondition(filterElementRows = arrayListOf(blind)) val filterElement = FilterCondition(filterElementRows = arrayListOf(blind))
filter.updateValueMap(filterElement) filter.updateValueMap(filterElement)
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter)) val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
Assert.assertEquals(2, sessions.size) Assert.assertEquals(2, sessions.size)
@ -87,8 +90,16 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.BLIND() val filter = QueryCondition.BLIND()
val blind1 = FilterElementRow.Blind(s1.blinds!!, true)
val blind2 = FilterElementRow.Blind(s2.blinds!!, true) val blind1 = QueryCondition.BLIND().apply {
blind = s1.blinds!!
hasDefaultCurrency = true
}
val blind2 = QueryCondition.BLIND().apply {
blind = s2.blinds!!
hasDefaultCurrency = true
}
blind1.filterSectionRow = FilterSectionRow.BLIND blind1.filterSectionRow = FilterSectionRow.BLIND
blind2.filterSectionRow = FilterSectionRow.BLIND blind2.filterSectionRow = FilterSectionRow.BLIND
@ -133,7 +144,12 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.BLIND() val filter = QueryCondition.BLIND()
val blind = FilterElementRow.Blind(s3.blinds!!, false)
val blind = QueryCondition.BLIND().apply {
blind = s3.blinds!!
hasDefaultCurrency = false
}
blind.filterSectionRow = FilterSectionRow.BLIND blind.filterSectionRow = FilterSectionRow.BLIND
val filterElement = FilterCondition(filterElementRows = arrayListOf(blind)) val filterElement = FilterCondition(filterElementRows = arrayListOf(blind))
@ -175,12 +191,21 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() {
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.BLIND() val filter = QueryCondition.BLIND()
val blind1 = FilterElementRow.Blind(s1.blinds!!, false)
blind1.filterSectionRow = FilterSectionRow.BLIND
val blind2 = FilterElementRow.Blind(s2.blinds!!, false) val blind1 = QueryCondition.BLIND().apply {
blind = s1.blinds!!
hasDefaultCurrency = false
}
val blind2 = QueryCondition.BLIND().apply {
blind = s2.blinds!!
hasDefaultCurrency = false
}
blind1.filterSectionRow = FilterSectionRow.BLIND
blind2.filterSectionRow = FilterSectionRow.BLIND blind2.filterSectionRow = FilterSectionRow.BLIND
val filterElement = FilterCondition(filterElementRows = arrayListOf(blind1, blind2)) val filterElement = FilterCondition(filterElementRows = arrayListOf(blind1, blind2))
filter.updateValueMap(filterElement) filter.updateValueMap(filterElement)

@ -33,7 +33,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.DAY_OF_WEEK() val filter = QueryCondition.DAY_OF_WEEK()
cal.time = s1.startDate cal.time = s1.startDate
val filterElementRow = FilterElementRow.Day(cal.get(Calendar.DAY_OF_WEEK)) val filterElementRow = QueryCondition.DAY_OF_WEEK().apply { intValue = cal.get(Calendar.DAY_OF_WEEK) }
filterElementRow.filterSectionRow = FilterSectionRow.DYNAMIC_DATE filterElementRow.filterSectionRow = FilterSectionRow.DYNAMIC_DATE
val filterElement = FilterCondition(arrayListOf(filterElementRow)) val filterElement = FilterCondition(arrayListOf(filterElementRow))
filter.updateValueMap(filterElement) filter.updateValueMap(filterElement)
@ -61,8 +61,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.MONTH() val filter = QueryCondition.MONTH()
cal.time = s1.startDate cal.time = s1.startDate
val filterElementRow = QueryCondition.MONTH().apply { intValue = cal.get(Calendar.MONTH) }
val filterElementRow = FilterElementRow.Month(cal.get(Calendar.MONTH))
filterElementRow.filterSectionRow = FilterSectionRow.DYNAMIC_DATE filterElementRow.filterSectionRow = FilterSectionRow.DYNAMIC_DATE
val filterElement = FilterCondition(arrayListOf(filterElementRow)) val filterElement = FilterCondition(arrayListOf(filterElementRow))
filter.updateValueMap(filterElement) filter.updateValueMap(filterElement)
@ -90,7 +89,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.YEAR() val filter = QueryCondition.YEAR()
cal.time = s1.startDate cal.time = s1.startDate
val filterElementRow = FilterElementRow.Year(cal.get(Calendar.YEAR)) val filterElementRow = QueryCondition.YEAR().apply { intValue = cal.get(Calendar.YEAR) }
filterElementRow.filterSectionRow = FilterSectionRow.DYNAMIC_DATE filterElementRow.filterSectionRow = FilterSectionRow.DYNAMIC_DATE
val filterElement = FilterCondition(arrayListOf(filterElementRow)) val filterElement = FilterCondition(arrayListOf(filterElementRow))
filter.updateValueMap(filterElement) filter.updateValueMap(filterElement)
@ -384,7 +383,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.STARTED_FROM_DATE() val filter = QueryCondition.STARTED_FROM_DATE()
val filterElementRow = FilterElementRow.From.apply { dateValue = s2.startDate!!} val filterElementRow = QueryCondition.STARTED_FROM_DATE().apply { dateValue = s2.startDate!!}
filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE
filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow))) filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow)))
@ -412,7 +411,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.STARTED_TO_DATE() val filter = QueryCondition.STARTED_TO_DATE()
val filterElementRow = FilterElementRow.From.apply { dateValue = s1.startDate!! } val filterElementRow = QueryCondition.STARTED_TO_DATE().apply { dateValue = s1.startDate!! }
filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE
filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow))) filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow)))
@ -441,7 +440,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.ENDED_FROM_DATE() val filter = QueryCondition.ENDED_FROM_DATE()
val filterElementRow = FilterElementRow.From.apply { dateValue = s2.endDate() } val filterElementRow = QueryCondition.ENDED_FROM_DATE().apply { dateValue = s2.endDate() }
filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE
filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow))) filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow)))
@ -470,7 +469,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.ENDED_TO_DATE() val filter = QueryCondition.ENDED_TO_DATE()
val filterElementRow = FilterElementRow.From.apply { dateValue = s1.endDate() } val filterElementRow = QueryCondition.ENDED_TO_DATE().apply { dateValue = s1.endDate() }
filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE
filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow))) filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow)))

@ -25,7 +25,7 @@ class RealmFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = Filter() val filter = Filter()
filter.name = "testSaveLoadCashFilter" filter.name = "testSaveLoadCashFilter"
val filterElement = FilterElementRow.Cash val filterElement = QueryCondition.CASH
filterElement.filterSectionRow = FilterSectionRow.CASH_TOURNAMENT filterElement.filterSectionRow = FilterSectionRow.CASH_TOURNAMENT
filter.createOrUpdateFilterConditions(arrayListOf(filterElement)) filter.createOrUpdateFilterConditions(arrayListOf(filterElement))

@ -110,7 +110,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.BANKROLL() val filter = QueryCondition.BANKROLL()
val filterElementRow = FilterElementRow.Bankroll(b1) val filterElementRow = QueryCondition.BANKROLL().apply { setObject(b1) }
filterElementRow.filterSectionRow = FilterSectionRow.BANKROLL filterElementRow.filterSectionRow = FilterSectionRow.BANKROLL
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow))) filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow)))
@ -141,10 +141,10 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.BANKROLL() val filter = QueryCondition.BANKROLL()
val filterElementRow = FilterElementRow.Bankroll(b1) val filterElementRow = QueryCondition.BANKROLL().apply { setObject(b1) }
filterElementRow.filterSectionRow = FilterSectionRow.BANKROLL filterElementRow.filterSectionRow = FilterSectionRow.BANKROLL
val filterElementRow2 = FilterElementRow.Bankroll(b2) val filterElementRow2 = QueryCondition.BANKROLL().apply { setObject(b2) }
filterElementRow2.filterSectionRow = FilterSectionRow.BANKROLL filterElementRow2.filterSectionRow = FilterSectionRow.BANKROLL
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2))) filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2)))
@ -170,7 +170,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.GAME() val filter = QueryCondition.GAME()
val filterElementRow = FilterElementRow.Game(g2) val filterElementRow = QueryCondition.GAME().apply { setObject(g2) }
filterElementRow.filterSectionRow = FilterSectionRow.GAME filterElementRow.filterSectionRow = FilterSectionRow.GAME
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow))) filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow)))
@ -202,9 +202,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.GAME() val filter = QueryCondition.GAME()
val filterElementRow = FilterElementRow.Game(g2) val filterElementRow = QueryCondition.GAME().apply { setObject(g2) }
filterElementRow.filterSectionRow = FilterSectionRow.GAME filterElementRow.filterSectionRow = FilterSectionRow.GAME
val filterElementRow2 = FilterElementRow.Game(g3) val filterElementRow2 = QueryCondition.GAME().apply { setObject(g3) }
filterElementRow2.filterSectionRow = FilterSectionRow.GAME filterElementRow2.filterSectionRow = FilterSectionRow.GAME
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2))) filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2)))
@ -230,7 +230,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.LOCATION() val filter = QueryCondition.LOCATION()
val filterElementRow = FilterElementRow.Location(l1) val filterElementRow = QueryCondition.LOCATION().apply { setObject(l1) }
filterElementRow.filterSectionRow = FilterSectionRow.LOCATION filterElementRow.filterSectionRow = FilterSectionRow.LOCATION
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow))) filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow)))
@ -262,9 +262,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.LOCATION() val filter = QueryCondition.LOCATION()
val filterElementRow = FilterElementRow.Location(l1) val filterElementRow = QueryCondition.LOCATION().apply { setObject(l1) }
filterElementRow.filterSectionRow = FilterSectionRow.LOCATION filterElementRow.filterSectionRow = FilterSectionRow.LOCATION
val filterElementRow2 = FilterElementRow.Location(l3) val filterElementRow2 = QueryCondition.LOCATION().apply { setObject(l3) }
filterElementRow2.filterSectionRow = FilterSectionRow.LOCATION filterElementRow2.filterSectionRow = FilterSectionRow.LOCATION
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2))) filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2)))
@ -292,7 +292,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.TOURNAMENT_NAME() val filter = QueryCondition.TOURNAMENT_NAME()
val filterElementRow = FilterElementRow.TournamentName(t1) val filterElementRow = QueryCondition.TOURNAMENT_NAME().apply { setObject(t1) }
filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_NAME filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_NAME
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow))) filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow)))
@ -323,9 +323,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.TOURNAMENT_NAME() val filter = QueryCondition.TOURNAMENT_NAME()
val filterElementRow = FilterElementRow.TournamentName(t1) val filterElementRow = QueryCondition.TOURNAMENT_NAME().apply { setObject(t1) }
filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_NAME filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_NAME
val filterElementRow2 = FilterElementRow.TournamentName(t2) val filterElementRow2 = QueryCondition.TOURNAMENT_NAME().apply { setObject(t2) }
filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_NAME filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_NAME
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2))) filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2)))
@ -359,11 +359,11 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.ALL_TOURNAMENT_FEATURES() val filter = QueryCondition.ALL_TOURNAMENT_FEATURES()
val filterElementRow = FilterElementRow.AllTournamentFeature(t1) val filterElementRow = QueryCondition.ALL_TOURNAMENT_FEATURES().apply { setObject(t1) }
filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE
val filterElementRow2 = FilterElementRow.AllTournamentFeature(t2) val filterElementRow2 = QueryCondition.ALL_TOURNAMENT_FEATURES().apply { setObject(t2) }
filterElementRow2.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE filterElementRow2.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE
val filterElementRow3 = FilterElementRow.AllTournamentFeature(t4) val filterElementRow3 = QueryCondition.ALL_TOURNAMENT_FEATURES().apply { setObject(t4) }
filterElementRow3.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE filterElementRow3.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2, filterElementRow3))) filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2, filterElementRow3)))
@ -394,13 +394,13 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.ANY_TOURNAMENT_FEATURES() val filter = QueryCondition.ANY_TOURNAMENT_FEATURES()
val filterElementRow = FilterElementRow.AnyTournamentFeature(t1) val filterElementRow = QueryCondition.ANY_TOURNAMENT_FEATURES().apply { setObject(t1) }
filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE
val filterElementRow2 = FilterElementRow.AnyTournamentFeature(t2) val filterElementRow2 = QueryCondition.ANY_TOURNAMENT_FEATURES().apply { setObject(t2) }
filterElementRow2.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE filterElementRow2.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE
val filterElementRow3 = FilterElementRow.AnyTournamentFeature(t3) val filterElementRow3 = QueryCondition.ANY_TOURNAMENT_FEATURES().apply { setObject(t3) }
filterElementRow3.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE filterElementRow3.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE
val filterElementRow4 = FilterElementRow.AnyTournamentFeature(t4) val filterElementRow4 = QueryCondition.ANY_TOURNAMENT_FEATURES().apply { setObject(t4) }
filterElementRow4.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE filterElementRow4.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2, filterElementRow3, filterElementRow4))) filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2, filterElementRow3, filterElementRow4)))
@ -428,7 +428,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.ANY_TOURNAMENT_FEATURES() val filter = QueryCondition.ANY_TOURNAMENT_FEATURES()
val filterElementRow = FilterElementRow.AnyTournamentFeature(t2) val filterElementRow = QueryCondition.ANY_TOURNAMENT_FEATURES().apply { setObject(t2) }
filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow))) filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow)))
@ -453,9 +453,10 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.TABLE_SIZE() val filter = QueryCondition.TABLE_SIZE()
val filterElementRow = FilterElementRow.TableSize(TableSize(2)) val filterElementRow = QueryCondition.TABLE_SIZE().apply { intValues = arrayListOf(2) }
filterElementRow.filterSectionRow = FilterSectionRow.TABLE_SIZE filterElementRow.filterSectionRow = FilterSectionRow.TABLE_SIZE
val filterElementRow2 = FilterElementRow.TableSize(TableSize(4)) val filterElementRow2 = QueryCondition.TABLE_SIZE().apply { intValues = arrayListOf(4) }
println("filterelement : ${filterElementRow2.doubleValues}")
filterElementRow.filterSectionRow = FilterSectionRow.TABLE_SIZE filterElementRow.filterSectionRow = FilterSectionRow.TABLE_SIZE
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2))) filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2)))
@ -480,11 +481,11 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.MORE_THAN_NET_RESULT() val filter = QueryCondition.MORE_THAN_NET_RESULT()
val filterElementRow = FilterElementRow.ResultMoreThan.apply { this.amount = 204.0 } val filterElementRow = QueryCondition.MORE_THAN_NET_RESULT().apply { this.amount = 204.0 }
filterElementRow.filterSectionRow = FilterSectionRow.VALUE filterElementRow.filterSectionRow = FilterSectionRow.VALUE
filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow))) filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter)) val sessions = Filter.queryOn<Session>(realm, arrayListOf(filterElementRow))
Assert.assertEquals(2, sessions.size) Assert.assertEquals(2, sessions.size)
@ -503,9 +504,12 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val s3 = Session.testInstance(netResult = 50.0) val s3 = Session.testInstance(netResult = 50.0)
Session.testInstance(netResult = 570.0) Session.testInstance(netResult = 570.0)
realm.commitTransaction() realm.commitTransaction()
println("s1.computableResult?.ratedNet ${s1.computableResult?.ratedNet}")
println("s2.computableResult?.ratedNet ${s2.computableResult?.ratedNet}")
println("s3.computableResult?.ratedNet ${s3.computableResult?.ratedNet}")
val filter = QueryCondition.LESS_THAN_NET_RESULT() val filter = QueryCondition.LESS_THAN_NET_RESULT()
val filterElementRow = FilterElementRow.ResultMoreThan.apply { this.amount = 540.0 } val filterElementRow = QueryCondition.LESS_THAN_NET_RESULT().apply { this.amount = 540.0 }
filterElementRow.filterSectionRow = FilterSectionRow.VALUE filterElementRow.filterSectionRow = FilterSectionRow.VALUE
filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow))) filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow)))
@ -529,13 +533,15 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
Session.testInstance(netResult = 570.0) Session.testInstance(netResult = 570.0)
realm.commitTransaction() realm.commitTransaction()
print("s1.computableResult?.ratedNet ${s1.computableResult?.ratedNet}")
val filterMore = QueryCondition.MORE_THAN_NET_RESULT() val filterMore = QueryCondition.MORE_THAN_NET_RESULT()
val filterElementRow = FilterElementRow.ResultMoreThan.apply { this.amount = 200.0 } val filterElementRow = QueryCondition.MORE_THAN_NET_RESULT().apply { this.amount = 200.0 }
filterElementRow.filterSectionRow = FilterSectionRow.VALUE filterElementRow.filterSectionRow = FilterSectionRow.VALUE
filterMore.updateValueMap(FilterCondition(arrayListOf(filterElementRow))) filterMore.updateValueMap(FilterCondition(arrayListOf(filterElementRow)))
val filterLess = QueryCondition.LESS_THAN_NET_RESULT() val filterLess = QueryCondition.LESS_THAN_NET_RESULT()
val filterElementRow2 = FilterElementRow.ResultMoreThan.apply { this.amount = 400.0 } val filterElementRow2 = QueryCondition.LESS_THAN_NET_RESULT().apply { this.amount = 400.0 }
filterElementRow2.filterSectionRow = FilterSectionRow.VALUE filterElementRow2.filterSectionRow = FilterSectionRow.VALUE
filterLess.updateValueMap(FilterCondition(arrayListOf(filterElementRow2))) filterLess.updateValueMap(FilterCondition(arrayListOf(filterElementRow2)))

@ -3,6 +3,7 @@ package net.pokeranalytics.android.model
import io.realm.Realm import io.realm.Realm
import io.realm.RealmResults import io.realm.RealmResults
import io.realm.Sort import io.realm.Sort
import io.realm.internal.Table
import io.realm.kotlin.where import io.realm.kotlin.where
import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.model.filter.FilterHelper import net.pokeranalytics.android.model.filter.FilterHelper
@ -24,11 +25,13 @@ sealed class Criteria {
} }
abstract class StaticCriteria : Criteria() { abstract class StaticCriteria : Criteria() {
inline fun <reified T:QueryCondition.SingleValueQueryCondition> comparison(): List<QueryCondition> { inline fun <reified T:QueryCondition.StaticDataQueryCondition> comparison(): List<QueryCondition> {
QueryCondition.distinct<Session, T>()?.let { QueryCondition.distinct<Session, T>()?.let {
val values = it.mapNotNull { session -> val values = it.mapNotNull { session ->
when (this) { when (this) {
is Limits -> session.limit is Limits -> session.limit
is TournamentTypes -> session.tournamentType
is TableSizes -> session.tableSize
else -> null else -> null
} }
} }
@ -44,6 +47,7 @@ sealed class Criteria {
object Locations: RealmCriteria() object Locations: RealmCriteria()
object TournamentFeatures: RealmCriteria() object TournamentFeatures: RealmCriteria()
object Limits: StaticCriteria() object Limits: StaticCriteria()
object TableSizes: StaticCriteria()
object TournamentTypes : StaticCriteria() object TournamentTypes : StaticCriteria()
object Tournament : SimpleCriteria(QueryCondition.TOURNAMENT) object Tournament : SimpleCriteria(QueryCondition.TOURNAMENT)
@ -59,6 +63,7 @@ sealed class Criteria {
is SimpleCriteria -> comparison() is SimpleCriteria -> comparison()
is Limits -> comparison<QueryCondition.LIMIT>() is Limits -> comparison<QueryCondition.LIMIT>()
is TournamentTypes -> comparison<QueryCondition.TOURNAMENT_TYPE>() is TournamentTypes -> comparison<QueryCondition.TOURNAMENT_TYPE>()
is TableSizes -> comparison<QueryCondition.TABLE_SIZE>()
else -> throw PokerAnalyticsException.QueryTypeUnhandled else -> throw PokerAnalyticsException.QueryTypeUnhandled
} }
} }
@ -76,11 +81,11 @@ sealed class Criteria {
return objects return objects
} }
inline fun < reified S : QueryCondition.SingleValueQueryCondition > compare(values:List<Int>): List<S> { inline fun < reified S : QueryCondition.StaticDataQueryCondition > compare(values:List<Int>): List<S> {
val objects = arrayListOf<S>() val objects = arrayListOf<S>()
values.forEach { values.forEach {
objects.add((S::class.java.newInstance()).apply { objects.add((S::class.java.newInstance()).apply {
setValue(it) intValues.add(it)
}) })
} }
return objects return objects

@ -47,8 +47,8 @@ enum class Comparator {
realm.close() realm.close()
fees fees
} }
MONTH_OF_YEAR -> List(12) { index -> QueryCondition.MONTH().apply { setMonth(index) } } MONTH_OF_YEAR -> List(12) { index -> QueryCondition.MONTH().apply { intValue = index } }
DAY_OF_WEEK -> List(7) { index -> QueryCondition.DAY_OF_WEEK().apply { setDay(index) } } DAY_OF_WEEK -> List(7) { index -> QueryCondition.DAY_OF_WEEK().apply { intValue = index } }
YEAR -> { YEAR -> {
val years = arrayListOf<QueryCondition.YEAR>() val years = arrayListOf<QueryCondition.YEAR>()
val calendar = Calendar.getInstance() val calendar = Calendar.getInstance()
@ -57,7 +57,7 @@ enum class Comparator {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
realm.where<Session>().sort("year", Sort.ASCENDING).findFirst()?.year?.let { realm.where<Session>().sort("year", Sort.ASCENDING).findFirst()?.year?.let {
for (index in 0..(yearNow - it)) { for (index in 0..(yearNow - it)) {
years.add(QueryCondition.YEAR().apply { setYear(yearNow - index) }) years.add(QueryCondition.YEAR().apply { intValue = yearNow - index })
} }
} }
realm.close() realm.close()
@ -73,7 +73,8 @@ enum class Comparator {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
realm.where<Session>().distinct("blinds", "bankroll.currency.code").findAll().sort("cgSmallBlind", Sort.ASCENDING).map { realm.where<Session>().distinct("blinds", "bankroll.currency.code").findAll().sort("cgSmallBlind", Sort.ASCENDING).map {
it.blinds?.let { stake -> it.blinds?.let { stake ->
blinds.add(QueryCondition.BLIND().apply { setBlind(stake, it.hasDefaultCurrency)}) blinds.add(QueryCondition.BLIND().apply { blind = stake
hasDefaultCurrency = it.hasDefaultCurrency })
} }
} }
realm.close() realm.close()
@ -84,45 +85,9 @@ enum class Comparator {
TOURNAMENT_NAME-> Criteria.TournamentNames.queryConditions TOURNAMENT_NAME-> Criteria.TournamentNames.queryConditions
TOURNAMENT_FEATURE-> Criteria.TournamentFeatures.queryConditions TOURNAMENT_FEATURE-> Criteria.TournamentFeatures.queryConditions
LOCATION-> Criteria.Locations.queryConditions LOCATION-> Criteria.Locations.queryConditions
LIMIT_TYPE -> { LIMIT_TYPE -> Criteria.Limits.queryConditions
val limits = arrayListOf<QueryCondition.LIMIT>() TABLE_SIZE -> Criteria.TableSizes.queryConditions
val realm = Realm.getDefaultInstance() TOURNAMENT_TYPE -> Criteria.TournamentTypes.queryConditions
val distinctLimitTypes = realm.where<Session>().distinct("limit").findAll().sort("limit", Sort.ASCENDING)
distinctLimitTypes.forEach { session ->
session.limit?.let { limitType->
limits.add(QueryCondition.LIMIT().apply { setLimitType(limitType) })
}
}
realm.close()
limits
}
TABLE_SIZE -> {
val tableSizes = arrayListOf<QueryCondition.TABLE_SIZE>()
val realm = Realm.getDefaultInstance()
val distinctTableSizes =
realm.where<Session>().distinct("tableSize").findAll().sort("tableSize", Sort.ASCENDING)
distinctTableSizes.forEach { session ->
session.tableSize?.let { tableSize ->
tableSizes.add(QueryCondition.TABLE_SIZE().apply { setNumberOfPlayer(tableSize) })
}
}
realm.close()
tableSizes
}
TOURNAMENT_TYPE -> {
val tableSizes = arrayListOf<QueryCondition.TOURNAMENT_TYPE>()
val realm = Realm.getDefaultInstance()
val distinctTournamentTypes =
realm.where<Session>().distinct("tournamentType").findAll().sort("tournamentType", Sort.ASCENDING)
distinctTournamentTypes.forEach { session ->
session.tournamentType?.let { tournamentType ->
tableSizes.add(QueryCondition.TOURNAMENT_TYPE().apply { setTournamentType(tournamentType) })
}
}
realm.close()
tableSizes
}
else -> throw PokerAnalyticsException.QueryTypeUnhandled else -> throw PokerAnalyticsException.QueryTypeUnhandled
} }
} }

@ -1,18 +1,27 @@
package net.pokeranalytics.android.model.filter package net.pokeranalytics.android.model.filter
import android.content.Context
import io.realm.* import io.realm.*
import io.realm.internal.Table
import io.realm.kotlin.where import io.realm.kotlin.where
import io.realm.RealmQuery import io.realm.RealmQuery
import io.realm.internal.Table
import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.model.Limit
import net.pokeranalytics.android.model.TableSize
import net.pokeranalytics.android.model.TournamentType
import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.interfaces.Manageable
import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.realm.*
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow
import net.pokeranalytics.android.util.extensions.endOfDay import net.pokeranalytics.android.util.extensions.endOfDay
import net.pokeranalytics.android.util.extensions.startOfDay import net.pokeranalytics.android.util.extensions.startOfDay
import java.util.* import java.util.*
import kotlin.collections.ArrayList
fun List<QueryCondition>.name() : String { fun List<QueryCondition>.name() : String {
return this.map { it.name }.joinToString(" / ") return this.map { it.id }.joinToString(" / ")
} }
//inline fun <reified T : Filterable> List<QueryCondition>.query(realm: Realm): RealmQuery<T> { //inline fun <reified T : Filterable> List<QueryCondition>.query(realm: Realm): RealmQuery<T> {
@ -34,17 +43,86 @@ inline fun <reified T : Filterable> List<QueryCondition>.queryWith(query: RealmQ
* A new type should also set the expected numericValues required in the [filterValuesExpectedKeys] * A new type should also set the expected numericValues required in the [filterValuesExpectedKeys]
*/ */
sealed class QueryCondition(var operator: Operator? = null) { sealed class QueryCondition : FilterElementRow {
abstract class QueryDataCondition < T: Identifiable> : QueryCondition() { interface asListOfDouble { var doubleValues : ArrayList<Double> }
fun setObject(dataObject:T) { interface asListOfBoolean { var booleanValues : ArrayList<Boolean> }
this.valueMap = mapOf("ids" to arrayListOf(dataObject.id)) interface asListOfString { var stringValues : ArrayList<String> }
} interface asDateValue {
var dateValue: Date
var showTime: Boolean
}
interface asListOfInt : asListOfDouble {
var intValues : ArrayList<Int>
get() { return ArrayList(doubleValues.map { it.toInt() }) }
set(value) { doubleValues = ArrayList(value.map { it.toDouble() })}
}
interface asIntValue : asListOfInt {
var intValue: Int
get() { return intValues.first() }
set(value) { intValues = arrayListOf(value) }
}
interface asDoubleValue : asListOfDouble {
var doubleValue : Double
get() { return doubleValues.first() }
set(value) { doubleValues = arrayListOf(value) }
} }
interface Duration: asDoubleValue {
var minutes: Int
get() { return doubleValue.toInt() }
set(value) { doubleValue = value.toDouble() }
}
class MoreQueryCondition : QueryCondition(Operator.MORE) interface Amount: asDoubleValue {
class LessQueryCondition : QueryCondition(Operator.LESS) var amount: Double
get() { return doubleValue }
set(value) { doubleValue = value }
}
interface More
interface Less
interface Between : asListOfDouble {
val leftValue: Double get() { return doubleValues.first() }
val rightValue: Double get() { return doubleValues.last() }
}
interface BetweenLeftExclusive : Between
interface BetweenRightExclusive : Between
val id: String get() { return this::class.simpleName ?: throw PokerAnalyticsException.FilterElementUnknownName }
override var filterSectionRow: FilterSectionRow = FilterSectionRow.CASH_TOURNAMENT
open class OperationQueryCondition : QueryCondition(), asDoubleValue {
override var doubleValues = ArrayList<Double>()
}
open class BetweenQueryCondition : QueryCondition(), asListOfDouble {
override var doubleValues = ArrayList<Double>()
}
abstract class QueryDataCondition < T: Identifiable> : QueryCondition(), asListOfString {
fun setObject(dataObject: T) {
this.dataObject = dataObject
this.stringValues.add(dataObject.id)
}
var dataObject: Identifiable? = null
override var stringValues = ArrayList<String>()
val name: String
get() {
if (stringValues.size > 1) {
return "multiple"
} else {
return (dataObject as RowRepresentable).getDisplayName()
}
return "todo"
}
}
companion object { companion object {
fun valueOf(name:String) : QueryCondition { fun valueOf(name:String) : QueryCondition {
@ -55,7 +133,11 @@ sealed class QueryCondition(var operator: Operator? = null) {
inline fun <reified T:Identifiable>getInstance(): QueryCondition { inline fun <reified T:Identifiable>getInstance(): QueryCondition {
return when (T::class.java) { return when (T::class.java) {
is Bankroll -> BANKROLL() Bankroll::class.java -> BANKROLL()
Game::class.java -> GAME()
Location::class.java -> LOCATION()
TournamentName::class.java -> TOURNAMENT_NAME()
TournamentFeature::class.java -> ANY_TOURNAMENT_FEATURES()
else -> throw PokerAnalyticsException.QueryTypeUnhandled else -> throw PokerAnalyticsException.QueryTypeUnhandled
} }
} }
@ -73,21 +155,15 @@ sealed class QueryCondition(var operator: Operator? = null) {
} }
val name: String = this::class.simpleName ?: throw PokerAnalyticsException.FilterElementUnknownName //open val name: String = this::class.simpleName ?: throw PokerAnalyticsException.FilterElementUnknownName
enum class Operator { abstract class SingleValueQueryCondition : QueryCondition(), asIntValue {
BETWEEN, override var doubleValues = ArrayList<Double>()
MORE,
LESS,
BETWEEN_RIGHT_EXCLUSIVE,
BETWEEN_LEFT_EXCLUSIVE,
;
} }
open class SingleValueQueryCondition : QueryCondition() { abstract class StaticDataQueryCondition : QueryCondition(), asListOfInt {
fun setValue(value:Int) { var data : RowRepresentable? = null
this.valueMap = mapOf("values" to arrayListOf(value)) override var doubleValues = ArrayList<Double>()
}
} }
object LIVE : QueryCondition() object LIVE : QueryCondition()
@ -100,82 +176,99 @@ sealed class QueryCondition(var operator: Operator? = null) {
class ANY_TOURNAMENT_FEATURES: QueryDataCondition<TournamentFeature>() class ANY_TOURNAMENT_FEATURES: QueryDataCondition<TournamentFeature>()
class ALL_TOURNAMENT_FEATURES: QueryDataCondition<TournamentFeature>() class ALL_TOURNAMENT_FEATURES: QueryDataCondition<TournamentFeature>()
class LOCATION: QueryDataCondition<Location>() class LOCATION: QueryDataCondition<Location>()
class LIMIT: SingleValueQueryCondition() {
fun setLimitType(limitType: Int) { class LIMIT: StaticDataQueryCondition() {
this.valueMap = mapOf("values" to limitType) val limit : Limit get() { return Limit.values()[intValues.first()] }
} val name: String
get() {
if (intValues.size > 1) {
return "multiple"
} else {
return Limit.values()[intValues.first()].longName
}
return "todo"
}
} }
class TABLE_SIZE: SingleValueQueryCondition() { class TABLE_SIZE: StaticDataQueryCondition() {
fun setNumberOfPlayer(numberOfPlayer: Int) { val tableSize: TableSize get() { return TableSize.all[intValues.first()] }
this.valueMap = mapOf("values" to numberOfPlayer)
override fun localizedTitle(context: Context): String {
return this.tableSize.localizedTitle(context)
} }
} }
class TOURNAMENT_TYPE: SingleValueQueryCondition() { class TOURNAMENT_TYPE: StaticDataQueryCondition() {
fun setTournamentType(tournamentType:Int) { val name: String
this.valueMap = mapOf("values" to tournamentType) get() {
} if (intValues.size > 1) {
return "multiple"
} else {
return TournamentType.values()[intValues.first()].getDisplayName()
}
return "todo"
}
} }
class BLIND: QueryCondition() { class BLIND: QueryCondition(), asListOfString, asListOfBoolean {
fun setBlind(blind:String, hasDefaultCurrency:Boolean) { var blind: String? = null
this.valueMap = mapOf( var hasDefaultCurrency: Boolean = false
"blinds" to blind, override var booleanValues = ArrayList<Boolean>()
"hasDefaultCurrency" to hasDefaultCurrency) override var stringValues = ArrayList<String>()
}
} }
class LAST_GAMES: QueryCondition()
class LAST_SESSIONS: QueryCondition() class LAST_GAMES: SingleValueQueryCondition()
class MORE_NUMBER_OF_TABLE: QueryCondition(Operator.MORE) class LAST_SESSIONS: SingleValueQueryCondition()
class LESS_NUMBER_OF_TABLE: QueryCondition(Operator.LESS)
class BETWEEN_NUMBER_OF_TABLE: QueryCondition(Operator.BETWEEN) class MORE_NUMBER_OF_TABLE: OperationQueryCondition(), More
class MORE_THAN_NET_RESULT: QueryCondition(Operator.MORE) class LESS_NUMBER_OF_TABLE: OperationQueryCondition(), Less
class LESS_THAN_NET_RESULT: QueryCondition(Operator.LESS) class BETWEEN_NUMBER_OF_TABLE: BetweenQueryCondition(), Between
class MORE_THAN_BUY_IN: QueryCondition(Operator.MORE)
class LESS_THAN_BUY_IN: QueryCondition(Operator.LESS) class MORE_THAN_NET_RESULT: OperationQueryCondition(), More, Amount
class MORE_THAN_CASH_OUT: QueryCondition(Operator.MORE) class LESS_THAN_NET_RESULT: OperationQueryCondition(), Less, Amount
class LESS_THAN_CASH_OUT: QueryCondition(Operator.LESS)
class MORE_THAN_TIPS: QueryCondition(Operator.MORE) class MORE_THAN_BUY_IN: OperationQueryCondition(), More, Amount
class LESS_THAN_TIPS: QueryCondition(Operator.LESS) class LESS_THAN_BUY_IN: OperationQueryCondition(), Less, Amount
class MORE_THAN_NUMBER_OF_PLAYER: QueryCondition(Operator.MORE)
class LESS_THAN_NUMBER_OF_PLAYER: QueryCondition(Operator.LESS) class MORE_THAN_CASH_OUT: OperationQueryCondition(), More, Amount
class BETWEEN_NUMBER_OF_PLAYER: QueryCondition(Operator.BETWEEN) class LESS_THAN_CASH_OUT: OperationQueryCondition(), Less, Amount
class MORE_THAN_TOURNAMENT_FEE: QueryCondition(Operator.MORE)
class LESS_THAN_TOURNAMENT_FEE: QueryCondition(Operator.LESS) class MORE_THAN_TIPS: OperationQueryCondition(), More, Amount
class BETWEEN_TOURNAMENT_FEE: QueryCondition(Operator.BETWEEN_RIGHT_EXCLUSIVE) { class LESS_THAN_TIPS: OperationQueryCondition(), Less, Amount
class MORE_THAN_NUMBER_OF_PLAYER: OperationQueryCondition(), More
class LESS_THAN_NUMBER_OF_PLAYER: OperationQueryCondition(), Less
class BETWEEN_NUMBER_OF_PLAYER: BetweenQueryCondition(), Between
class MORE_THAN_TOURNAMENT_FEE: OperationQueryCondition(), More
class LESS_THAN_TOURNAMENT_FEE: OperationQueryCondition(), Less
class BETWEEN_TOURNAMENT_FEE: BetweenQueryCondition(), BetweenRightExclusive {
fun between(leftValue:Double, rightValue:Double) { fun between(leftValue:Double, rightValue:Double) {
this.valueMap = mapOf( doubleValues.add(leftValue)
"leftValue" to leftValue, doubleValues.add(rightValue)
"rightValue" to rightValue
)
} }
} }
class MIN_RE_BUY: QueryCondition(Operator.MORE) class MIN_RE_BUY: OperationQueryCondition(), More
class MAX_RE_BUY: QueryCondition(Operator.LESS) class MAX_RE_BUY: OperationQueryCondition(), Less
// Dates // Dates
class STARTED_FROM_DATE: QueryCondition() open class DateQuery: QueryCondition(), asDateValue {
class STARTED_TO_DATE: QueryCondition() override var dateValue: Date = Date()
class ENDED_FROM_DATE: QueryCondition() override var showTime: Boolean = false
class ENDED_TO_DATE: QueryCondition()
class DAY_OF_WEEK: QueryCondition() {
fun setDay(dayOfWeek:Int) {
this.valueMap = mapOf("dayOfWeek" to dayOfWeek)
}
} }
class MONTH: QueryCondition() { open class TimeQuery: DateQuery() {
fun setMonth(month:Int) { override var showTime: Boolean = true
this.valueMap = mapOf("month" to month)
}
}
class YEAR: QueryCondition() {
fun setYear(year:Int) {
this.valueMap = mapOf("year" to year)
}
} }
class STARTED_FROM_DATE: DateQuery()
class STARTED_TO_DATE: DateQuery(), Less
class ENDED_FROM_DATE: DateQuery()
class ENDED_TO_DATE: DateQuery(), Less
class DAY_OF_WEEK: SingleValueQueryCondition()
class MONTH: SingleValueQueryCondition()
class YEAR: SingleValueQueryCondition()
object WEEK_DAY: QueryCondition() object WEEK_DAY: QueryCondition()
object WEEK_END: QueryCondition() object WEEK_END: QueryCondition()
object TODAY: QueryCondition() object TODAY: QueryCondition()
@ -184,51 +277,14 @@ sealed class QueryCondition(var operator: Operator? = null) {
object THIS_WEEK: QueryCondition() object THIS_WEEK: QueryCondition()
object THIS_MONTH: QueryCondition() object THIS_MONTH: QueryCondition()
object THIS_YEAR: QueryCondition() object THIS_YEAR: QueryCondition()
class PAST_DAYS: QueryCondition() class PAST_DAYS: SingleValueQueryCondition()
class MORE_THAN_DURATION: QueryCondition(Operator.MORE) class MORE_THAN_DURATION: OperationQueryCondition(), More, Duration
class LESS_THAN_DURATION: QueryCondition(Operator.LESS) class LESS_THAN_DURATION: OperationQueryCondition(), Less, Duration
class STARTED_FROM_TIME: QueryCondition() class STARTED_FROM_TIME: TimeQuery()
class ENDED_TO_TIME: QueryCondition() class ENDED_TO_TIME: TimeQuery(), Less
class COMMENT: QueryCondition() class COMMENT: QueryCondition()
var valueMap : Map<String, Any?>? = null
get() {
this.filterValuesExpectedKeys?.let { valueMapExceptedKeys ->
field?.let { map ->
val missingKeys = map.keys.filter { !valueMapExceptedKeys.contains(it) }
if (map.keys.size == valueMapExceptedKeys.size && missingKeys.isNotEmpty()) {
throw PokerAnalyticsException.QueryValueMapMissingKeys(missingKeys)
}
} ?: run {
throw PokerAnalyticsException.QueryValueMapUnexpectedValue
}
}
return field
}
protected set
private val filterValuesExpectedKeys : Array<String>?
get() {
this.operator?.let {
return when (it) {
Operator.BETWEEN -> arrayOf("leftValue", "rightValue")
else -> arrayOf("value")
}
}
return when (this) {
is BANKROLL, is GAME, is LOCATION, is ANY_TOURNAMENT_FEATURES, is ALL_TOURNAMENT_FEATURES, is TOURNAMENT_NAME -> arrayOf("ids")
is LIMIT, is TOURNAMENT_TYPE, is TABLE_SIZE -> arrayOf("values")
is BLIND -> arrayOf("blinds", "hasDefaultCurrency")
is STARTED_FROM_DATE, is STARTED_TO_DATE, is ENDED_FROM_DATE, is ENDED_TO_DATE -> arrayOf("date")
is DAY_OF_WEEK -> arrayOf("dayOfWeek")
is MONTH -> arrayOf("month")
is YEAR -> arrayOf("year")
else -> null
}
}
/** /**
* main method of the enum * main method of the enum
* providing a base RealmQuery [realmQuery], the method is able to attached the corresponding query and returns the newly formed [RealmQuery] * providing a base RealmQuery [realmQuery], the method is able to attached the corresponding query and returns the newly formed [RealmQuery]
@ -236,50 +292,29 @@ sealed class QueryCondition(var operator: Operator? = null) {
inline fun <reified T : Filterable> queryWith(realmQuery: RealmQuery<T>): RealmQuery<T> { inline fun <reified T : Filterable> queryWith(realmQuery: RealmQuery<T>): RealmQuery<T> {
val fieldName = FilterHelper.fieldNameForQueryType<T>(this::class.java) val fieldName = FilterHelper.fieldNameForQueryType<T>(this::class.java)
fieldName ?: throw PokerAnalyticsException.QueryValueMapUnknown fieldName ?: throw PokerAnalyticsException.QueryValueMapUnknown
when (operator) {
Operator.LESS -> {
val value: Double by valueMap
return realmQuery.lessThanOrEqualTo(fieldName, value)
}
Operator.MORE -> {
val value: Double by valueMap
return realmQuery.greaterThanOrEqualTo(fieldName, value)
}
Operator.BETWEEN -> {
val leftValue: Double by valueMap
val rightValue: Double by valueMap
return realmQuery.between(fieldName, leftValue, rightValue)
}
Operator.BETWEEN_LEFT_EXCLUSIVE -> {
val leftValue: Double by valueMap
val rightValue: Double by valueMap
return realmQuery.greaterThan(fieldName, leftValue).and().lessThanOrEqualTo(fieldName, rightValue)
}
Operator.BETWEEN_RIGHT_EXCLUSIVE-> {
val leftValue: Double by valueMap
val rightValue: Double by valueMap
return realmQuery.greaterThanOrEqualTo(fieldName, leftValue).and().lessThan(fieldName, rightValue)
}
}
return when (this) { return when (this) {
is Amount -> {
if (this is Less) {
realmQuery.lessThanOrEqualTo(fieldName, amount)
} else {
realmQuery.greaterThanOrEqualTo(fieldName, amount)
}
}
is Between -> realmQuery.between(fieldName, leftValue, rightValue)
is BetweenLeftExclusive -> realmQuery.greaterThan(fieldName, leftValue).and().lessThanOrEqualTo(fieldName, rightValue)
is BetweenRightExclusive -> realmQuery.greaterThanOrEqualTo(fieldName, leftValue).and().lessThan(fieldName, rightValue)
LIVE, ONLINE -> realmQuery.equalTo(fieldName, this == LIVE) LIVE, ONLINE -> realmQuery.equalTo(fieldName, this == LIVE)
CASH -> realmQuery.equalTo(fieldName, Session.Type.CASH_GAME.ordinal) CASH -> realmQuery.equalTo(fieldName, Session.Type.CASH_GAME.ordinal)
TOURNAMENT -> realmQuery.equalTo(fieldName, Session.Type.TOURNAMENT.ordinal) TOURNAMENT -> realmQuery.equalTo(fieldName, Session.Type.TOURNAMENT.ordinal)
is ALL_TOURNAMENT_FEATURES -> { is ALL_TOURNAMENT_FEATURES -> {
val ids: Array<String> by valueMap stringValues.forEach {
ids.forEach {
realmQuery.equalTo(fieldName, it) realmQuery.equalTo(fieldName, it)
} }
realmQuery realmQuery
} }
is ANY_TOURNAMENT_FEATURES -> {
val ids: Array<String> by valueMap
realmQuery.`in`(fieldName, ids)
}
is BLIND -> { is BLIND -> {
val blinds: Array<String> by valueMap val blinds: Array<String> = stringValues.toTypedArray()
val hasDefaultCurrency: Array<Boolean> by valueMap val hasDefaultCurrency: Array<Boolean> = booleanValues.toTypedArray()
//realmQuery.`in`(fieldName, blinds) //realmQuery.`in`(fieldName, blinds)
blinds.forEachIndexed { index, s -> blinds.forEachIndexed { index, s ->
val isUsingDefaultCurrency = hasDefaultCurrency[index] val isUsingDefaultCurrency = hasDefaultCurrency[index]
@ -298,42 +333,18 @@ sealed class QueryCondition(var operator: Operator? = null) {
} }
realmQuery realmQuery
} }
is BANKROLL, is GAME, is LOCATION, is TOURNAMENT_NAME -> { is QueryDataCondition<*> -> realmQuery.`in`(fieldName, stringValues.toTypedArray())
val ids: Array<String> by valueMap is StaticDataQueryCondition -> {
realmQuery.`in`(fieldName, ids) realmQuery.`in`(fieldName, intValues.toTypedArray())
}
is LIMIT, is TOURNAMENT_TYPE, is TABLE_SIZE -> {
val values: Array<Int?>? by valueMap
realmQuery.`in`(fieldName, values)
}
is STARTED_FROM_DATE -> {
val date: Date by valueMap
realmQuery.greaterThanOrEqualTo(fieldName, date)
}
is STARTED_TO_DATE -> {
val date: Date by valueMap
realmQuery.lessThanOrEqualTo(fieldName, date)
}
is ENDED_FROM_DATE -> {
val date: Date by valueMap
realmQuery.greaterThanOrEqualTo(fieldName, date)
} }
is ENDED_TO_DATE -> { is DateQuery -> {
val date: Date by valueMap if (this is Less) {
realmQuery.lessThanOrEqualTo(fieldName, date) realmQuery.lessThanOrEqualTo(fieldName, dateValue)
} } else {
is DAY_OF_WEEK -> { realmQuery.greaterThanOrEqualTo(fieldName, dateValue)
val dayOfWeek: Int by valueMap }
realmQuery.equalTo(fieldName, dayOfWeek)
}
is MONTH -> {
val month: Int by valueMap
realmQuery.equalTo(fieldName, month)
}
is YEAR -> {
val year: Int by valueMap
realmQuery.equalTo(fieldName, year)
} }
is SingleValueQueryCondition -> realmQuery.equalTo(fieldName, intValue)
WEEK_END, WEEK_DAY -> { WEEK_END, WEEK_DAY -> {
var query = realmQuery var query = realmQuery
if (this == WEEK_DAY) { if (this == WEEK_DAY) {
@ -386,42 +397,13 @@ sealed class QueryCondition(var operator: Operator? = null) {
} }
fun updateValueMap(filterCondition: FilterCondition) { fun updateValueMap(filterCondition: FilterCondition) {
if (filterValuesExpectedKeys == null) {
return
}
this.operator?.let {
valueMap = mapOf("value" to filterCondition.value)
return
}
when (this) { when (this) {
is BANKROLL -> valueMap = mapOf("ids" to filterCondition.ids) is asListOfDouble -> filterCondition.doubleValues.map { doubleValues.add(it) }
is ALL_TOURNAMENT_FEATURES, is ANY_TOURNAMENT_FEATURES, is GAME, is LOCATION, is TOURNAMENT_NAME -> { is QueryDataCondition<*> -> filterCondition.ids.map { stringValues.add(it) }
valueMap = mapOf("ids" to filterCondition.ids) is DateQuery -> dateValue = filterCondition.date
}
is LIMIT, is TOURNAMENT_TYPE, is TABLE_SIZE -> {
valueMap = mapOf("values" to filterCondition.values)
}
is BLIND -> { is BLIND -> {
valueMap = mapOf( filterCondition.blinds.map { stringValues.add(it) }
"blinds" to filterCondition.blinds, filterCondition.hasDefaultCurrency.map { booleanValues.add(it) }
"hasDefaultCurrency" to filterCondition.hasDefaultCurrency)
}
is STARTED_FROM_DATE, is STARTED_TO_DATE, is ENDED_FROM_DATE, is ENDED_TO_DATE -> {
valueMap = mapOf("date" to filterCondition.date)
}
is DAY_OF_WEEK -> {
valueMap = mapOf("dayOfWeek" to filterCondition.dayOfWeek)
}
is MONTH -> {
valueMap = mapOf("month" to filterCondition.month)
}
is YEAR -> {
valueMap = mapOf("year" to filterCondition.year)
}
else -> {
throw PokerAnalyticsException.QueryValueMapUnexpectedValue
} }
} }
} }

@ -44,6 +44,7 @@ open class Filter : RealmObject() {
inline fun <reified T : Filterable> queryOn(realm: Realm, queries: List<QueryCondition>): RealmResults<T> { inline fun <reified T : Filterable> queryOn(realm: Realm, queries: List<QueryCondition>): RealmResults<T> {
var realmQuery = realm.where<T>() var realmQuery = realm.where<T>()
queries.forEach { queries.forEach {
Timber.d(">>> sub Filter query: ${realmQuery.description}")
realmQuery = it.queryWith(realmQuery) realmQuery = it.queryWith(realmQuery)
} }
Timber.d(">>> Filter query: ${realmQuery.description}") Timber.d(">>> Filter query: ${realmQuery.description}")
@ -64,8 +65,8 @@ open class Filter : RealmObject() {
var filterConditions: RealmList<FilterCondition> = RealmList() var filterConditions: RealmList<FilterCondition> = RealmList()
private set private set
fun createOrUpdateFilterConditions(filterConditionRows: ArrayList<FilterElementRow>) { fun createOrUpdateFilterConditions(filterConditionRows: ArrayList<QueryCondition>) {
val casted = arrayListOf<FilterElementRow>() val casted = arrayListOf<QueryCondition>()
filterConditionRows filterConditionRows
.map { .map {
it.id it.id
@ -95,7 +96,7 @@ open class Filter : RealmObject() {
} }
} }
fun contains(filterElementRow: FilterElementRow): Boolean { fun contains(filterElementRow: QueryCondition): Boolean {
val filtered = filterConditions.filter { val filtered = filterConditions.filter {
it.filterName == filterElementRow.id it.filterName == filterElementRow.id
} }
@ -105,34 +106,16 @@ open class Filter : RealmObject() {
return filterElementRow.contains(filtered) return filterElementRow.contains(filtered)
} }
/**
* Set the saved value in the queryWith for the given [filterElementRow]
*/
fun setSavedValueForElement(filterElementRow: FilterElementRow) {
when (filterElementRow) {
is FilterElementRow.PastDays -> {
val values = getSavedValueForElement(filterElementRow) as Array<*>
if (values.isNotEmpty() && values.first() is Int) {
filterElementRow.lastDays = values.first() as Int
}
}
is FilterElementRow.DateFilterElementRow -> filterElementRow.dateValue = getSavedValueForElement(filterElementRow) as Date? ?: Date()
}
}
/** /**
* Get the saved value for the given [filterElementRow] * Get the saved value for the given [filterElementRow]
*/ */
private fun getSavedValueForElement(filterElementRow: FilterElementRow): Any? { fun loadValueForElement(filterElementRow: QueryCondition) {
val filtered = filterConditions.filter { val filtered = filterConditions.filter {
it.filterName == filterElementRow.id it.filterName == filterElementRow.id
} }
if (filtered.isNotEmpty()) { if (filtered.isNotEmpty()) {
return filtered.first().getFilterConditionValue(filterElementRow) return filterElementRow.updateValueMap(filtered.first())
} }
return null
} }
inline fun <reified T : Filterable> results(): RealmResults<T> { inline fun <reified T : Filterable> results(): RealmResults<T> {

@ -4,8 +4,6 @@ import io.realm.RealmList
import io.realm.RealmObject import io.realm.RealmObject
import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow.*
import java.util.* import java.util.*
open class FilterCondition() : RealmObject() { open class FilterCondition() : RealmObject() {
@ -15,38 +13,39 @@ open class FilterCondition() : RealmObject() {
this.sectionName = sectionName this.sectionName = sectionName
} }
constructor(filterElementRows: ArrayList<FilterElementRow>) : this(filterElementRows.first().id, filterElementRows.first().filterSectionRow.name) { constructor(filterElementRows: ArrayList<QueryCondition>) : this(filterElementRows.first().id, filterElementRows.first().filterSectionRow.name) {
val row = filterElementRows.first() val row = filterElementRows.first()
this.filterName ?: throw PokerAnalyticsException.FilterElementUnknownName this.filterName ?: throw PokerAnalyticsException.FilterElementUnknownName
when (row) { when (row) {
is DateFilterElementRow -> { is QueryCondition.asDateValue -> {
this.dateValue = row.dateValue this.dateValue = row.dateValue
} }
is Blind -> { is QueryCondition.BLIND -> {
//TODO refactor raz //TODO refactor raz
this.stringValues = RealmList<String>().apply { this.stringValues = RealmList<String>().apply {
this.addAll(filterElementRows.map { this.addAll(filterElementRows.map {
(it as Blind).blind (it as QueryCondition.BLIND).blind
}) })
} }
this.booleanValues = RealmList<Boolean>().apply { this.booleanValues = RealmList<Boolean>().apply {
this.addAll(filterElementRows.map { this.addAll(filterElementRows.map {
(it as Blind).hasDefaultCurrency (it as QueryCondition.BLIND).hasDefaultCurrency
}) })
} }
} }
is StringFilterElementRow -> { is QueryCondition.asListOfString -> {
this.stringValues = RealmList<String>().apply { this.stringValues = RealmList<String>().apply {
this.addAll(filterElementRows.map { this.addAll(filterElementRows.map {
(it as StringFilterElementRow).stringValue (it as QueryCondition.asListOfString).stringValues.firstOrNull()
}) })
} }
} }
is NumericFilterElementRow -> { is QueryCondition.asListOfDouble -> {
this.numericValues = RealmList<Double>().apply { this.numericValues = RealmList<Double>().apply {
this.addAll(filterElementRows.map { this.addAll(filterElementRows.map {
(it as NumericFilterElementRow).doubleValue (it as QueryCondition.asListOfDouble).doubleValues.firstOrNull()
}) })
} }
} }
@ -80,45 +79,19 @@ open class FilterCondition() : RealmObject() {
get() = dateValue ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing get() = dateValue ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing
val values: Array<Int> val intValues: Array<Int>
get() = numericValues?.map { get() = numericValues?.map {
println("test double: $it")
it.toInt() it.toInt()
}?.toTypedArray() ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing }?.toTypedArray() ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing
val value: Double val doubleValue: Double
get() = numericValues?.first() ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing
val leftValue: Double
get() = numericValues?.first() ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing get() = numericValues?.first() ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing
val intValue: Int
get() = numericValues?.first()?.toInt() ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing
val rightValue: Double val doubleValues: Array<Double>
get() = numericValues?.last() ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing get() = numericValues?.toTypedArray() ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing
val dayOfWeek: Int
get() = numericValues?.first()?.toInt() ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing
val month: Int
get() = numericValues?.first()?.toInt() ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing
val year: Int
get() = numericValues?.first()?.toInt() ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing
/**
* Return the value associated with the given [filterElementRow]
*/
fun getFilterConditionValue(filterElementRow: FilterElementRow): Any? {
return when (filterElementRow) {
is DateFilterElementRow -> date
is PastDays -> values
else -> throw PokerAnalyticsException.FilterElementTypeMissing(filterElementRow)
}
}
} }

@ -253,12 +253,10 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
if (!computedResults.isEmpty) { if (!computedResults.isEmpty) {
// Set date data // Set date data
conditions.forEach { condition -> conditions.forEach { condition ->
condition.valueMap?.get("year")?.let { year -> when (condition) {
calendar.set(Calendar.YEAR, year as Int) is QueryCondition.YEAR -> calendar.set(Calendar.YEAR, condition.intValue)
} is QueryCondition.MONTH -> calendar.set(Calendar.YEAR, condition.intValue)
condition.valueMap?.get("month")?.let { month -> }
calendar.set(Calendar.MONTH, month as Int)
}
} }
monthlyReports[calendar.time] = computedResults monthlyReports[calendar.time] = computedResults
@ -281,9 +279,9 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
if (!computedResults.isEmpty) { if (!computedResults.isEmpty) {
// Set date data // Set date data
conditions.forEach { condition -> conditions.forEach { condition ->
condition.valueMap?.get("year")?.let { year -> when (condition) {
calendar.set(Calendar.YEAR, year as Int) is QueryCondition.YEAR -> calendar.set(Calendar.YEAR, condition.intValue)
} }
} }
yearlyReports[calendar.time] = computedResults yearlyReports[calendar.time] = computedResults
} }

@ -11,6 +11,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.fragment_filter_details.* import kotlinx.android.synthetic.main.fragment_filter_details.*
import kotlinx.android.synthetic.main.fragment_filter_details.view.* import kotlinx.android.synthetic.main.fragment_filter_details.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.ui.activity.FilterDetailsActivity import net.pokeranalytics.android.ui.activity.FilterDetailsActivity
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
@ -45,7 +46,7 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresent
private var primaryKey: String? = null private var primaryKey: String? = null
private var filterMenu: Menu? = null private var filterMenu: Menu? = null
private var filterCategoryRow: FilterCategoryRow? = null private var filterCategoryRow: FilterCategoryRow? = null
private val selectedRows = ArrayList<FilterElementRow>() private val selectedRows = ArrayList<QueryCondition>()
private var isUpdating = false private var isUpdating = false
private var shouldOpenKeyboard = true private var shouldOpenKeyboard = true
@ -70,29 +71,19 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresent
Timber.d("Row: $row") Timber.d("Row: $row")
when (row) { when (row) {
is FilterElementRow.DateFilterElementRow -> DateTimePickerManager.create(requireContext(), row, this, row.dateValue, onlyDate = !row.showTime, onlyTime = row.showTime) is QueryCondition.DateQuery -> DateTimePickerManager.create(requireContext(), row, this, row.dateValue, onlyDate = !row.showTime, onlyTime = row.showTime)
is FilterElementRow.PastDays -> { is QueryCondition.SingleValueQueryCondition -> {
val pastDays = if (row.lastDays > 0) row.lastDays.toString() else "" val valueAsString = if (row.intValue > 0) row.intValue.toString() else ""
val data = row.editingDescriptors(mapOf("pastDays" to pastDays)) val data = row.editingDescriptors(mapOf("valueAsString" to valueAsString))
BottomSheetFragment.create(fragmentManager, row, this, data, true) BottomSheetFragment.create(fragmentManager, row, this, data, true)
} }
is FilterElementRow.LastGames -> { is QueryCondition.Duration-> {
val lastGames = if (row.lastGames > 0) row.lastGames.toString() else ""
val data = row.editingDescriptors(mapOf("lastGames" to lastGames))
BottomSheetFragment.create(fragmentManager, row, this, data, true)
}
is FilterElementRow.LastSessions -> {
val lastSessions = if (row.lastSessions > 0) row.lastSessions.toString() else ""
val data = row.editingDescriptors(mapOf("lastSessions" to lastSessions))
BottomSheetFragment.create(fragmentManager, row, this, data, true)
}
is FilterElementRow.DurationFilterElement -> {
val hours = if (row.minutes / 60 > 0) (row.minutes / 60).toString() else "" val hours = if (row.minutes / 60 > 0) (row.minutes / 60).toString() else ""
val minutes = if (row.minutes % 60 > 0) (row.minutes % 60).toString() else "" val minutes = if (row.minutes % 60 > 0) (row.minutes % 60).toString() else ""
val data = row.editingDescriptors(mapOf("hours" to hours, "minutes" to minutes)) val data = row.editingDescriptors(mapOf("hours" to hours, "minutes" to minutes))
BottomSheetFragment.create(fragmentManager, row, this, data, true) BottomSheetFragment.create(fragmentManager, row, this, data, true)
} }
is FilterElementRow.AmountFilterElement -> { is QueryCondition.Amount -> {
val amount = if (row.amount > 0) row.amount.toString() else "" val amount = if (row.amount > 0) row.amount.toString() else ""
val data = row.editingDescriptors(mapOf("amount" to amount)) val data = row.editingDescriptors(mapOf("amount" to amount))
BottomSheetFragment.create(fragmentManager, row, this, data, true) BottomSheetFragment.create(fragmentManager, row, this, data, true)
@ -105,12 +96,10 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresent
override fun stringForRow(row: RowRepresentable): String { override fun stringForRow(row: RowRepresentable): String {
return when (row) { return when (row) {
is FilterElementRow.PastDays -> if (row.lastDays > 0) row.lastDays.toString() else NULL_TEXT is QueryCondition.SingleValueQueryCondition -> if (row.intValue > 0) row.intValue.toString() else NULL_TEXT
is FilterElementRow.LastGames -> if (row.lastGames > 0) row.lastGames.toString() else NULL_TEXT is QueryCondition.DateQuery -> if (row.showTime) row.dateValue.shortTime() else row.dateValue.shortDate()
is FilterElementRow.LastSessions -> if (row.lastSessions > 0) row.lastSessions.toString() else NULL_TEXT is QueryCondition.Amount -> if (row.amount > 0) row.amount.toString() else NULL_TEXT
is FilterElementRow.DateFilterElementRow -> if (row.showTime) row.dateValue.shortTime() else row.dateValue.shortDate() is QueryCondition.Duration -> row.minutes.toMinutes(requireContext())
is FilterElementRow.AmountFilterElement -> if (row.amount > 0) row.amount.toString() else NULL_TEXT
is FilterElementRow.DurationFilterElement -> row.minutes.toMinutes(requireContext())
else -> super.stringForRow(row) else -> super.stringForRow(row)
} }
} }
@ -124,12 +113,9 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresent
Timber.d("onRowValueChanged: $row $value") Timber.d("onRowValueChanged: $row $value")
when (row) { when (row) {
is FilterElementRow.DateFilterElementRow -> row.dateValue = if (value != null && value is Date) value else Date() is QueryCondition.DateQuery -> row.dateValue = if (value != null && value is Date) value else Date()
is FilterElementRow.PastDays -> row.lastDays = if (value != null && value is String) value.toInt() else 0 is QueryCondition.SingleValueQueryCondition -> row.intValue = if (value != null && value is String) value.toInt() else 0
is FilterElementRow.LastGames -> row.lastGames = if (value != null && value is String) value.toInt() else 0 is QueryCondition.Duration -> {
is FilterElementRow.LastSessions -> row.lastSessions = if (value != null && value is String) value.toInt() else 0
is FilterElementRow.AmountFilterElement -> row.amount = if (value != null && value is String) value.toDouble() else 0.0
is FilterElementRow.DurationFilterElement -> {
if (value is ArrayList<*>) { if (value is ArrayList<*>) {
val hours = try { val hours = try {
(value[0] as String? ?: "0").toInt() (value[0] as String? ?: "0").toInt()
@ -201,8 +187,8 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresent
this.rows.addAll(it.filterElements) this.rows.addAll(it.filterElements)
this.rows.forEach { element -> this.rows.forEach { element ->
if (element is FilterElementRow && currentFilter?.contains(element) == true) { if (element is QueryCondition && currentFilter?.contains(element) == true) {
currentFilter?.setSavedValueForElement(element) currentFilter?.loadValueForElement(element)
this.selectedRows.add(element) this.selectedRows.add(element)
} }
} }
@ -230,7 +216,7 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresent
rowRepresentableAdapter.refreshRow(it) rowRepresentableAdapter.refreshRow(it)
} }
} }
selectedRows.add(row) selectedRows.add(row as QueryCondition)
} }
} }

@ -3,8 +3,7 @@ package net.pokeranalytics.android.ui.view.rowrepresentable
import android.content.Context import android.content.Context
import android.text.InputType import android.text.InputType
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.interfaces.Manageable
import net.pokeranalytics.android.model.realm.FilterCondition import net.pokeranalytics.android.model.realm.FilterCondition
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
@ -13,379 +12,124 @@ import net.pokeranalytics.android.ui.view.RowViewType
import java.text.DateFormatSymbols import java.text.DateFormatSymbols
import java.util.* import java.util.*
sealed class FilterElementRow : RowRepresentable { interface FilterElementRow : RowRepresentable {
interface Duration { fun contains(filterConditions: List<FilterCondition>): Boolean {
var minutes: Int return when (this) {
} is QueryCondition.StaticDataQueryCondition -> filterConditions.any {
it.intValues.contains(this.intValues.first())
interface Operator }
interface MoreOperator : Operator is QueryCondition.QueryDataCondition<*>-> filterConditions.any {
interface LessOperator : Operator it.ids.contains(this.dataObject?.id)
}
open class BoolFilterElementRow : FilterElementRow() else -> true
}
open class DateFilterElementRow(var dateValue: Date = Date(), var showTime: Boolean = false) : FilterElementRow()
open class NumericFilterElementRow(open val doubleValue: Double = 0.0) : FilterElementRow()
open class StringFilterElementRow(val stringValue: String = "") : FilterElementRow()
// Subclasses
open class SingleValueFilterElementRow(open val intValue: Int) : NumericFilterElementRow() {
override val doubleValue: Double
get() {
return intValue.toDouble()
}
}
open class DataFilterElementRow(data: Manageable) : StringFilterElementRow(data.id) {
val objectId: String = data.id
val name: String = (data as RowRepresentable).getDisplayName()
} }
open class StaticDataFilterElementRow(val row: RowRepresentable, val objectId: Int) : NumericFilterElementRow(objectId.toDouble()) { override val resId: Int?
get() {
override val resId: Int? = row.resId return when (this) {
val name: String = row.getDisplayName() is QueryCondition.CASH -> R.string.cash_game
is QueryCondition.TOURNAMENT -> R.string.tournament
fun getDataLocalizedTitle(context: Context): String { is QueryCondition.TODAY -> R.string.today
return row.localizedTitle(context) is QueryCondition.YESTERDAY -> R.string.yesterday
} is QueryCondition.TODAY_AND_YESTERDAY -> R.string.yesterday_and_today
} is QueryCondition.THIS_WEEK -> R.string.current_week
is QueryCondition.THIS_MONTH -> R.string.current_month
open class DurationFilterElement : NumericFilterElementRow(), Duration { is QueryCondition.THIS_YEAR -> R.string.current_year
override var minutes: Int = 0 is QueryCondition.STARTED_FROM_TIME, is QueryCondition.STARTED_FROM_DATE -> R.string.from
override val doubleValue: Double is QueryCondition.ENDED_TO_DATE, is QueryCondition.ENDED_TO_TIME-> R.string.to
get() { is QueryCondition.LIVE -> R.string.live
return minutes.toDouble() is QueryCondition.ONLINE -> R.string.online
} is QueryCondition.WEEK_DAY -> R.string.week_days
} is QueryCondition.WEEK_END -> R.string.weekend
is QueryCondition.PAST_DAYS -> R.string.period_in_days
open class AmountFilterElement : NumericFilterElementRow() { is QueryCondition.LAST_GAMES -> R.string.last_records
var amount: Double = 0.0 is QueryCondition.LAST_SESSIONS -> R.string.last_sessions
override val doubleValue: Double is QueryCondition.MIN_RE_BUY -> R.string.minimum
get() { is QueryCondition.MAX_RE_BUY -> R.string.maximum
return amount is QueryCondition.More -> R.string.more_than
} is QueryCondition.Less -> R.string.less_than
} else -> null
}
object Cash : BoolFilterElementRow() }
object Tournament : BoolFilterElementRow()
object Live : BoolFilterElementRow() override val viewType: Int
object Online : BoolFilterElementRow() get() {
object Today : BoolFilterElementRow() return when (this) {
object Yesterday : BoolFilterElementRow() is QueryCondition.PAST_DAYS, is QueryCondition.STARTED_FROM_DATE, is QueryCondition.ENDED_TO_DATE, is QueryCondition.STARTED_FROM_TIME, is QueryCondition.ENDED_TO_TIME, is QueryCondition.LAST_GAMES, is QueryCondition.LAST_SESSIONS, is QueryCondition.MAX_RE_BUY, is QueryCondition.MIN_RE_BUY,
object TodayAndYesterday : BoolFilterElementRow() is QueryCondition.MORE_THAN_DURATION, is QueryCondition.LESS_THAN_DURATION-> RowViewType.TITLE_VALUE_CHECK.ordinal
object CurrentWeek : BoolFilterElementRow() else -> RowViewType.TITLE_CHECK.ordinal
object CurrentMonth : BoolFilterElementRow() }
object CurrentYear : BoolFilterElementRow() }
object Weekday : BoolFilterElementRow()
object Weekend : BoolFilterElementRow() override val bottomSheetType: BottomSheetType
object From : DateFilterElementRow() get() {
object To : DateFilterElementRow() return when (this) {
is QueryCondition.PAST_DAYS, is QueryCondition.LAST_GAMES, is QueryCondition.LAST_SESSIONS, is QueryCondition.MAX_RE_BUY, is QueryCondition.MIN_RE_BUY-> BottomSheetType.EDIT_TEXT
object FromTime : DateFilterElementRow(showTime = true) is QueryCondition.MORE_THAN_DURATION, is QueryCondition.LESS_THAN_DURATION-> BottomSheetType.DOUBLE_EDIT_TEXT
object ToTime : DateFilterElementRow(showTime = true) else -> BottomSheetType.NONE
}
}
// Data classes - holding value
object ResultMoreThan : AmountFilterElement(), MoreOperator override fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowRepresentableEditDescriptor>? {
return when (this) {
object ResultLessThan : AmountFilterElement(), LessOperator is QueryCondition.SingleValueQueryCondition -> {
object DurationMoreThan : DurationFilterElement(), MoreOperator val valueAsString: String? by map
object DurationLessThan : DurationFilterElement(), LessOperator arrayListOf(
object ReBuyMoreThan : AmountFilterElement(), MoreOperator RowRepresentableEditDescriptor(valueAsString, this.resId, inputType = InputType.TYPE_CLASS_NUMBER)
object ReBuyLessThan : AmountFilterElement(), LessOperator )
}
//TODO: Refactor that
data class Year(val year: Int) : SingleValueFilterElementRow(year) is QueryCondition.Amount -> {
data class Month(val month: Int) : SingleValueFilterElementRow(month) val amount: String? by map
data class Day(val day: Int) : SingleValueFilterElementRow(day) arrayListOf(
RowRepresentableEditDescriptor(amount, R.string.amount, inputType = InputType.TYPE_CLASS_NUMBER)
data class Blind(val blind: String, val hasDefaultCurrency: Boolean) : StringFilterElementRow(blind) )
}
//TODO: Refactor? is QueryCondition.Duration -> {
data class PastDays(var lastDays: Int = 0) : SingleValueFilterElementRow(lastDays) { val hours: String? by map
override val intValue: Int val minutes: String? by map
get() { arrayListOf(
return lastDays RowRepresentableEditDescriptor(hours, R.string.hour, inputType = InputType.TYPE_CLASS_NUMBER),
} RowRepresentableEditDescriptor(minutes, R.string.minute, inputType = InputType.TYPE_CLASS_NUMBER)
} )
}
data class LastGames(var lastGames: Int) : SingleValueFilterElementRow(lastGames) { else -> super.editingDescriptors(map)
override val intValue: Int }
get() { }
return lastGames
}
}
data class LastSessions(var lastSessions: Int) : SingleValueFilterElementRow(lastSessions) {
override val intValue: Int
get() {
return lastSessions
}
}
data class Limit(val limit: net.pokeranalytics.android.model.Limit) : StaticDataFilterElementRow(limit, limit.ordinal)
data class TableSize(val tableSize: net.pokeranalytics.android.model.TableSize) : StaticDataFilterElementRow(tableSize, tableSize.numberOfPlayer)
data class Bankroll(val bankroll: Manageable) : DataFilterElementRow(bankroll)
data class Game(val game: Manageable) : DataFilterElementRow(game)
data class Location(val location: Manageable) : DataFilterElementRow(location)
data class TournamentName(val tournamentName: Manageable) : DataFilterElementRow(tournamentName)
data class AllTournamentFeature(val tournamentFeature: Manageable) : DataFilterElementRow(tournamentFeature)
data class AnyTournamentFeature(val tournamentFeature: Manageable) : DataFilterElementRow(tournamentFeature)
lateinit var filterSectionRow: FilterSectionRow
val id: String = this.criteria.name
private val criteria: QueryCriteria
get() {
return when (this) {
is Cash -> QueryCriteria.CASH
is Tournament -> QueryCriteria.TOURNAMENT
is Blind -> QueryCriteria.BLIND
is From -> QueryCriteria.STARTED_FROM_DATE
is To -> QueryCriteria.ENDED_TO_DATE
is FromTime -> QueryCriteria.STARTED_FROM_TIME
is ToTime -> QueryCriteria.ENDED_TO_TIME
is Month -> QueryCriteria.MONTH
is Day -> QueryCriteria.DAY_OF_WEEK
is Year -> QueryCriteria.YEAR
is Live -> QueryCriteria.LIVE
is Online -> QueryCriteria.ONLINE
is Weekday -> QueryCriteria.WEEK_DAY
is Weekend -> QueryCriteria.WEEK_END
is Today -> QueryCriteria.TODAY
is Yesterday -> QueryCriteria.YESTERDAY
is TodayAndYesterday -> QueryCriteria.TODAY_AND_YESTERDAY
is CurrentWeek -> QueryCriteria.THIS_WEEK
is CurrentMonth -> QueryCriteria.THIS_MONTH
is CurrentYear -> QueryCriteria.THIS_YEAR
is PastDays -> QueryCriteria.PAST_DAYS
is Limit -> QueryCriteria.LIMIT
is TableSize -> QueryCriteria.TABLE_SIZE
is Game -> QueryCriteria.GAME
is Bankroll -> QueryCriteria.BANKROLL
is Location -> QueryCriteria.LOCATION
is TournamentName -> QueryCriteria.TOURNAMENT_NAME
is AnyTournamentFeature -> QueryCriteria.ANY_TOURNAMENT_FEATURES
is AllTournamentFeature -> QueryCriteria.ALL_TOURNAMENT_FEATURES
is ResultMoreThan -> QueryCriteria.MORE_THAN_NET_RESULT
is ResultLessThan -> QueryCriteria.LESS_THAN_NET_RESULT
is DurationMoreThan -> QueryCriteria.MORE_THAN_DURATION
is DurationLessThan -> QueryCriteria.LESS_THAN_DURATION
//TODO: Check the conditions
is LastGames -> QueryCriteria.LAST_GAMES
is LastSessions -> QueryCriteria.LAST_SESSIONS
is ReBuyMoreThan -> QueryCriteria.MIN_RE_BUY
is ReBuyLessThan -> QueryCriteria.MAX_RE_BUY
else -> throw PokerAnalyticsException.UnknownQueryTypeForRow(this)
}
}
fun contains(filterConditions: List<FilterCondition>): Boolean {
return when (this) {
is SingleValueFilterElementRow -> filterConditions.any {
it.values.contains(this.intValue)
}
is DataFilterElementRow -> filterConditions.any {
it.ids.contains(this.objectId)
}
else -> true
}
}
override val resId: Int?
get() {
return when (this) {
is Cash -> R.string.cash_game
is Tournament -> R.string.tournament
is Today -> R.string.today
is Yesterday -> R.string.yesterday
is TodayAndYesterday -> R.string.yesterday_and_today
is CurrentWeek -> R.string.current_week
is CurrentMonth -> R.string.current_month
is CurrentYear -> R.string.current_year
is From, FromTime -> R.string.from
is To, ToTime -> R.string.to
is Live -> R.string.live
is Online -> R.string.online
is Weekday -> R.string.week_days
is Weekend -> R.string.weekend
is PastDays -> R.string.period_in_days
is LastGames -> R.string.last_records
is LastSessions -> R.string.last_sessions
is ReBuyMoreThan -> R.string.minimum
is ReBuyLessThan -> R.string.maximum
is MoreOperator -> R.string.more_than
is LessOperator -> R.string.less_than
else -> null
}
}
override val viewType: Int
get() {
return when (this) {
is PastDays, is From, is To, is FromTime, is ToTime, is LastGames, is LastSessions, is ReBuyMoreThan, is ReBuyLessThan,
is DurationMoreThan, is DurationLessThan -> RowViewType.TITLE_VALUE_CHECK.ordinal
else -> RowViewType.TITLE_CHECK.ordinal
}
}
override val bottomSheetType: BottomSheetType
get() {
return when (this) {
is PastDays, is LastGames, is LastSessions, is ReBuyMoreThan, is ReBuyLessThan -> BottomSheetType.EDIT_TEXT
is DurationMoreThan, is DurationLessThan -> BottomSheetType.DOUBLE_EDIT_TEXT
else -> BottomSheetType.NONE
}
}
override fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowRepresentableEditDescriptor>? {
return when (this) {
is PastDays -> {
val pastDays: String? by map
arrayListOf(
RowRepresentableEditDescriptor(pastDays, R.string.period_in_days, inputType = InputType.TYPE_CLASS_NUMBER)
)
}
is LastGames -> {
val lastGames: String? by map
arrayListOf(
RowRepresentableEditDescriptor(lastGames, R.string.last_records, inputType = InputType.TYPE_CLASS_NUMBER)
)
}
is LastSessions -> {
val lastSessions: String? by map
arrayListOf(
RowRepresentableEditDescriptor(lastSessions, R.string.last_sessions, inputType = InputType.TYPE_CLASS_NUMBER)
)
}
//TODO: Refactor that
is AmountFilterElement -> {
val amount: String? by map
arrayListOf(
RowRepresentableEditDescriptor(amount, R.string.amount, inputType = InputType.TYPE_CLASS_NUMBER)
)
}
is DurationFilterElement -> {
val hours: String? by map
val minutes: String? by map
arrayListOf(
RowRepresentableEditDescriptor(hours, R.string.hour, inputType = InputType.TYPE_CLASS_NUMBER),
RowRepresentableEditDescriptor(minutes, R.string.minute, inputType = InputType.TYPE_CLASS_NUMBER)
)
}
else -> super.editingDescriptors(map)
}
}
override fun getDisplayName(): String { override fun getDisplayName(): String {
return when (this) { return when (this) {
is SingleValueFilterElementRow -> { is QueryCondition.SingleValueQueryCondition -> {
when (this) { when (this) {
is Day -> DateFormatSymbols.getInstance(Locale.getDefault()).weekdays[this.intValue] is QueryCondition.DAY_OF_WEEK -> DateFormatSymbols.getInstance(Locale.getDefault()).weekdays[this.intValue]
is Month -> DateFormatSymbols.getInstance(Locale.getDefault()).months[this.intValue] is QueryCondition.MONTH -> DateFormatSymbols.getInstance(Locale.getDefault()).months[this.intValue]
else -> "${this.intValue}" else -> "${this.intValue}"
} }
} }
is DataFilterElementRow -> this.name is QueryCondition.QueryDataCondition<*> -> this.name
is StaticDataFilterElementRow -> this.name is QueryCondition.LIMIT -> this.name
is Blind -> this.blind is QueryCondition.TOURNAMENT_TYPE -> this.name
is QueryCondition.BLIND -> this.blind!!
else -> super.getDisplayName() else -> super.getDisplayName()
} }
}
override fun localizedTitle(context: Context): String {
return when (this) {
is StaticDataFilterElementRow -> this.getDataLocalizedTitle(context)
else -> super.localizedTitle(context)
}
}
val sectionToExclude: List<FilterSectionRow>?
get() {
val excluded = arrayListOf<FilterSectionRow>()
if (!this.filterSectionRow.allowMultiSelection) {
excluded.add(this.filterSectionRow)
}
this.filterSectionRow.exclusiveWith?.let { exclusives ->
excluded.addAll(exclusives)
}
if (excluded.size > 0) {
return excluded
}
return null
}
private enum class QueryCriteria {
LIVE,
CASH,
ONLINE,
TOURNAMENT,
BANKROLL,
GAME,
TOURNAMENT_NAME,
ANY_TOURNAMENT_FEATURES,
ALL_TOURNAMENT_FEATURES,
LOCATION,
LIMIT,
TABLE_SIZE,
TOURNAMENT_TYPE,
BLIND,
LAST_GAMES,
LAST_SESSIONS,
MORE_NUMBER_OF_TABLE,
LESS_NUMBER_OF_TABLE,
BETWEEN_NUMBER_OF_TABLE,
MORE_THAN_NET_RESULT,
LESS_THAN_NET_RESULT,
MORE_THAN_BUY_IN,
LESS_THAN_BUY_IN,
MORE_THAN_CASH_OUT,
LESS_THAN_CASH_OUT,
MORE_THAN_TIPS,
LESS_THAN_TIPS,
MORE_THAN_NUMBER_OF_PLAYER,
LESS_THAN_NUMBER_OF_PLAYER,
BETWEEN_NUMBER_OF_PLAYER,
MORE_THAN_TOURNAMENT_FEE,
LESS_THAN_TOURNAMENT_FEE,
BETWEEN_TOURNAMENT_FEE,
MIN_RE_BUY,
MAX_RE_BUY,
// Dates
STARTED_FROM_DATE,
STARTED_TO_DATE,
ENDED_FROM_DATE,
ENDED_TO_DATE,
DAY_OF_WEEK,
MONTH,
YEAR,
WEEK_DAY,
WEEK_END,
TODAY,
YESTERDAY,
TODAY_AND_YESTERDAY,
THIS_WEEK,
THIS_MONTH,
THIS_YEAR,
PAST_DAYS,
MORE_THAN_DURATION,
LESS_THAN_DURATION,
STARTED_FROM_TIME,
ENDED_TO_TIME,
COMMENT,
;
} }
var filterSectionRow: FilterSectionRow
val sectionToExclude: List<FilterSectionRow>?
get() {
val excluded = arrayListOf<FilterSectionRow>()
if (!this.filterSectionRow.allowMultiSelection) {
excluded.add(this.filterSectionRow)
}
this.filterSectionRow.exclusiveWith?.let { exclusives ->
excluded.addAll(exclusives)
}
if (excluded.size > 0) {
return excluded
}
return null
}
} }

@ -4,7 +4,9 @@ import io.realm.Realm
import io.realm.Sort import io.realm.Sort
import io.realm.kotlin.where import io.realm.kotlin.where
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.Criteria
import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
@ -66,51 +68,25 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable {
when (this@FilterSectionRow) { when (this@FilterSectionRow) {
// General // General
CASH_TOURNAMENT -> arrayListOf(Cash, Tournament) CASH_TOURNAMENT -> arrayListOf(QueryCondition.CASH, QueryCondition.TOURNAMENT)
LIVE_ONLINE -> arrayListOf(Live, Online) LIVE_ONLINE -> arrayListOf(QueryCondition.LIVE, QueryCondition.ONLINE)
GAME -> { GAME -> Criteria.Games.queryConditions
val games = arrayListOf<FilterElementRow.Game>() LIMIT_TYPE -> Criteria.Limits.queryConditions
val realm = Realm.getDefaultInstance() TABLE_SIZE -> Criteria.TableSizes.queryConditions
LiveData.GAME.items(realm).forEach {
val game = Game(it as net.pokeranalytics.android.model.realm.Game)
games.add(game)
}
realm.close()
games
}
LIMIT_TYPE -> {
val limits = arrayListOf<FilterElementRow.Limit>()
net.pokeranalytics.android.model.Limit.values().forEach {
limits.add(Limit(it))
}
limits
}
TABLE_SIZE -> {
val tableSizes = arrayListOf<FilterElementRow.TableSize>()
val realm = Realm.getDefaultInstance()
val distinctTableSizes =
realm.where<Session>().distinct("tableSize").findAll().sort("tableSize", Sort.ASCENDING)
distinctTableSizes.forEach { session ->
session.tableSize?.let { tableSize ->
tableSizes.add(TableSize(net.pokeranalytics.android.model.TableSize(tableSize)))
}
}
realm.close()
tableSizes
}
// Date // Date
DYNAMIC_DATE -> arrayListOf( DYNAMIC_DATE -> arrayListOf(
Today, QueryCondition.TODAY,
Yesterday, QueryCondition.YESTERDAY,
TodayAndYesterday, QueryCondition.TODAY_AND_YESTERDAY,
CurrentWeek, QueryCondition.THIS_WEEK,
CurrentMonth, QueryCondition.THIS_MONTH,
CurrentYear QueryCondition.THIS_YEAR
) )
FIXED_DATE -> arrayListOf(From, To) FIXED_DATE -> arrayListOf(QueryCondition.STARTED_FROM_DATE(), QueryCondition.ENDED_TO_DATE())
DURATION -> arrayListOf(PastDays(0)) DURATION -> arrayListOf(QueryCondition.PAST_DAYS())
YEAR -> { WEEKDAYS_OR_WEEKEND -> arrayListOf(QueryCondition.WEEK_DAY, QueryCondition.WEEK_END)
/*
YEAR -> {
val years = arrayListOf<FilterElementRow.Year>() val years = arrayListOf<FilterElementRow.Year>()
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
val distinctYears = val distinctYears =
@ -123,7 +99,6 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable {
realm.close() realm.close()
years years
} }
WEEKDAYS_OR_WEEKEND -> arrayListOf(Weekday, Weekend)
DAY_OF_WEEK -> { DAY_OF_WEEK -> {
val daysOfWeek = arrayListOf<FilterElementRow.Day>() val daysOfWeek = arrayListOf<FilterElementRow.Day>()
DateFormatSymbols.getInstance(Locale.getDefault()).weekdays.forEachIndexed { index, day -> DateFormatSymbols.getInstance(Locale.getDefault()).weekdays.forEachIndexed { index, day ->
@ -141,25 +116,24 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable {
} }
} }
months months
} }*/
// Duration // Duration
SESSION_DURATION -> arrayListOf( SESSION_DURATION -> arrayListOf(QueryCondition.MORE_THAN_DURATION(), QueryCondition.LESS_THAN_DURATION() as QueryCondition)
DurationMoreThan as FilterElementRow, /*
DurationLessThan as FilterElementRow
)
RANGE -> { RANGE -> {
val fromTime = FromTime val fromTime = FromTime
fromTime.dateValue = Date().startOfDay() fromTime.dateValue = Date().startOfDay()
val toTime = ToTime val toTime = ToTime
toTime.dateValue = Date().endOfDay() toTime.dateValue = Date().endOfDay()
arrayListOf(fromTime, toTime) arrayListOf(fromTime, toTime)
} }*/
// Sessions // Sessions
SESSIONS -> arrayListOf(LastGames(0), LastSessions(0)) SESSIONS -> arrayListOf(QueryCondition.LAST_GAMES(), QueryCondition.LAST_SESSIONS())
// Cash // Cash
/*
BLIND -> { BLIND -> {
val blinds = arrayListOf<Blind>() val blinds = arrayListOf<Blind>()
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
@ -170,10 +144,10 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable {
} }
realm.close() realm.close()
blinds blinds
} }*/
CASH_RE_BUY_COUNT -> arrayListOf( CASH_RE_BUY_COUNT -> arrayListOf(
ReBuyMoreThan as FilterElementRow, QueryCondition.MAX_RE_BUY(),
ReBuyLessThan as FilterElementRow QueryCondition.MIN_RE_BUY()
) )
// Tournament // Tournament
@ -194,7 +168,7 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable {
MULTI_PLAYER -> arrayListOf() MULTI_PLAYER -> arrayListOf()
VALUE -> arrayListOf() VALUE -> arrayListOf()
else -> arrayListOf()
}.apply { }.apply {
this.forEach { this.forEach {
it.filterSectionRow = this@FilterSectionRow it.filterSectionRow = this@FilterSectionRow

Loading…
Cancel
Save