From 5cb406dc96e5a562eb42f9a6e1d3a1a89b7fef9c Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 22 Mar 2019 13:11:05 +0100 Subject: [PATCH 01/11] add filter realm part --- .../filter/BlindFilterInstrumentedTest.kt | 18 +-- .../filter/DateFilterInstrumentedUnitTest.kt | 20 +-- .../filter/ExceptionFilterInstrumentedTest.kt | 9 +- .../SessionFilterInstrumentedUnitTest.kt | 42 +++---- .../android/model/filter/DateFilterable.kt | 77 ------------ .../android/model/filter/FilterComponent.kt | 5 - .../{SessionFilterable.kt => FilterType.kt} | 115 +++++++++++++++++- .../filter/interfaces/ValueFilterable.kt | 3 + .../android/model/realm/Filter.kt | 3 +- .../android/model/realm/FilterComponent.kt | 83 +++++++++++++ .../ui/view/rowrepresentable/FilterRow.kt | 37 ++++++ 11 files changed, 278 insertions(+), 134 deletions(-) delete mode 100644 app/src/main/java/net/pokeranalytics/android/model/filter/DateFilterable.kt delete mode 100644 app/src/main/java/net/pokeranalytics/android/model/filter/FilterComponent.kt rename app/src/main/java/net/pokeranalytics/android/model/filter/{SessionFilterable.kt => FilterType.kt} (62%) create mode 100644 app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt diff --git a/app/src/androidTest/java/net/pokeranalytics/android/filter/BlindFilterInstrumentedTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/filter/BlindFilterInstrumentedTest.kt index a3ffd4a9..b4d27bde 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/filter/BlindFilterInstrumentedTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/BlindFilterInstrumentedTest.kt @@ -1,7 +1,7 @@ package net.pokeranalytics.android.filter import net.pokeranalytics.android.model.filter.FilterManager -import net.pokeranalytics.android.model.filter.SessionFilterable +import net.pokeranalytics.android.model.filter.FilterType import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.model.realm.Session import org.junit.Assert @@ -37,8 +37,8 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = SessionFilterable.BLINDS - filter.valueMap = mapOf("map" to arrayOf(mapOf( + val filter = FilterType.BLINDS + filter.valueMap = mapOf("blinds" to arrayOf(mapOf( "sb" to 0.5, "bb" to 1.0, "code" to null @@ -84,8 +84,8 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = SessionFilterable.BLINDS - filter.valueMap = mapOf("map" to arrayOf(mapOf( + val filter = FilterType.BLINDS + filter.valueMap = mapOf("blinds" to arrayOf(mapOf( "sb" to null, "bb" to 1.0, "code" to null @@ -131,8 +131,8 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = SessionFilterable.BLINDS - filter.valueMap = mapOf("map" to arrayOf(mapOf( + val filter = FilterType.BLINDS + filter.valueMap = mapOf("blinds" to arrayOf(mapOf( "sb" to 1.0, "bb" to 2.0, "code" to "AUD" @@ -178,8 +178,8 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = SessionFilterable.BLINDS - filter.valueMap = mapOf("map" to arrayOf( + val filter = FilterType.BLINDS + filter.valueMap = mapOf("blinds" to arrayOf( mapOf( "sb" to 1.0, "bb" to 2.0, diff --git a/app/src/androidTest/java/net/pokeranalytics/android/filter/DateFilterInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/filter/DateFilterInstrumentedUnitTest.kt index 700856ab..7f611d41 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/filter/DateFilterInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/DateFilterInstrumentedUnitTest.kt @@ -1,7 +1,7 @@ package net.pokeranalytics.android.filter import androidx.test.ext.junit.runners.AndroidJUnit4 -import net.pokeranalytics.android.model.filter.DateFilterable +import net.pokeranalytics.android.model.filter.FilterType import net.pokeranalytics.android.model.filter.FilterManager import net.pokeranalytics.android.model.realm.Session import org.junit.Assert @@ -25,7 +25,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(100.0, true, cal.time) realm.commitTransaction() - val filter = DateFilterable.DAY_OF_WEEK + val filter = FilterType.DAY_OF_WEEK cal.time = s1.startDate filter.valueMap = mapOf("dayOfWeek" to cal.get(Calendar.DAY_OF_WEEK)) @@ -54,7 +54,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(100.0, true, cal.time) realm.commitTransaction() - val filter = DateFilterable.MONTH + val filter = FilterType.MONTH cal.time = s1.startDate filter.valueMap = mapOf("month" to cal.get(Calendar.MONTH)) @@ -83,7 +83,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(100.0, true, cal.time) realm.commitTransaction() - val filter = DateFilterable.YEAR + val filter = FilterType.YEAR cal.time = s1.startDate filter.valueMap = mapOf("year" to cal.get(Calendar.YEAR)) @@ -116,7 +116,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val sessions = FilterManager().filter( realm, Session::class.java, - arrayListOf(DateFilterable.WEEK_END) + arrayListOf(FilterType.WEEK_END) ) Assert.assertEquals(1, sessions.size) @@ -141,7 +141,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val sessions = FilterManager().filter( realm, Session::class.java, - arrayListOf(DateFilterable.WEEK_DAY) + arrayListOf(FilterType.WEEK_DAY) ) Assert.assertEquals(1, sessions.size) @@ -165,7 +165,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val s2 = Session.testInstance(100.0, true, cal.time, 1) realm.commitTransaction() - val filter = DateFilterable.STARTED_FROM_DATE + val filter = FilterType.STARTED_FROM_DATE filter.valueMap = mapOf("date" to s2.startDate) val sessions = FilterManager().filter( @@ -195,7 +195,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = DateFilterable.STARTED_TO_DATE + val filter = FilterType.STARTED_TO_DATE filter.valueMap = mapOf("date" to s1.startDate) val sessions = FilterManager().filter( @@ -226,7 +226,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = DateFilterable.ENDED_FROM_DATE + val filter = FilterType.ENDED_FROM_DATE filter.valueMap = mapOf("date" to s2.endDate) val sessions = FilterManager().filter( @@ -257,7 +257,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = DateFilterable.ENDED_TO_DATE + val filter = FilterType.ENDED_TO_DATE filter.valueMap = mapOf("date" to s1.endDate) val sessions = FilterManager().filter( diff --git a/app/src/androidTest/java/net/pokeranalytics/android/filter/ExceptionFilterInstrumentedTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/filter/ExceptionFilterInstrumentedTest.kt index bc453c26..b2976510 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/filter/ExceptionFilterInstrumentedTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/ExceptionFilterInstrumentedTest.kt @@ -2,9 +2,8 @@ package net.pokeranalytics.android.filter import androidx.test.ext.junit.runners.AndroidJUnit4 import net.pokeranalytics.android.exceptions.FilterValueMapException -import net.pokeranalytics.android.model.filter.DateFilterable +import net.pokeranalytics.android.model.filter.FilterType import net.pokeranalytics.android.model.filter.FilterManager -import net.pokeranalytics.android.model.filter.SessionFilterable import net.pokeranalytics.android.model.realm.Session import org.junit.Test import org.junit.runner.RunWith @@ -19,13 +18,13 @@ class ExceptionFilterInstrumentedTest: BaseFilterInstrumentedUnitTest() { FilterManager().filter( realm, Session::class.java, - arrayListOf(SessionFilterable.BLINDS) + arrayListOf(FilterType.BLINDS) ) } @Test(expected = FilterValueMapException::class) fun testValueKeyFilterException() { - val filter = DateFilterable.STARTED_FROM_DATE + val filter = FilterType.STARTED_FROM_DATE filter.valueMap = mapOf("bob" to Date()) val realm = this.mockRealm @@ -38,7 +37,7 @@ class ExceptionFilterInstrumentedTest: BaseFilterInstrumentedUnitTest() { @Test(expected = FilterValueMapException::class) fun testSubValueKeyFilterException() { - val filter = SessionFilterable.BLINDS + val filter = FilterType.BLINDS filter.valueMap = mapOf("map" to arrayOf(mapOf( "bob" to 0.5, "bb" to 1.0, diff --git a/app/src/androidTest/java/net/pokeranalytics/android/filter/SessionFilterInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/filter/SessionFilterInstrumentedUnitTest.kt index e2112c36..e3d9896c 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/filter/SessionFilterInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/SessionFilterInstrumentedUnitTest.kt @@ -3,7 +3,7 @@ package net.pokeranalytics.android.filter import androidx.test.ext.junit.runners.AndroidJUnit4 import io.realm.RealmList import net.pokeranalytics.android.model.filter.FilterManager -import net.pokeranalytics.android.model.filter.SessionFilterable +import net.pokeranalytics.android.model.filter.FilterType import net.pokeranalytics.android.model.realm.* import org.junit.Assert import org.junit.Test @@ -26,7 +26,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val sessions = FilterManager().filter( realm, Session::class.java, - arrayListOf(SessionFilterable.CASH) + arrayListOf(FilterType.CASH) ) Assert.assertEquals(1, sessions.size) @@ -48,7 +48,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val sessions = FilterManager().filter( realm, Session::class.java, - arrayListOf(SessionFilterable.TOURNAMENT) + arrayListOf(FilterType.TOURNAMENT) ) Assert.assertEquals(1, sessions.size) @@ -75,7 +75,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val sessions = FilterManager().filter( realm, Session::class.java, - arrayListOf(SessionFilterable.LIVE) + arrayListOf(FilterType.LIVE) ) Assert.assertEquals(1, sessions.size) @@ -101,7 +101,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val sessions = FilterManager().filter( realm, Session::class.java, - arrayListOf(SessionFilterable.ONLINE) + arrayListOf(FilterType.ONLINE) ) Assert.assertEquals(1, sessions.size) @@ -122,7 +122,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(bankroll = b2) realm.commitTransaction() - val filter = SessionFilterable.BANKROLL + val filter = FilterType.BANKROLL filter.valueMap = mapOf("ids" to arrayOf(b1.id)) val sessions = FilterManager().filter( @@ -155,7 +155,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(bankroll = b3) realm.commitTransaction() - val filter = SessionFilterable.BANKROLL + val filter = FilterType.BANKROLL filter.valueMap = mapOf("ids" to arrayOf(b1.id, b2.id)) val sessions = FilterManager().filter( @@ -183,7 +183,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(game = g2) realm.commitTransaction() - val filter = SessionFilterable.GAME + val filter = FilterType.GAME filter.valueMap = mapOf("ids" to arrayOf(g2.id)) val sessions = FilterManager().filter( @@ -216,7 +216,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(game = g3) realm.commitTransaction() - val filter = SessionFilterable.GAME + val filter = FilterType.GAME filter.valueMap = mapOf("ids" to arrayOf(g2.id, g3.id)) val sessions = FilterManager().filter( @@ -244,7 +244,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(location = l2) realm.commitTransaction() - val filter = SessionFilterable.LOCATION + val filter = FilterType.LOCATION filter.valueMap = mapOf("ids" to arrayOf(l1.id)) val sessions = FilterManager().filter( @@ -277,7 +277,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(location = l3) realm.commitTransaction() - val filter = SessionFilterable.LOCATION + val filter = FilterType.LOCATION filter.valueMap = mapOf("ids" to arrayOf(l1.id, l3.id)) val sessions = FilterManager().filter( @@ -305,7 +305,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tournamentName = t2) realm.commitTransaction() - val filter = SessionFilterable.TOURNAMENT_NAME + val filter = FilterType.TOURNAMENT_NAME filter.valueMap = mapOf("ids" to arrayOf(t1.id)) val sessions = FilterManager().filter( @@ -338,7 +338,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tournamentName = t3) realm.commitTransaction() - val filter = SessionFilterable.TOURNAMENT_NAME + val filter = FilterType.TOURNAMENT_NAME filter.valueMap = mapOf("ids" to arrayOf(t1.id, t2.id)) val sessions = FilterManager().filter( @@ -374,7 +374,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tournamentFeatures = RealmList(t1)) realm.commitTransaction() - val filter = SessionFilterable.ALL_TOURNAMENT_FEATURES + val filter = FilterType.ALL_TOURNAMENT_FEATURES filter.valueMap = mapOf("ids" to arrayOf(t1.id, t2.id, t3.id, t4.id)) val sessions = FilterManager().filter( @@ -407,7 +407,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tournamentFeatures = RealmList(t1)) realm.commitTransaction() - val filter = SessionFilterable.ANY_TOURNAMENT_FEATURES + val filter = FilterType.ANY_TOURNAMENT_FEATURES filter.valueMap = mapOf("ids" to arrayOf(t1.id, t2.id, t3.id, t4.id)) val sessions = FilterManager().filter( @@ -437,7 +437,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tournamentFeatures = RealmList(t1)) realm.commitTransaction() - val filter = SessionFilterable.ANY_TOURNAMENT_FEATURES + val filter = FilterType.ANY_TOURNAMENT_FEATURES filter.valueMap = mapOf("ids" to arrayOf(t2.id)) val sessions = FilterManager().filter( @@ -464,7 +464,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tableSize = 10) realm.commitTransaction() - val filter = SessionFilterable.TABLE_SIZE + val filter = FilterType.TABLE_SIZE filter.valueMap = mapOf("values" to arrayOf(2,4)) val sessions = FilterManager().filter( @@ -491,7 +491,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val s2 = Session.testInstance(netResult = 570.0) realm.commitTransaction() - val filter = SessionFilterable.MORE_THAN_NET_RESULT + val filter = FilterType.MORE_THAN_NET_RESULT filter.valueMap = mapOf("value" to 204.0) val sessions = FilterManager().filter( @@ -518,7 +518,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(netResult = 570.0) realm.commitTransaction() - val filter = SessionFilterable.LESS_THAN_NET_RESULT + val filter = FilterType.LESS_THAN_NET_RESULT filter.valueMap = mapOf("value" to 540.0) val sessions = FilterManager().filter( @@ -545,10 +545,10 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(netResult = 570.0) realm.commitTransaction() - val filterMore = SessionFilterable.MORE_THAN_NET_RESULT + val filterMore = FilterType.MORE_THAN_NET_RESULT filterMore.valueMap = mapOf("value" to 200.0) - val filterLess = SessionFilterable.LESS_THAN_NET_RESULT + val filterLess = FilterType.LESS_THAN_NET_RESULT filterLess.valueMap = mapOf("value" to 400.0) val sessions = FilterManager().filter( diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/DateFilterable.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/DateFilterable.kt deleted file mode 100644 index 3693d10c..00000000 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/DateFilterable.kt +++ /dev/null @@ -1,77 +0,0 @@ -package net.pokeranalytics.android.model.filter - -import io.realm.RealmObject -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? = null - - override val filterValuesExpectedKeys : Array? - 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()) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/FilterComponent.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/FilterComponent.kt deleted file mode 100644 index d647bfa1..00000000 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/FilterComponent.kt +++ /dev/null @@ -1,5 +0,0 @@ -package net.pokeranalytics.android.model.filter - -enum class FilterComponent { - -} diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/SessionFilterable.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/FilterType.kt similarity index 62% rename from app/src/main/java/net/pokeranalytics/android/model/filter/SessionFilterable.kt rename to app/src/main/java/net/pokeranalytics/android/model/filter/FilterType.kt index a4520966..a39188da 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/SessionFilterable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/FilterType.kt @@ -4,9 +4,11 @@ import io.realm.RealmObject import io.realm.RealmQuery import net.pokeranalytics.android.exceptions.FilterValueMapException import net.pokeranalytics.android.model.filter.interfaces.Filterable +import net.pokeranalytics.android.model.realm.FilterComponent import net.pokeranalytics.android.model.realm.Session +import java.util.* -enum class SessionFilterable(private var fieldName:String? = null, private var subType:SubType? = null): Filterable { +enum class FilterType(private var fieldName:String? = null, private var subType:SubType? = null): Filterable { LIVE, CASH, ONLINE, @@ -38,6 +40,18 @@ enum class SessionFilterable(private var fieldName:String? = null, private var s MORE_THAN_TOURNAMENT_FEE(Field.NET_RESULT.fieldName, SubType.MORE), LESS_THAN_TOURNAMENT_FEE(Field.NET_RESULT.fieldName, SubType.LESS), BETWEEN_TOURNAMENT_FEE(Field.TOURNAMENT_FEE.fieldName, SubType.BETWEEN), + + // Dates + STARTED_FROM_DATE, + STARTED_TO_DATE, + ENDED_FROM_DATE, + ENDED_TO_DATE, + DAY_OF_WEEK, + MONTH, + YEAR, + WEEK_DAY, + WEEK_END, + ; enum class SubType { @@ -62,6 +76,12 @@ enum class SessionFilterable(private var fieldName:String? = null, private var s NUMBER_OF_TABLE("numberOfTable"), NUMBER_OF_PLAYER("tournamentNumberOfPlayers"), TOURNAMENT_FEE("tournamentEntryFee"), + START_DATE("startDate"), + END_DATE("endDate"), + DAY("dayOfWeek"), + MONTH("month"), + YEAR("year"), + ; } @@ -78,7 +98,11 @@ enum class SessionFilterable(private var fieldName:String? = null, private var s return when (this) { BANKROLL, GAME, LOCATION, ANY_TOURNAMENT_FEATURES, ALL_TOURNAMENT_FEATURES -> arrayOf("ids") LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> arrayOf("values") - BLINDS -> arrayOf("map") + BLINDS -> arrayOf("blinds") + 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 } } @@ -142,9 +166,9 @@ enum class SessionFilterable(private var fieldName:String? = null, private var s } } BLINDS -> { - val map : Array> by filterValues + val blinds : Array> by filterValues val expectedSubKeys = arrayOf("sb", "bb", "code") - map.forEachIndexed { index, subMap -> + blinds.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") @@ -175,14 +199,93 @@ enum class SessionFilterable(private var fieldName:String? = null, private var s realmQuery.endGroup() - if (index < map.size - 1) { + if (index < blinds.size - 1) { realmQuery.or() } } realmQuery } + 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()) else -> { - realmQuery + throw FilterValueMapException("filter type not handled") + } + } + } + + override fun setValueFrom(filterComponent: FilterComponent) { + this.subType?.let { subType -> + this.fieldName?.let { + return when (subType) { + SubType.LESS, SubType.MORE -> { + filterValues = mapOf("value" to filterComponent.value) + } + SubType.BETWEEN -> { + filterValues = mapOf( + "leftValue" to filterComponent.leftValue, + "rightValue" to filterComponent.rightValue + ) + } + } + } ?: run { + throw FilterValueMapException("fieldName is missing") + } + } + + when (this) { + ALL_TOURNAMENT_FEATURES, ANY_TOURNAMENT_FEATURES, BANKROLL, GAME, LOCATION, TOURNAMENT_NAME -> { + filterValues = mapOf("ids" to filterComponent.ids) + } + LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> { + filterValues = mapOf("values" to filterComponent.values) + } + BLINDS -> { + filterValues = mapOf("blinds" to filterComponent.blinds) + } + STARTED_FROM_DATE, STARTED_TO_DATE, ENDED_FROM_DATE, ENDED_TO_DATE -> { + filterValues = mapOf("date" to filterComponent.date) + } + DAY_OF_WEEK -> { + filterValues = mapOf("dayOfWeek" to filterComponent.dayOfWeek) + } + MONTH -> { + filterValues = mapOf("month" to filterComponent.month) + } + YEAR -> { + filterValues = mapOf("year" to filterComponent.year) + } + else -> { + throw FilterValueMapException("filter type not handled") } } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/interfaces/ValueFilterable.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/interfaces/ValueFilterable.kt index 729cee60..f49f6f2a 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/interfaces/ValueFilterable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/interfaces/ValueFilterable.kt @@ -1,6 +1,7 @@ package net.pokeranalytics.android.model.filter.interfaces import net.pokeranalytics.android.exceptions.FilterValueMapException +import net.pokeranalytics.android.model.realm.FilterComponent interface ValueFilterable { @@ -25,4 +26,6 @@ interface ValueFilterable { } val filterValuesExpectedKeys : Array? + + fun setValueFrom(filterComponent: FilterComponent) } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt index 26ed01d6..e3843a17 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt @@ -1,6 +1,7 @@ package net.pokeranalytics.android.model.realm import io.realm.MutableRealmInteger +import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.PrimaryKey import java.util.* @@ -20,6 +21,6 @@ open class Filter : RealmObject() { // for MutableRealmInteger, see https://realm.io/docs/java/latest/#counters val usageCount: MutableRealmInteger = MutableRealmInteger.valueOf(0) -// var components: List = listOf() + var components: RealmList? = null } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt new file mode 100644 index 00000000..75cda2ab --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt @@ -0,0 +1,83 @@ +package net.pokeranalytics.android.model.realm + +import io.realm.RealmList +import io.realm.RealmObject +import io.realm.annotations.Ignore +import net.pokeranalytics.android.model.filter.FilterType +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElement +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElement.* +import java.util.* +import kotlin.collections.ArrayList + +open class FilterComponent(filterName : String = "") : RealmObject() { + + var filterName : String = filterName + + constructor(filterElements: ArrayList) : this(filterElements.first().filterType.name) { + this.ids = when (FilterType.valueOf(this.filterName)) { + FilterType.GAME -> { + RealmList().apply { + this.addAll(filterElements.map { + (it as FilterElement.Game).game.id + }) + } + } + else -> null + } + + this.values = when (FilterType.valueOf(filterName)) { + FilterType.LIMIT -> { + RealmList().apply { + this.addAll(filterElements.map { + (it as FilterElement.Limit).limit.ordinal + }) + } + } + else -> null + } + } + + constructor(filterElement:FilterElement) : this(filterElement.filterType.name) { + when (filterElement) { + is From -> date = filterElement.date + is To -> date = filterElement.date + } + } + + val filterType : FilterType + get() = FilterType.valueOf(filterName) + .apply { + this.setValueFrom(this@FilterComponent) + } + + var date : Date? = null + var values : RealmList? = null + var ids : RealmList? = null + + @Ignore + val value : Double? = null + + @Ignore + val leftValue : Double? = null + + @Ignore + val rightValue : Double? = null + + @Ignore + val blinds : Array>? = null + + @Ignore + val dayOfWeek : Int? = null + + @Ignore + val month : Int? = null + + @Ignore + val year : Int? = null +} + +open class BlindFilterComponent : RealmObject() { + var sb : Double? = null + var bb : Double? = null + var code : String? = null +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt index f57c2b64..89cdb7ac 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt @@ -2,7 +2,9 @@ package net.pokeranalytics.android.ui.view.rowrepresentable import io.realm.Realm import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.FilterValueMapException import net.pokeranalytics.android.model.LiveData +import net.pokeranalytics.android.model.filter.FilterType import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSection.* @@ -107,6 +109,41 @@ sealed class FilterElement : RowRepresentable { var filterSection: FilterSectionDataSource? = null + val filterType : FilterType + get() { + return when (this) { + is Cash -> FilterType.CASH + is Tournament -> FilterType.TOURNAMENT +/* is Today -> FilterType. + 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 -> R.string.from + is To -> 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 Year-> R.string.year + is Month-> R.string.month_of_the_year + is Day -> R.string.day_of_the_week + is PastDays -> R.string.period_in_days + is Limit -> R.string.limit + is TableSize -> R.string.table_size + is Bankroll -> R.string.bankroll + */ + is Game -> FilterType.GAME + /* + is Location -> R.string.location + is TournamentName -> R.string.tournament_name + is TournamentFeature -> R.string.tournament_feature + */ + else -> throw FilterValueMapException("no filter type for filter element") //TODO create exception + } + } + override val resId: Int? get() { return when (this) { From b94cd9cdeb81d2aebf393786f0440f99b2a3c001 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 22 Mar 2019 14:14:13 +0100 Subject: [PATCH 02/11] filter realm management --- .../android/model/realm/Filter.kt | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt index e3843a17..5b2857f9 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt @@ -4,6 +4,7 @@ import io.realm.MutableRealmInteger import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.PrimaryKey +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElement import java.util.* //import net.pokeranalytics.android.FilterComponent @@ -21,6 +22,34 @@ open class Filter : RealmObject() { // for MutableRealmInteger, see https://realm.io/docs/java/latest/#counters val usageCount: MutableRealmInteger = MutableRealmInteger.valueOf(0) - var components: RealmList? = null - + var components: RealmList = RealmList() + + fun componentsFrom(filterElements: ArrayList) { + + components.clear() + + var sections = filterElements.mapNotNull { + it.filterSection + }.distinct() + + sections.forEach { section -> + var _filterElements = filterElements.filter { + it.filterSection?.let { _section -> + _section == section + } ?: run { + false + } + } + + if (_filterElements.size == 1) { + var component : FilterComponent = FilterComponent(_filterElements.first()) + components.add(component) + } else { + var casted = arrayListOf() + casted.addAll(_filterElements) + var component : FilterComponent = FilterComponent(casted) + components.add(component) + } + } + } } From 1d73eef09c02542b2d47f2e3b2efaa17cc88b4dd Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 22 Mar 2019 15:26:32 +0100 Subject: [PATCH 03/11] filter loading, section count, element pre-selected --- .../android/model/realm/Filter.kt | 81 ++++++++++++++----- .../android/model/realm/FilterComponent.kt | 8 +- .../ui/fragment/FilterDetailsFragment.kt | 11 +++ .../android/ui/fragment/FiltersFragment.kt | 10 +++ .../view/rowrepresentable/FilterCategory.kt | 2 +- .../ui/view/rowrepresentable/FilterRow.kt | 35 ++++---- .../ui/view/rowrepresentable/FilterSection.kt | 20 ++--- 7 files changed, 106 insertions(+), 61 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt index 5b2857f9..b565e213 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt @@ -4,7 +4,9 @@ import io.realm.MutableRealmInteger import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.PrimaryKey +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategory import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElement +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSection import java.util.* //import net.pokeranalytics.android.FilterComponent @@ -25,31 +27,66 @@ open class Filter : RealmObject() { var components: RealmList = RealmList() fun componentsFrom(filterElements: ArrayList) { - components.clear() - - var sections = filterElements.mapNotNull { - it.filterSection - }.distinct() - - sections.forEach { section -> - var _filterElements = filterElements.filter { - it.filterSection?.let { _section -> - _section == section - } ?: run { - false - } + filterElements + .map { + it.filterSection } - - if (_filterElements.size == 1) { - var component : FilterComponent = FilterComponent(_filterElements.first()) - components.add(component) - } else { - var casted = arrayListOf() - casted.addAll(_filterElements) - var component : FilterComponent = FilterComponent(casted) - components.add(component) + .distinct() + .forEach { section -> + filterElements + .filter { + it.filterSection == section + } + .apply { + if (this.size == 1) { + components.add(FilterComponent(this.first())) + } else { + val casted = arrayListOf() + casted.addAll(this) + components.add(FilterComponent(casted)) + } + } } + } + + fun numberOfElementIn(filterCategory: FilterCategory) : Int { + val sections = FilterSection.filterSectionsFor(filterCategory) + return components.count { + sections.contains(FilterSection.valueOf(it.sectionName)) + } + } + + fun isFilterElementExists(filterElement:FilterElement) : Boolean { + + val filtered = components.filter { + it.filterType == filterElement.filterType + } + + if (filtered.isEmpty()) { + return false + } + + return when (filterElement) { + is FilterElement.Game -> filtered.filter { + it.ids?.contains(filterElement.game.id) ?: false + }.isNotEmpty() + is FilterElement.Year -> TODO() + is FilterElement.Month -> TODO() + is FilterElement.Day -> TODO() + is FilterElement.Limit -> TODO() + is FilterElement.TableSize -> TODO() + is FilterElement.Bankroll -> TODO() + is FilterElement.Location -> TODO() + is FilterElement.TournamentName -> TODO() + is FilterElement.TournamentFeature -> TODO() + + is FilterElement.From -> TODO() + is FilterElement.To -> TODO() + is FilterElement.PastDays -> TODO() + + + else -> return true } } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt index 75cda2ab..03b9cc27 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt @@ -9,11 +9,9 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElement.* import java.util.* import kotlin.collections.ArrayList -open class FilterComponent(filterName : String = "") : RealmObject() { +open class FilterComponent(var filterName : String = "", var sectionName: String = "") : RealmObject() { - var filterName : String = filterName - - constructor(filterElements: ArrayList) : this(filterElements.first().filterType.name) { + constructor(filterElements: ArrayList) : this(filterElements.first().filterType.name, filterElements.first().filterSection.name) { this.ids = when (FilterType.valueOf(this.filterName)) { FilterType.GAME -> { RealmList().apply { @@ -37,7 +35,7 @@ open class FilterComponent(filterName : String = "") : RealmObject() { } } - constructor(filterElement:FilterElement) : this(filterElement.filterType.name) { + constructor(filterElement:FilterElement) : this(filterElement.filterType.name, filterElement.filterSection.name) { when (filterElement) { is From -> date = filterElement.date is To -> date = filterElement.date diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt index 528bc30a..dea0edb8 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt @@ -10,6 +10,7 @@ import io.realm.RealmObject import kotlinx.android.synthetic.main.fragment_filter_details.* import kotlinx.android.synthetic.main.fragment_filter_details.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -151,6 +152,16 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta this.rows.clear() this.rowsForFilterSubcategory.clear() this.rows.addAll(it.filterElements) + + //TODO + /* + var filter = Filter() + this.rows.forEach {element -> + if (filter.isFilterElementExists(element as FilterElement)) { + this.selectedRows.add(element) + } + } + */ this.rowRepresentableAdapter = RowRepresentableAdapter(this, this) this.recyclerView.adapter = rowRepresentableAdapter } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt index 4f859d0f..911a7771 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt @@ -8,6 +8,7 @@ import io.realm.RealmObject import kotlinx.android.synthetic.main.fragment_editable_data.* import kotlinx.android.synthetic.main.fragment_filters.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.ui.activity.FilterDetailsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter @@ -34,6 +35,8 @@ open class FiltersFragment : PokerAnalyticsFragment(), StaticRowRepresentableDat private var primaryKey: String? = null private var selectedRow: RowRepresentable? = null + private var filter: Filter? = null + var isUpdating = false override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -97,6 +100,13 @@ open class FiltersFragment : PokerAnalyticsFragment(), StaticRowRepresentableDat } + //TODO + /* + override fun stringForRow(row: RowRepresentable): String { + return this.filter?.numberOfElementIn(row as FilterCategory).toString() + } + */ + override fun onRowValueChanged(value: Any?, row: RowRepresentable) { super.onRowValueChanged(value, row) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategory.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategory.kt index e7be8433..7e63ebb4 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategory.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategory.kt @@ -26,7 +26,7 @@ enum class FilterCategory(override val resId: Int?, override val viewType: Int = } } - private val filterSections : List < FilterSectionDataSource > + private val filterSections : List < FilterSection > get() { return FilterSection.filterSectionsFor(this) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt index 89cdb7ac..230ec65e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt @@ -12,9 +12,8 @@ import java.lang.Exception import java.util.* sealed class FilterElement : RowRepresentable { - companion object { - fun filterElementsFor(filterSection: FilterSectionDataSource) : List { + fun filterElementsFor(filterSection: FilterSection) : List { return when (filterSection) { CASH_TOURNAMENT -> arrayListOf(Cash, Tournament) LIVE_ONLINE -> arrayListOf(Live, Online) @@ -77,6 +76,10 @@ sealed class FilterElement : RowRepresentable { VALUE -> arrayListOf() else -> throw Exception("unknown filtersection") //TODO create exception + }.apply { + this.forEach { + it.filterSection = filterSection + } } } } @@ -91,10 +94,11 @@ sealed class FilterElement : RowRepresentable { object CurrentWeek : FilterElement() object CurrentMonth : FilterElement() object CurrentYear: FilterElement() - data class From(var date: Date = Date()) : FilterElement() - data class To(var date: Date = Date()) : FilterElement() object Weekday: FilterElement() object Weekend : FilterElement() + + data class From(var date: Date = Date()) : FilterElement() + data class To(var date: Date = Date()) : FilterElement() data class Year(val day: Int) : FilterElement() data class Month(val day: Int) : FilterElement() data class Day(val day: Int) : FilterElement() @@ -107,7 +111,7 @@ sealed class FilterElement : RowRepresentable { data class TournamentName(val tournamentName: net.pokeranalytics.android.model.realm.TournamentName) : FilterElement() data class TournamentFeature(val tournamentFeature: net.pokeranalytics.android.model.realm.TournamentFeature) : FilterElement() - var filterSection: FilterSectionDataSource? = null + lateinit var filterSection: FilterSection val filterType : FilterType get() { @@ -187,21 +191,16 @@ sealed class FilterElement : RowRepresentable { val sectionToExclude : List < FilterSectionDataSource > ? get() { val excluded = arrayListOf() - this.filterSection?.let { - if (!it.allowMultiSelection) { - excluded.add(it) - } - it.exclusiveWith?.let { exclusives -> - excluded.addAll(exclusives) - } - - if (excluded.size > 0) { - return excluded - } - } ?: run { - return null + if (!this.filterSection.allowMultiSelection) { + excluded.add(this.filterSection) + } + this.filterSection.exclusiveWith?.let { exclusives -> + excluded.addAll(exclusives) } + if (excluded.size > 0) { + return excluded + } return null } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSection.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSection.kt index 92ccbab1..48b38674 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSection.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSection.kt @@ -12,8 +12,6 @@ interface FilterSectionDataSource : RowRepresentable { val allowMultiSelection : Boolean val exclusiveWith : List < FilterSectionDataSource > ? - val filterElementRows : List < FilterElement > - val filterElements : List < RowRepresentable > val selectionType : SelectionType } @@ -29,19 +27,6 @@ private interface DefaultFilterSectionDataSource : FilterSectionDataSource { override val selectionType: FilterSectionDataSource.SelectionType get() = FilterSectionDataSource.SelectionType.MULTIPLE - - override val filterElementRows: List < FilterElement > - get() = FilterElement.filterElementsFor(this) - - override val filterElements : List < RowRepresentable > - get() { - val elements = arrayListOf(this) - filterElementRows.forEach { - it.filterSection = this - elements.add(it) - } - return elements - } } enum class FilterSection(override val resId: Int?): DefaultFilterSectionDataSource, RowRepresentable { @@ -130,6 +115,11 @@ enum class FilterSection(override val resId: Int?): DefaultFilterSectionDataSour } } + val filterElements : List < RowRepresentable > + get() = arrayListOf(this).apply { + this.addAll(FilterElement.filterElementsFor(this@FilterSection)) + } + override val viewType: Int = RowViewType.HEADER_TITLE.ordinal override val selectionType: FilterSectionDataSource.SelectionType From 20b089ff273aa7aa076cca9dca5377ef87b73c01 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 22 Mar 2019 16:01:48 +0100 Subject: [PATCH 04/11] Fixes stat unit and label --- .../java/net/pokeranalytics/android/calculus/Stat.kt | 11 ++++++++--- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt index 7765025e..41e15ef2 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -124,12 +124,17 @@ class ComputedStat(var stat: Stat, var value: Double, var currency: Currency? = when (this.stat) { // Amounts + red/green - Stat.NETRESULT, Stat.HOURLY_RATE, Stat.AVERAGE, Stat.NET_BB_PER_100_HANDS, Stat.HOURLY_RATE_BB, - Stat.AVERAGE_NET_BB -> { + Stat.NETRESULT, Stat.HOURLY_RATE, Stat.AVERAGE -> { val numberFormat= CurrencyUtils.getCurrencyFormatter(context, currency) val color = if (this.value >= this.stat.threshold) R.color.green else R.color.red return TextFormat(numberFormat.format(this.value), color) - } // white integers + } + // Red/green values + Stat.HOURLY_RATE_BB, Stat.AVERAGE_NET_BB, Stat.NET_BB_PER_100_HANDS -> { + val color = if (this.value >= this.stat.threshold) R.color.green else R.color.red + return TextFormat(this.value.formatted(), color) + } + // white integers Stat.NUMBER_OF_SETS, Stat.NUMBER_OF_GAMES, Stat.HANDS_PLAYED -> { return TextFormat("${value.toInt()}") } // white durations diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4033df14..9fe43d73 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -13,7 +13,7 @@ Number of sessions Number of games Average duration - Net(BB) per 100 hands + Net per 100 hands (BB) Hourly rate (BB) Average net (BB) ROI From 5222fc864e82d3c019fb446f620cebd278a57a3a Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 22 Mar 2019 17:47:47 +0100 Subject: [PATCH 05/11] Fixing crash occurring when creating a new bankroll --- .../android/model/realm/Currency.kt | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt index 5f18c933..dd60d670 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt @@ -24,22 +24,26 @@ open class Currency : RealmObject() { val rate = value ?: 1.0 - // could be async + // could be async? - val query = this.realm.where(ComputableResult::class.java) - query.`in`("session.bankroll.currency.id", arrayOf(this.id)) - val cResults = query.findAll() + if (this.isManaged && this.realm != null) { - cResults.forEach { computable -> + val query = this.realm.where(ComputableResult::class.java) + query.`in`("session.bankroll.currency.id", arrayOf(this.id)) + val cResults = query.findAll() - computable.session?.result?.net?.let { - computable.ratedNet = it * rate - } - computable.session?.result?.buyin?.let { - computable.ratedBuyin = it * rate - } + cResults.forEach { computable -> + + computable.session?.result?.net?.let { + computable.ratedNet = it * rate + } + computable.session?.result?.buyin?.let { + computable.ratedBuyin = it * rate + } + + } + } - } } } \ No newline at end of file From 9118ebc3ddbc00f14532dcb874831b9f0d8c6d5e Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 22 Mar 2019 22:35:38 +0100 Subject: [PATCH 06/11] add filter realm save / load test --- .../filter/RealmFilterInstrumentedUnitTest.kt | 70 +++++++++++++++++++ .../android/model/filter/FilterType.kt | 4 ++ .../android/model/realm/Filter.kt | 42 ++++------- .../android/model/realm/FilterComponent.kt | 4 +- .../ui/view/rowrepresentable/FilterRow.kt | 30 +++++++- 5 files changed, 119 insertions(+), 31 deletions(-) create mode 100644 app/src/androidTest/java/net/pokeranalytics/android/filter/RealmFilterInstrumentedUnitTest.kt diff --git a/app/src/androidTest/java/net/pokeranalytics/android/filter/RealmFilterInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/filter/RealmFilterInstrumentedUnitTest.kt new file mode 100644 index 00000000..7bed8c6f --- /dev/null +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/RealmFilterInstrumentedUnitTest.kt @@ -0,0 +1,70 @@ +package net.pokeranalytics.android.filter + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import net.pokeranalytics.android.model.filter.FilterType +import net.pokeranalytics.android.model.realm.Filter +import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategory +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElement +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSection +import org.junit.Assert +import org.junit.Test +import org.junit.runner.RunWith +import java.util.* + +@RunWith(AndroidJUnit4::class) +class RealmFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { + + @Test + fun testSaveLoadCashFilter() { + + val realm = this.mockRealm + realm.beginTransaction() + val filter = Filter() + filter.name = "testSaveLoadCashFilter" + + val filterElement = FilterElement.Cash + filterElement.filterSection = FilterSection.CASH_TOURNAMENT + filter.componentsFrom(arrayListOf(filterElement)) + + val useCount = filter.countBy(FilterCategory.GENERAL) + Assert.assertEquals(1, useCount) + + val isCash = filter.contains(filterElement) + Assert.assertEquals(true, isCash) + + val filterComponent = filter.components.first() + + filterComponent?.let { + Assert.assertEquals(FilterType.CASH, FilterType.valueOf(it.filterName)) + } ?: run { + Assert.fail() + } + + Session.testInstance(100.0, false, Date(), 1) + Session.testInstance(100.0, true, Date(), 1) + + realm.copyToRealm(filter) + realm.commitTransaction() + + val newRealm = this.mockRealm + newRealm.beginTransaction() + newRealm.where(Filter::class.java).equalTo("name", "testSaveLoadCashFilter").findFirst()?.let { foundFilter -> + val loadedFilter = newRealm.copyFromRealm(foundFilter) + val sessions = loadedFilter.filter( + realm, + Session::class.java, + loadedFilter.components.map { + it.filterType + } + ) + + Assert.assertEquals(1, sessions.size) + sessions[0]?.run { + Assert.assertEquals(Session.Type.CASH_GAME.ordinal, (this as Session).type) + } + } ?: run { + Assert.fail() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/FilterType.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/FilterType.kt index a39188da..4a32f51c 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/FilterType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/FilterType.kt @@ -244,6 +244,10 @@ enum class FilterType(private var fieldName:String? = null, private var subType: } override fun setValueFrom(filterComponent: FilterComponent) { + if (filterValuesExpectedKeys == null) { + return + } + this.subType?.let { subType -> this.fieldName?.let { return when (subType) { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt index b565e213..ca46662b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt @@ -1,9 +1,8 @@ package net.pokeranalytics.android.model.realm -import io.realm.MutableRealmInteger -import io.realm.RealmList -import io.realm.RealmObject +import io.realm.* import io.realm.annotations.PrimaryKey +import net.pokeranalytics.android.model.filter.interfaces.Filterable import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategory import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElement import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSection @@ -25,6 +24,7 @@ open class Filter : RealmObject() { val usageCount: MutableRealmInteger = MutableRealmInteger.valueOf(0) var components: RealmList = RealmList() + private set fun componentsFrom(filterElements: ArrayList) { components.clear() @@ -50,43 +50,29 @@ open class Filter : RealmObject() { } } - fun numberOfElementIn(filterCategory: FilterCategory) : Int { + fun countBy(filterCategory: FilterCategory) : Int { val sections = FilterSection.filterSectionsFor(filterCategory) return components.count { sections.contains(FilterSection.valueOf(it.sectionName)) } } - fun isFilterElementExists(filterElement:FilterElement) : Boolean { - + fun contains(filterElement:FilterElement) : Boolean { val filtered = components.filter { - it.filterType == filterElement.filterType + it.filterName == filterElement.filterName } - if (filtered.isEmpty()) { return false } + return filterElement.contains(filtered) + } - return when (filterElement) { - is FilterElement.Game -> filtered.filter { - it.ids?.contains(filterElement.game.id) ?: false - }.isNotEmpty() - is FilterElement.Year -> TODO() - is FilterElement.Month -> TODO() - is FilterElement.Day -> TODO() - is FilterElement.Limit -> TODO() - is FilterElement.TableSize -> TODO() - is FilterElement.Bankroll -> TODO() - is FilterElement.Location -> TODO() - is FilterElement.TournamentName -> TODO() - is FilterElement.TournamentFeature -> TODO() - - is FilterElement.From -> TODO() - is FilterElement.To -> TODO() - is FilterElement.PastDays -> TODO() - - - else -> return true + fun filter(realm: Realm, relatedEntity: Class, queries:List): RealmResults<*> { + var realmQuery : RealmQuery = realm.where(relatedEntity) + queries.forEach { + realmQuery = (it.filter(realmQuery)) } + return realmQuery.findAll() } + } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt index 03b9cc27..d6c39235 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt @@ -11,7 +11,7 @@ import kotlin.collections.ArrayList open class FilterComponent(var filterName : String = "", var sectionName: String = "") : RealmObject() { - constructor(filterElements: ArrayList) : this(filterElements.first().filterType.name, filterElements.first().filterSection.name) { + constructor(filterElements: ArrayList) : this(filterElements.first().filterName, filterElements.first().sectionName) { this.ids = when (FilterType.valueOf(this.filterName)) { FilterType.GAME -> { RealmList().apply { @@ -35,7 +35,7 @@ open class FilterComponent(var filterName : String = "", var sectionName: String } } - constructor(filterElement:FilterElement) : this(filterElement.filterType.name, filterElement.filterSection.name) { + constructor(filterElement:FilterElement) : this(filterElement.filterName, filterElement.sectionName) { when (filterElement) { is From -> date = filterElement.date is To -> date = filterElement.date diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt index 230ec65e..a1d04906 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt @@ -5,11 +5,14 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.FilterValueMapException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.filter.FilterType +import net.pokeranalytics.android.model.realm.Filter +import net.pokeranalytics.android.model.realm.FilterComponent import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSection.* import java.lang.Exception import java.util.* +import kotlin.collections.ArrayList sealed class FilterElement : RowRepresentable { companion object { @@ -113,7 +116,10 @@ sealed class FilterElement : RowRepresentable { lateinit var filterSection: FilterSection - val filterType : FilterType + val filterName : String = this.filterType.name + val sectionName : String = this.filterSection.name + + private val filterType : FilterType get() { return when (this) { is Cash -> FilterType.CASH @@ -148,6 +154,28 @@ sealed class FilterElement : RowRepresentable { } } + fun contains(filterComponents: List) : Boolean { + return when (this) { + is Game -> filterComponents.any { + it.ids?.contains(this.game.id) ?: false + } + is From -> TODO() + is To -> TODO() + is Year -> TODO() + is Month -> TODO() + is Day -> TODO() + is PastDays -> TODO() + is Limit -> TODO() + is TableSize -> TODO() + is Bankroll -> TODO() + is Location -> TODO() + is TournamentName -> TODO() + is TournamentFeature -> TODO() + else -> return true + } + } + + override val resId: Int? get() { return when (this) { From f8e78e6a51f6c9efee24153ee34d38c84ea76f37 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 22 Mar 2019 23:32:13 +0100 Subject: [PATCH 07/11] clean up --- .../filter/RealmFilterInstrumentedUnitTest.kt | 12 +- .../net/pokeranalytics/android/model/Limit.kt | 1 - .../android/model/realm/Filter.kt | 30 +-- .../android/model/realm/FilterComponent.kt | 22 +-- .../android/model/realm/Game.kt | 1 - .../ui/fragment/FilterDetailsFragment.kt | 29 ++- .../android/ui/fragment/FiltersFragment.kt | 8 +- .../view/rowrepresentable/FilterCategory.kt | 33 ---- .../rowrepresentable/FilterCategoryRow.kt | 82 ++++++++ .../{FilterRow.kt => FilterElementRow.kt} | 147 ++++---------- .../{FilterSection.kt => FilterSectionRow.kt} | 183 +++++++++--------- 11 files changed, 263 insertions(+), 285 deletions(-) delete mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategory.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt rename app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/{FilterRow.kt => FilterElementRow.kt} (56%) rename app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/{FilterSection.kt => FilterSectionRow.kt} (66%) diff --git a/app/src/androidTest/java/net/pokeranalytics/android/filter/RealmFilterInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/filter/RealmFilterInstrumentedUnitTest.kt index 7bed8c6f..a287d9f5 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/filter/RealmFilterInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/RealmFilterInstrumentedUnitTest.kt @@ -4,9 +4,9 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import net.pokeranalytics.android.model.filter.FilterType import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Session -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategory -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElement -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSection +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow import org.junit.Assert import org.junit.Test import org.junit.runner.RunWith @@ -23,11 +23,11 @@ class RealmFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = Filter() filter.name = "testSaveLoadCashFilter" - val filterElement = FilterElement.Cash - filterElement.filterSection = FilterSection.CASH_TOURNAMENT + val filterElement = FilterElementRow.Cash + filterElement.filterSectionRow = FilterSectionRow.CASH_TOURNAMENT filter.componentsFrom(arrayListOf(filterElement)) - val useCount = filter.countBy(FilterCategory.GENERAL) + val useCount = filter.countBy(FilterCategoryRow.GENERAL) Assert.assertEquals(1, useCount) val isCash = filter.contains(filterElement) diff --git a/app/src/main/java/net/pokeranalytics/android/model/Limit.kt b/app/src/main/java/net/pokeranalytics/android/model/Limit.kt index 024fdcfd..d99031d8 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/Limit.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/Limit.kt @@ -1,7 +1,6 @@ package net.pokeranalytics.android.model import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSection enum class Limit : RowRepresentable { NO, diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt index ca46662b..e3a6522c 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt @@ -3,9 +3,9 @@ package net.pokeranalytics.android.model.realm import io.realm.* import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.model.filter.interfaces.Filterable -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategory -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElement -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSection +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow import java.util.* //import net.pokeranalytics.android.FilterComponent @@ -26,23 +26,23 @@ open class Filter : RealmObject() { var components: RealmList = RealmList() private set - fun componentsFrom(filterElements: ArrayList) { + fun componentsFrom(filterElementRows: ArrayList) { components.clear() - filterElements + filterElementRows .map { - it.filterSection + it.filterSectionRow } .distinct() .forEach { section -> - filterElements + filterElementRows .filter { - it.filterSection == section + it.filterSectionRow == section } .apply { if (this.size == 1) { components.add(FilterComponent(this.first())) } else { - val casted = arrayListOf() + val casted = arrayListOf() casted.addAll(this) components.add(FilterComponent(casted)) } @@ -50,21 +50,21 @@ open class Filter : RealmObject() { } } - fun countBy(filterCategory: FilterCategory) : Int { - val sections = FilterSection.filterSectionsFor(filterCategory) + fun countBy(filterCategoryRow: FilterCategoryRow) : Int { + val sections = filterCategoryRow.filterSectionRows return components.count { - sections.contains(FilterSection.valueOf(it.sectionName)) + sections.contains(FilterSectionRow.valueOf(it.sectionName)) } } - fun contains(filterElement:FilterElement) : Boolean { + fun contains(filterElementRow:FilterElementRow) : Boolean { val filtered = components.filter { - it.filterName == filterElement.filterName + it.filterName == filterElementRow.filterName } if (filtered.isEmpty()) { return false } - return filterElement.contains(filtered) + return filterElementRow.contains(filtered) } fun filter(realm: Realm, relatedEntity: Class, queries:List): RealmResults<*> { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt index d6c39235..462151e5 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt @@ -4,19 +4,19 @@ import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.Ignore import net.pokeranalytics.android.model.filter.FilterType -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElement -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElement.* +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow.* import java.util.* import kotlin.collections.ArrayList open class FilterComponent(var filterName : String = "", var sectionName: String = "") : RealmObject() { - constructor(filterElements: ArrayList) : this(filterElements.first().filterName, filterElements.first().sectionName) { + constructor(filterElementRows: ArrayList) : this(filterElementRows.first().filterName, filterElementRows.first().sectionName) { this.ids = when (FilterType.valueOf(this.filterName)) { FilterType.GAME -> { RealmList().apply { - this.addAll(filterElements.map { - (it as FilterElement.Game).game.id + this.addAll(filterElementRows.map { + (it as FilterElementRow.Game).game.id }) } } @@ -26,8 +26,8 @@ open class FilterComponent(var filterName : String = "", var sectionName: String this.values = when (FilterType.valueOf(filterName)) { FilterType.LIMIT -> { RealmList().apply { - this.addAll(filterElements.map { - (it as FilterElement.Limit).limit.ordinal + this.addAll(filterElementRows.map { + (it as FilterElementRow.Limit).limit.ordinal }) } } @@ -35,10 +35,10 @@ open class FilterComponent(var filterName : String = "", var sectionName: String } } - constructor(filterElement:FilterElement) : this(filterElement.filterName, filterElement.sectionName) { - when (filterElement) { - is From -> date = filterElement.date - is To -> date = filterElement.date + constructor(filterElementRow:FilterElementRow) : this(filterElementRow.filterName, filterElementRow.sectionName) { + when (filterElementRow) { + is From -> date = filterElementRow.date + is To -> date = filterElementRow.date } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt index 1d2dece9..bbb5e3fe 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt @@ -8,7 +8,6 @@ import net.pokeranalytics.android.model.interfaces.Manageable import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSection import net.pokeranalytics.android.ui.view.rowrepresentable.GameRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import net.pokeranalytics.android.util.NULL_TEXT diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt index dea0edb8..c41b27d9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt @@ -10,19 +10,16 @@ import io.realm.RealmObject import kotlinx.android.synthetic.main.fragment_filter_details.* import kotlinx.android.synthetic.main.fragment_filter_details.view.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment -import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment -import net.pokeranalytics.android.ui.helpers.DateTimePickerManager import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategory -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElement -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSection +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow import timber.log.Timber import java.util.* @@ -33,13 +30,13 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta lateinit var rowRepresentableAdapter: RowRepresentableAdapter private var rows: ArrayList = ArrayList() - private var rowsForFilterSubcategory: HashMap> = HashMap() + private var rowsForFilterSubcategoryRow: HashMap> = HashMap() private var filterMenu: Menu? = null - private var filterCategory: FilterCategory? = null + private var filterCategoryRow: FilterCategoryRow? = null - val selectedRows = ArrayList() + val selectedRows = ArrayList() var isUpdating = false @@ -68,10 +65,10 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta if (selectedRows.contains(row)) { selectedRows.remove(row) } else { - if (row is FilterElement) { + if (row is FilterElementRow) { row.sectionToExclude?.let { filterSectionToExclude -> val excludedFilters = selectedRows.filter { - filterSectionToExclude.contains(it.filterSection) + filterSectionToExclude.contains(it.filterSectionRow) } excludedFilters .forEach { selectedRows.remove(it) @@ -106,7 +103,7 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta override fun onRowValueChanged(value: Any?, row: RowRepresentable) { super.onRowValueChanged(value, row) - selectedRows.add(row as FilterElement) + selectedRows.add(row as FilterElementRow) rowRepresentableAdapter.refreshRow(row) } @@ -145,19 +142,19 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta this.appBar.toolbar.title = getString(R.string.filter) - filterCategory?.let { + filterCategoryRow?.let { this.appBar.toolbar.title = it.localizedTitle(requireContext()) this.rows.clear() - this.rowsForFilterSubcategory.clear() + this.rowsForFilterSubcategoryRow.clear() this.rows.addAll(it.filterElements) //TODO /* var filter = Filter() this.rows.forEach {element -> - if (filter.isFilterElementExists(element as FilterElement)) { + if (filter.isFilterElementExists(element as FilterElementRow)) { this.selectedRows.add(element) } } @@ -198,7 +195,7 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta */ fun setData(filterCategory: Int) { - this.filterCategory = FilterCategory.values()[filterCategory] + this.filterCategoryRow = FilterCategoryRow.values()[filterCategory] /* this.dataType = dataType diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt index 911a7771..cab37b3d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt @@ -16,7 +16,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategory +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow import timber.log.Timber @@ -93,7 +93,7 @@ open class FiltersFragment : PokerAnalyticsFragment(), StaticRowRepresentableDat override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { super.onRowSelected(position, row, fromAction) - if (row is FilterCategory) { + if (row is FilterCategoryRow) { selectedRow = row FilterDetailsActivity.newInstanceForResult(this, row.ordinal, REQUEST_CODE_FILTER_DETAILS) } @@ -103,7 +103,7 @@ open class FiltersFragment : PokerAnalyticsFragment(), StaticRowRepresentableDat //TODO /* override fun stringForRow(row: RowRepresentable): String { - return this.filter?.numberOfElementIn(row as FilterCategory).toString() + return this.filter?.numberOfElementIn(row as FilterCategoryRow).toString() } */ @@ -135,7 +135,7 @@ open class FiltersFragment : PokerAnalyticsFragment(), StaticRowRepresentableDat this.appBar.toolbar.title = getString(R.string.filter) - rows.addAll(FilterCategory.values()) + rows.addAll(FilterCategoryRow.values()) this.rowRepresentableAdapter = RowRepresentableAdapter(this, this) this.recyclerView.adapter = rowRepresentableAdapter diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategory.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategory.kt deleted file mode 100644 index 7e63ebb4..00000000 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategory.kt +++ /dev/null @@ -1,33 +0,0 @@ -package net.pokeranalytics.android.ui.view.rowrepresentable - -import net.pokeranalytics.android.R -import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.RowViewType - -enum class FilterCategory(override val resId: Int?, override val viewType: Int = RowViewType.TITLE_VALUE_ARROW.ordinal) : RowRepresentable { - GENERAL(R.string.general), - DATE(R.string.date), - TIME_FRAME(R.string.duration), - SESSION(R.string.session), - CASH(R.string.cash), - TOURNAMENT(R.string.tournament), - ONLINE(R.string.online), - RESULT(R.string.result), - TRANSACTION_TYPES(R.string.operation_types), - LOCATIONS(R.string.locations), - BANKROLLS(R.string.bankrolls), - PLAYERS(R.string.players), - ; - - val filterElements : List < RowRepresentable > - get() { - return filterSections.flatMap { - it.filterElements - } - } - - private val filterSections : List < FilterSection > - get() { - return FilterSection.filterSectionsFor(this) - } -} diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt new file mode 100644 index 00000000..f24f7979 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt @@ -0,0 +1,82 @@ +package net.pokeranalytics.android.ui.view.rowrepresentable + +import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow.* + +enum class FilterCategoryRow(override val resId: Int?, override val viewType: Int = RowViewType.TITLE_VALUE_ARROW.ordinal) : RowRepresentable { + GENERAL(R.string.general), + DATE(R.string.date), + TIME_FRAME(R.string.duration), + SESSION(R.string.session), + CASH(R.string.cash), + TOURNAMENT(R.string.tournament), + ONLINE(R.string.online), + RESULT(R.string.result), + TRANSACTION_TYPES(R.string.operation_types), + LOCATIONS(R.string.locations), + BANKROLLS(R.string.bankrolls), + PLAYERS(R.string.players), + ; + + val filterElements : List < RowRepresentable > + get() { + return filterSectionRows.flatMap { + it.filterElements + } + } + + val filterSectionRows : List < FilterSectionRow > + get() { + return when (this) { + GENERAL -> arrayListOf( + CASH_TOURNAMENT, + LIVE_ONLINE, + GAME, LIMIT_TYPE, + TABLE_SIZE + ) + DATE -> arrayListOf( + DYNAMIC_DATE, + FIXED_DATE, + DURATION, + YEAR, + WEEKDAYS_OR_WEEKEND, + DAY_OF_WEEK, + MONTH_OF_YEAR + ) + BANKROLLS -> arrayListOf( + BANKROLL + ) + CASH -> arrayListOf( + BLINDS, + CASH_RE_BUY_COUNT + ) + TOURNAMENT -> arrayListOf( + TOURNAMENT_TYPE, + COMPLETION_PERCENTAGE, + PLACE, + PLAYERS_COUNT, + TOURNAMENT_RE_BUY_COUNT, + BUY_IN + ) + ONLINE -> arrayListOf( + MULTI_TABLING + ) + LOCATIONS -> arrayListOf( + LOCATION + ) + PLAYERS -> arrayListOf( + NUMBER_OF_PLAYERS, + MULTI_PLAYER + ) + RESULT -> arrayListOf( + VALUE + ) + + TIME_FRAME -> arrayListOf() + SESSION -> arrayListOf() + TRANSACTION_TYPES -> arrayListOf() + } + } +} diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt similarity index 56% rename from app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt rename to app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt index a1d04906..5af706c3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt @@ -5,119 +5,46 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.FilterValueMapException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.filter.FilterType -import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.FilterComponent import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSection.* +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow.* import java.lang.Exception import java.util.* -import kotlin.collections.ArrayList - -sealed class FilterElement : RowRepresentable { - companion object { - fun filterElementsFor(filterSection: FilterSection) : List { - return when (filterSection) { - CASH_TOURNAMENT -> arrayListOf(Cash, Tournament) - LIVE_ONLINE -> arrayListOf(Live, Online) - LIMIT_TYPE -> { - val limits = arrayListOf() - net.pokeranalytics.android.model.Limit.values().forEach { - limits.add(FilterElement.Limit(it)) - } - limits - } - TABLE_SIZE -> { - val tableSizes = arrayListOf() - net.pokeranalytics.android.model.TableSize.all.forEach { - tableSizes.add(FilterElement.TableSize(it)) - } - tableSizes - } - - DYNAMIC_DATE -> arrayListOf(Today, Yesterday, TodayAndYesterday, CurrentWeek, CurrentMonth, CurrentYear) - FIXED_DATE -> arrayListOf(From(), To()) - DURATION -> arrayListOf() - WEEKDAYS_OR_WEEKEND -> arrayListOf(Weekday, Weekend) - DAY_OF_WEEK -> arrayListOf() - MONTH_OF_YEAR -> arrayListOf() - YEAR -> arrayListOf() - - GAME -> { - val games = arrayListOf() - val realm = Realm.getDefaultInstance() - LiveData.GAME.items(realm).forEach { - val game = FilterElement.Game(it as net.pokeranalytics.android.model.realm.Game) - games.add(game) - } - realm.close() - games - } - - LOCATION -> arrayListOf() - BANKROLL -> arrayListOf() - - MULTI_TABLING -> arrayListOf() - - BLINDS -> arrayListOf() - CASH_RE_BUY_COUNT -> arrayListOf() - BUY_IN -> arrayListOf() - - COMPLETION_PERCENTAGE -> arrayListOf() - NUMBER_OF_PLAYERS -> arrayListOf() - TOURNAMENT_TYPE -> arrayListOf() - PLAYERS_COUNT -> arrayListOf() - PLACE -> arrayListOf() - TOURNAMENT_RE_BUY_COUNT -> arrayListOf() - - MULTI_PLAYER -> arrayListOf() - - RANGE -> arrayListOf() - - SESSION_DURATION -> arrayListOf() - - VALUE -> arrayListOf() - - else -> throw Exception("unknown filtersection") //TODO create exception - }.apply { - this.forEach { - it.filterSection = filterSection - } - } - } - } - object Cash : FilterElement() - object Tournament : FilterElement() - object Live : FilterElement() - object Online : FilterElement() - object Today : FilterElement() - object Yesterday : FilterElement() - object TodayAndYesterday : FilterElement() - object CurrentWeek : FilterElement() - object CurrentMonth : FilterElement() - object CurrentYear: FilterElement() - object Weekday: FilterElement() - object Weekend : FilterElement() - - data class From(var date: Date = Date()) : FilterElement() - data class To(var date: Date = Date()) : FilterElement() - data class Year(val day: Int) : FilterElement() - data class Month(val day: Int) : FilterElement() - data class Day(val day: Int) : FilterElement() - data class PastDays(var lastDays : Int = 0) : FilterElement() - data class Limit(val limit : net.pokeranalytics.android.model.Limit) : FilterElement() - data class TableSize(val tableSize : net.pokeranalytics.android.model.TableSize) : FilterElement() - data class Bankroll(val bankroll: net.pokeranalytics.android.model.realm.Bankroll) : FilterElement() - data class Game(val game: net.pokeranalytics.android.model.realm.Game) : FilterElement() - data class Location(val location: net.pokeranalytics.android.model.realm.Location) : FilterElement() - data class TournamentName(val tournamentName: net.pokeranalytics.android.model.realm.TournamentName) : FilterElement() - data class TournamentFeature(val tournamentFeature: net.pokeranalytics.android.model.realm.TournamentFeature) : FilterElement() - - lateinit var filterSection: FilterSection +sealed class FilterElementRow : RowRepresentable { + + object Cash : FilterElementRow() + object Tournament : FilterElementRow() + object Live : FilterElementRow() + object Online : FilterElementRow() + object Today : FilterElementRow() + object Yesterday : FilterElementRow() + object TodayAndYesterday : FilterElementRow() + object CurrentWeek : FilterElementRow() + object CurrentMonth : FilterElementRow() + object CurrentYear: FilterElementRow() + object Weekday: FilterElementRow() + object Weekend : FilterElementRow() + + data class From(var date: Date = Date()) : FilterElementRow() + data class To(var date: Date = Date()) : FilterElementRow() + data class Year(val day: Int) : FilterElementRow() + data class Month(val day: Int) : FilterElementRow() + data class Day(val day: Int) : FilterElementRow() + data class PastDays(var lastDays : Int = 0) : FilterElementRow() + data class Limit(val limit : net.pokeranalytics.android.model.Limit) : FilterElementRow() + data class TableSize(val tableSize : net.pokeranalytics.android.model.TableSize) : FilterElementRow() + data class Bankroll(val bankroll: net.pokeranalytics.android.model.realm.Bankroll) : FilterElementRow() + data class Game(val game: net.pokeranalytics.android.model.realm.Game) : FilterElementRow() + data class Location(val location: net.pokeranalytics.android.model.realm.Location) : FilterElementRow() + data class TournamentName(val tournamentName: net.pokeranalytics.android.model.realm.TournamentName) : FilterElementRow() + data class TournamentFeature(val tournamentFeature: net.pokeranalytics.android.model.realm.TournamentFeature) : FilterElementRow() + + lateinit var filterSectionRow: FilterSectionRow val filterName : String = this.filterType.name - val sectionName : String = this.filterSection.name + val sectionName : String = this.filterSectionRow.name private val filterType : FilterType get() { @@ -216,13 +143,13 @@ sealed class FilterElement : RowRepresentable { override val viewType: Int = RowViewType.TITLE_CHECK.ordinal - val sectionToExclude : List < FilterSectionDataSource > ? + val sectionToExclude : List < FilterSectionRow > ? get() { - val excluded = arrayListOf() - if (!this.filterSection.allowMultiSelection) { - excluded.add(this.filterSection) + val excluded = arrayListOf() + if (!this.filterSectionRow.allowMultiSelection) { + excluded.add(this.filterSectionRow) } - this.filterSection.exclusiveWith?.let { exclusives -> + this.filterSectionRow.exclusiveWith?.let { exclusives -> excluded.addAll(exclusives) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSection.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt similarity index 66% rename from app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSection.kt rename to app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt index 48b38674..ff365799 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSection.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt @@ -1,35 +1,13 @@ package net.pokeranalytics.android.ui.view.rowrepresentable +import io.realm.Realm +import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategory.* +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow.* +import java.lang.Exception -interface FilterSectionDataSource : RowRepresentable { - enum class SelectionType { - SINGLE, - MULTIPLE, - } - - val allowMultiSelection : Boolean - val exclusiveWith : List < FilterSectionDataSource > ? - val selectionType : SelectionType -} - -private interface DefaultFilterSectionDataSource : FilterSectionDataSource { - override val viewType: Int - get() = RowViewType.HEADER_TITLE.ordinal - - override val exclusiveWith: List? - get() = null - - override val allowMultiSelection : Boolean - get() = (this.selectionType == FilterSectionDataSource.SelectionType.MULTIPLE) - - override val selectionType: FilterSectionDataSource.SelectionType - get() = FilterSectionDataSource.SelectionType.MULTIPLE -} - -enum class FilterSection(override val resId: Int?): DefaultFilterSectionDataSource, RowRepresentable { +enum class FilterSectionRow(override val resId: Int?): RowRepresentable { CASH_TOURNAMENT(net.pokeranalytics.android.R.string.cash_or_tournament), LIVE_ONLINE(net.pokeranalytics.android.R.string.live_or_online), GAME(net.pokeranalytics.android.R.string.games), @@ -60,77 +38,106 @@ enum class FilterSection(override val resId: Int?): DefaultFilterSectionDataSour MULTI_PLAYER(net.pokeranalytics.android.R.string.multiplayer), ; + private enum class SelectionType { + SINGLE, + MULTIPLE, + } - companion object { - fun filterSectionsFor(category: FilterCategory) : List < FilterSection > { - return when (category) { - GENERAL -> arrayListOf( - CASH_TOURNAMENT, - LIVE_ONLINE, - GAME, LIMIT_TYPE, - TABLE_SIZE - ) - DATE -> arrayListOf( - DYNAMIC_DATE, - FIXED_DATE, - DURATION, - YEAR, - WEEKDAYS_OR_WEEKEND, - DAY_OF_WEEK, - MONTH_OF_YEAR - ) - BANKROLLS -> arrayListOf( - BANKROLL - ) - CASH -> arrayListOf( - BLINDS, - CASH_RE_BUY_COUNT - ) - TOURNAMENT -> arrayListOf( - TOURNAMENT_TYPE, - COMPLETION_PERCENTAGE, - PLACE, - PLAYERS_COUNT, - TOURNAMENT_RE_BUY_COUNT, - BUY_IN - ) - ONLINE -> arrayListOf( - MULTI_TABLING - ) - LOCATIONS -> arrayListOf( - LOCATION - ) - PLAYERS -> arrayListOf( - NUMBER_OF_PLAYERS, - MULTI_PLAYER - ) - RESULT -> arrayListOf( - VALUE - ) + override val viewType: Int = RowViewType.HEADER_TITLE.ordinal - TIME_FRAME -> arrayListOf() - SESSION -> arrayListOf() - TRANSACTION_TYPES -> arrayListOf() - } - } - } + val allowMultiSelection : Boolean + get() = (this.selectionType == SelectionType.MULTIPLE) + + val filterElements : List < RowRepresentable > by lazy { + arrayListOf(this).apply { + this.addAll( + when (this@FilterSectionRow) { + CASH_TOURNAMENT -> arrayListOf(Cash, Tournament) + LIVE_ONLINE -> arrayListOf(Live, Online) + LIMIT_TYPE -> { + val limits = arrayListOf() + net.pokeranalytics.android.model.Limit.values().forEach { + limits.add(Limit(it)) + } + limits + } + TABLE_SIZE -> { + val tableSizes = arrayListOf() + net.pokeranalytics.android.model.TableSize.all.forEach { + tableSizes.add(TableSize(it)) + } + tableSizes + } - val filterElements : List < RowRepresentable > - get() = arrayListOf(this).apply { - this.addAll(FilterElement.filterElementsFor(this@FilterSection)) - } + DYNAMIC_DATE -> arrayListOf( + Today, + Yesterday, + TodayAndYesterday, + CurrentWeek, + CurrentMonth, + CurrentYear + ) + FIXED_DATE -> arrayListOf(From(), To()) + DURATION -> arrayListOf() + WEEKDAYS_OR_WEEKEND -> arrayListOf(Weekday, Weekend) + DAY_OF_WEEK -> arrayListOf() + MONTH_OF_YEAR -> arrayListOf() + YEAR -> arrayListOf() + + GAME -> { + val games = arrayListOf() + val realm = Realm.getDefaultInstance() + LiveData.GAME.items(realm).forEach { + val game = Game(it as net.pokeranalytics.android.model.realm.Game) + games.add(game) + } + realm.close() + games + } - override val viewType: Int = RowViewType.HEADER_TITLE.ordinal + LOCATION -> arrayListOf() + BANKROLL -> arrayListOf() + + MULTI_TABLING -> arrayListOf() + + BLINDS -> arrayListOf() + CASH_RE_BUY_COUNT -> arrayListOf() + BUY_IN -> arrayListOf() + + COMPLETION_PERCENTAGE -> arrayListOf() + NUMBER_OF_PLAYERS -> arrayListOf() + TOURNAMENT_TYPE -> arrayListOf() + PLAYERS_COUNT -> arrayListOf() + PLACE -> arrayListOf() + TOURNAMENT_RE_BUY_COUNT -> arrayListOf() + + MULTI_PLAYER -> arrayListOf() + + RANGE -> arrayListOf() + + SESSION_DURATION -> arrayListOf() + + VALUE -> arrayListOf() + + else -> throw Exception("unknown filtersection") //TODO create exception + }.apply { + this.forEach { + it.filterSectionRow = this@FilterSectionRow + } + } + ) + } + } - override val selectionType: FilterSectionDataSource.SelectionType + private val selectionType: SelectionType get() { return when (this) { - CASH_TOURNAMENT, DYNAMIC_DATE, LIVE_ONLINE -> FilterSectionDataSource.SelectionType.SINGLE - else -> FilterSectionDataSource.SelectionType.MULTIPLE + CASH_TOURNAMENT, DYNAMIC_DATE, LIVE_ONLINE -> SelectionType.SINGLE + else -> SelectionType.MULTIPLE } } - override val exclusiveWith: List? + val exclusiveWith: List? get() { return when (this) { DYNAMIC_DATE -> arrayListOf(FIXED_DATE) From b720ba8a9155ab5f6522d2c1b2eaa950812f40e2 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 22 Mar 2019 23:37:40 +0100 Subject: [PATCH 08/11] fix issue with lateinit in filterElement --- .../net/pokeranalytics/android/model/realm/FilterComponent.kt | 4 ++-- .../android/ui/view/rowrepresentable/FilterElementRow.kt | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt index 462151e5..4330ba9e 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt @@ -11,7 +11,7 @@ import kotlin.collections.ArrayList open class FilterComponent(var filterName : String = "", var sectionName: String = "") : RealmObject() { - constructor(filterElementRows: ArrayList) : this(filterElementRows.first().filterName, filterElementRows.first().sectionName) { + constructor(filterElementRows: ArrayList) : this(filterElementRows.first().filterName, filterElementRows.first().filterSectionRow.name) { this.ids = when (FilterType.valueOf(this.filterName)) { FilterType.GAME -> { RealmList().apply { @@ -35,7 +35,7 @@ open class FilterComponent(var filterName : String = "", var sectionName: String } } - constructor(filterElementRow:FilterElementRow) : this(filterElementRow.filterName, filterElementRow.sectionName) { + constructor(filterElementRow:FilterElementRow) : this(filterElementRow.filterName, filterElementRow.filterSectionRow.name) { when (filterElementRow) { is From -> date = filterElementRow.date is To -> date = filterElementRow.date diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt index 5af706c3..32910b55 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt @@ -44,7 +44,6 @@ sealed class FilterElementRow : RowRepresentable { lateinit var filterSectionRow: FilterSectionRow val filterName : String = this.filterType.name - val sectionName : String = this.filterSectionRow.name private val filterType : FilterType get() { From c41b9379334fa6caa3289c17a87d5a2f47981ab8 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Sat, 23 Mar 2019 09:53:41 +0100 Subject: [PATCH 09/11] filter clean up --- .../android/RealmInstrumentedUnitTest.kt | 10 +- .../filter/BlindFilterInstrumentedTest.kt | 18 +- .../filter/DateFilterInstrumentedUnitTest.kt | 38 +- .../filter/ExceptionFilterInstrumentedTest.kt | 30 +- .../filter/RealmFilterInstrumentedUnitTest.kt | 12 +- .../SessionFilterInstrumentedUnitTest.kt | 77 ++-- ...ilterable.kt => FilterEntityDataSource.kt} | 17 +- .../android/model/filter/FilterType.kt | 368 +++++++++--------- .../model/filter/interfaces/Filterable.kt | 8 - .../filter/interfaces/ValueFilterable.kt | 31 -- .../android/model/realm/Filter.kt | 28 +- .../android/model/realm/Session.kt | 41 +- .../view/rowrepresentable/FilterElementRow.kt | 5 +- .../view/rowrepresentable/FilterSectionRow.kt | 2 - 14 files changed, 344 insertions(+), 341 deletions(-) rename app/src/main/java/net/pokeranalytics/android/model/filter/{Filterable.kt => FilterEntityDataSource.kt} (72%) delete mode 100644 app/src/main/java/net/pokeranalytics/android/model/filter/interfaces/Filterable.kt delete mode 100644 app/src/main/java/net/pokeranalytics/android/model/filter/interfaces/ValueFilterable.kt diff --git a/app/src/androidTest/java/net/pokeranalytics/android/RealmInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/RealmInstrumentedUnitTest.kt index 45faaaef..b5be8a04 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/RealmInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/RealmInstrumentedUnitTest.kt @@ -32,16 +32,14 @@ open class RealmInstrumentedUnitTest { val testConfig = RealmConfiguration.Builder().inMemory().name("test-realm").build() Realm.setDefaultConfiguration(testConfig) this.mockRealm = Realm.getDefaultInstance() - - this.mockRealm.executeTransaction { - this.mockRealm.deleteAll() - } - + this.mockRealm.beginTransaction() + this.mockRealm.deleteAll() + this.mockRealm.commitTransaction() } @After @Throws(Exception::class) - public fun tearDown() { + fun tearDown() { this.mockRealm.close() } diff --git a/app/src/androidTest/java/net/pokeranalytics/android/filter/BlindFilterInstrumentedTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/filter/BlindFilterInstrumentedTest.kt index b4d27bde..cfd3ce64 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/filter/BlindFilterInstrumentedTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/BlindFilterInstrumentedTest.kt @@ -1,8 +1,8 @@ package net.pokeranalytics.android.filter -import net.pokeranalytics.android.model.filter.FilterManager import net.pokeranalytics.android.model.filter.FilterType import net.pokeranalytics.android.model.realm.Bankroll +import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Session import org.junit.Assert import org.junit.Test @@ -44,9 +44,9 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { "code" to null ))) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -91,9 +91,9 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { "code" to null ))) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -138,9 +138,9 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { "code" to "AUD" ))) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -191,9 +191,9 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { "code" to null ))) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) diff --git a/app/src/androidTest/java/net/pokeranalytics/android/filter/DateFilterInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/filter/DateFilterInstrumentedUnitTest.kt index 7f611d41..ca6f2f21 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/filter/DateFilterInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/DateFilterInstrumentedUnitTest.kt @@ -2,7 +2,7 @@ package net.pokeranalytics.android.filter import androidx.test.ext.junit.runners.AndroidJUnit4 import net.pokeranalytics.android.model.filter.FilterType -import net.pokeranalytics.android.model.filter.FilterManager +import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Session import org.junit.Assert import org.junit.Test @@ -29,9 +29,9 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { cal.time = s1.startDate filter.valueMap = mapOf("dayOfWeek" to cal.get(Calendar.DAY_OF_WEEK)) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -58,9 +58,9 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { cal.time = s1.startDate filter.valueMap = mapOf("month" to cal.get(Calendar.MONTH)) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -87,9 +87,9 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { cal.time = s1.startDate filter.valueMap = mapOf("year" to cal.get(Calendar.YEAR)) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -113,9 +113,9 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(100.0, true, cal.time) realm.commitTransaction() - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(FilterType.WEEK_END) ) @@ -138,9 +138,9 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(100.0, true, cal.time) realm.commitTransaction() - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(FilterType.WEEK_DAY) ) @@ -168,9 +168,9 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.STARTED_FROM_DATE filter.valueMap = mapOf("date" to s2.startDate) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -198,9 +198,9 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.STARTED_TO_DATE filter.valueMap = mapOf("date" to s1.startDate) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -229,9 +229,9 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.ENDED_FROM_DATE filter.valueMap = mapOf("date" to s2.endDate) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -260,9 +260,9 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.ENDED_TO_DATE filter.valueMap = mapOf("date" to s1.endDate) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) diff --git a/app/src/androidTest/java/net/pokeranalytics/android/filter/ExceptionFilterInstrumentedTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/filter/ExceptionFilterInstrumentedTest.kt index b2976510..1e9aeeea 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/filter/ExceptionFilterInstrumentedTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/ExceptionFilterInstrumentedTest.kt @@ -3,7 +3,7 @@ package net.pokeranalytics.android.filter import androidx.test.ext.junit.runners.AndroidJUnit4 import net.pokeranalytics.android.exceptions.FilterValueMapException import net.pokeranalytics.android.model.filter.FilterType -import net.pokeranalytics.android.model.filter.FilterManager +import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Session import org.junit.Test import org.junit.runner.RunWith @@ -12,25 +12,15 @@ import java.util.* @RunWith(AndroidJUnit4::class) class ExceptionFilterInstrumentedTest: BaseFilterInstrumentedUnitTest() { - @Test(expected = FilterValueMapException::class) - fun testFilterException() { - val realm = this.mockRealm - FilterManager().filter( - realm, - Session::class.java, - arrayListOf(FilterType.BLINDS) - ) - } - @Test(expected = FilterValueMapException::class) fun testValueKeyFilterException() { val filter = FilterType.STARTED_FROM_DATE filter.valueMap = mapOf("bob" to Date()) val realm = this.mockRealm - FilterManager().filter( + Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) } @@ -45,10 +35,20 @@ class ExceptionFilterInstrumentedTest: BaseFilterInstrumentedUnitTest() { ))) val realm = this.mockRealm - FilterManager().filter( + Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) } + + @Test(expected = FilterValueMapException::class) + fun testXFilterException() { + val realm = this.mockRealm + Filter.queryOn( + realm, + Session, + arrayListOf(FilterType.BLINDS) + ) + } } \ No newline at end of file diff --git a/app/src/androidTest/java/net/pokeranalytics/android/filter/RealmFilterInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/filter/RealmFilterInstrumentedUnitTest.kt index a287d9f5..712cc6ad 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/filter/RealmFilterInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/RealmFilterInstrumentedUnitTest.kt @@ -48,20 +48,14 @@ class RealmFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() val newRealm = this.mockRealm - newRealm.beginTransaction() newRealm.where(Filter::class.java).equalTo("name", "testSaveLoadCashFilter").findFirst()?.let { foundFilter -> - val loadedFilter = newRealm.copyFromRealm(foundFilter) - val sessions = loadedFilter.filter( - realm, - Session::class.java, - loadedFilter.components.map { - it.filterType - } - ) + val sessions = foundFilter.queryOn(Session) Assert.assertEquals(1, sessions.size) sessions[0]?.run { Assert.assertEquals(Session.Type.CASH_GAME.ordinal, (this as Session).type) + } ?: run { + Assert.fail() } } ?: run { Assert.fail() diff --git a/app/src/androidTest/java/net/pokeranalytics/android/filter/SessionFilterInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/filter/SessionFilterInstrumentedUnitTest.kt index e3d9896c..86513d6f 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/filter/SessionFilterInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/SessionFilterInstrumentedUnitTest.kt @@ -2,7 +2,6 @@ package net.pokeranalytics.android.filter import androidx.test.ext.junit.runners.AndroidJUnit4 import io.realm.RealmList -import net.pokeranalytics.android.model.filter.FilterManager import net.pokeranalytics.android.model.filter.FilterType import net.pokeranalytics.android.model.realm.* import org.junit.Assert @@ -23,9 +22,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(100.0, true, Date(), 1) realm.commitTransaction() - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(FilterType.CASH) ) @@ -45,9 +44,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(100.0, true, Date(), 1) realm.commitTransaction() - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(FilterType.TOURNAMENT) ) @@ -72,9 +71,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(100.0, true, Date(), 1, b2) realm.commitTransaction() - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(FilterType.LIVE) ) @@ -98,9 +97,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(100.0, true, Date(), 1, b2) realm.commitTransaction() - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(FilterType.ONLINE) ) @@ -125,9 +124,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.BANKROLL filter.valueMap = mapOf("ids" to arrayOf(b1.id)) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -158,9 +157,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.BANKROLL filter.valueMap = mapOf("ids" to arrayOf(b1.id, b2.id)) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -186,9 +185,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.GAME filter.valueMap = mapOf("ids" to arrayOf(g2.id)) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -219,9 +218,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.GAME filter.valueMap = mapOf("ids" to arrayOf(g2.id, g3.id)) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -247,9 +246,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.LOCATION filter.valueMap = mapOf("ids" to arrayOf(l1.id)) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -280,9 +279,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.LOCATION filter.valueMap = mapOf("ids" to arrayOf(l1.id, l3.id)) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -308,9 +307,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.TOURNAMENT_NAME filter.valueMap = mapOf("ids" to arrayOf(t1.id)) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -341,9 +340,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.TOURNAMENT_NAME filter.valueMap = mapOf("ids" to arrayOf(t1.id, t2.id)) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -377,9 +376,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.ALL_TOURNAMENT_FEATURES filter.valueMap = mapOf("ids" to arrayOf(t1.id, t2.id, t3.id, t4.id)) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -410,9 +409,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.ANY_TOURNAMENT_FEATURES filter.valueMap = mapOf("ids" to arrayOf(t1.id, t2.id, t3.id, t4.id)) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -440,9 +439,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.ANY_TOURNAMENT_FEATURES filter.valueMap = mapOf("ids" to arrayOf(t2.id)) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -467,9 +466,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.TABLE_SIZE filter.valueMap = mapOf("values" to arrayOf(2,4)) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -494,9 +493,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.MORE_THAN_NET_RESULT filter.valueMap = mapOf("value" to 204.0) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -521,9 +520,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filter = FilterType.LESS_THAN_NET_RESULT filter.valueMap = mapOf("value" to 540.0) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filter) ) @@ -551,9 +550,9 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filterLess = FilterType.LESS_THAN_NET_RESULT filterLess.valueMap = mapOf("value" to 400.0) - val sessions = FilterManager().filter( + val sessions = Filter.queryOn( realm, - Session::class.java, + Session, arrayListOf(filterMore, filterLess) ) diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/FilterEntityDataSource.kt similarity index 72% rename from app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt rename to app/src/main/java/net/pokeranalytics/android/model/filter/FilterEntityDataSource.kt index aa6510af..ce8e0a2a 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/FilterEntityDataSource.kt @@ -1,10 +1,6 @@ package net.pokeranalytics.android.model.filter -import io.realm.Realm import io.realm.RealmObject -import io.realm.RealmQuery -import io.realm.RealmResults -import net.pokeranalytics.android.model.filter.interfaces.Filterable /** * We want to be able to store filters in the database: @@ -32,15 +28,12 @@ import net.pokeranalytics.android.model.filter.interfaces.Filterable * */ -class FilterManager { - fun filter(realm:Realm, relatedEntity: Class, queries:List): RealmResults<*> { - var realmQuery : RealmQuery = realm.where(relatedEntity) - queries.forEach { - realmQuery = (it.filter(realmQuery)) - } - return realmQuery.findAll() - } +interface FilterEntityDataSource { + val relatedEntity: Class + fun fieldNameForQueryType(filterType: FilterType) : String? + } + // //fun MutableList.filter(filter: FilterComponent) : List { // diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/FilterType.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/FilterType.kt index 4a32f51c..f7e8bdf4 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/FilterType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/FilterType.kt @@ -3,43 +3,68 @@ 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.filter.interfaces.Filterable import net.pokeranalytics.android.model.realm.FilterComponent import net.pokeranalytics.android.model.realm.Session import java.util.* -enum class FilterType(private var fieldName:String? = null, private var subType:SubType? = null): Filterable { +/** + * We want to be able to store filters in the database: + * - filters can be a combination of sub filters + * - filters can be applied to different type of objects: Sessions, Hands, Transactions... + * - filters can be applied to a list of different type of objects (feed) + * + * A filter is described by the following: + * - a data type: Session, Hands... + * - a field: table size of a Session + * - an operator: equal, >=, <... + * - a value: an id, a number, a date... + * + * We can decide to have a collection of [operator, value] for a field + * + * Combination: + * - multiple datatype filters should be handled as 'OR' + * - multiple field filters should be handled as 'AND' + * - multiple '=' filters as 'OR' + * - multiple 'Greater than', 'less than' as 'AND' + * - multiple values as 'OR' + * + * Also: + * A filter should be able to be converted into a Realm query + * + */ + +enum class FilterType(private var subType:SubType? = null) { LIVE, CASH, ONLINE, TOURNAMENT, - BANKROLL("bankroll.id"), - GAME("game.id"), - TOURNAMENT_NAME("tournamentName.id"), + BANKROLL, + GAME, + TOURNAMENT_NAME, ANY_TOURNAMENT_FEATURES, ALL_TOURNAMENT_FEATURES, - LOCATION("location.id"), - LIMIT("limit"), - TABLE_SIZE("tableSize"), - TOURNAMENT_TYPE("tournamentType"), + LOCATION, + LIMIT, + TABLE_SIZE, + TOURNAMENT_TYPE, BLINDS, - MORE_NUMBER_OF_TABLE(Field.NUMBER_OF_TABLE.fieldName, SubType.MORE), - LESS_NUMBER_OF_TABLE(Field.NUMBER_OF_TABLE.fieldName, SubType.LESS), - BETWEEN_NUMBER_OF_TABLE(Field.NUMBER_OF_TABLE.fieldName, SubType.BETWEEN), - MORE_THAN_NET_RESULT(Field.NET_RESULT.fieldName, SubType.MORE), - LESS_THAN_NET_RESULT(Field.NET_RESULT.fieldName, SubType.LESS), - MORE_THAN_BUY_IN(Field.BUY_IN.fieldName, SubType.MORE), - LESS_THAN_BUY_IN(Field.BUY_IN.fieldName, SubType.LESS), - MORE_THAN_CASH_OUT(Field.CASH_OUT.fieldName, SubType.MORE), - LESS_THAN_CASH_OUT(Field.CASH_OUT.fieldName, SubType.LESS), - MORE_THAN_TIPS(Field.TIPS.fieldName, SubType.MORE), - LESS_THAN_TIPS(Field.TIPS.fieldName, SubType.LESS), - MORE_THAN_NUMBER_OF_PLAYER(Field.NUMBER_OF_PLAYER.fieldName, SubType.MORE), - LESS_THAN_NUMBER_OF_PLAYER(Field.NUMBER_OF_PLAYER.fieldName, SubType.LESS), - BETWEEN_NUMBER_OF_PLAYER(Field.NUMBER_OF_PLAYER.fieldName, SubType.BETWEEN), - MORE_THAN_TOURNAMENT_FEE(Field.NET_RESULT.fieldName, SubType.MORE), - LESS_THAN_TOURNAMENT_FEE(Field.NET_RESULT.fieldName, SubType.LESS), - BETWEEN_TOURNAMENT_FEE(Field.TOURNAMENT_FEE.fieldName, SubType.BETWEEN), + MORE_NUMBER_OF_TABLE(SubType.MORE), + LESS_NUMBER_OF_TABLE(SubType.LESS), + BETWEEN_NUMBER_OF_TABLE(SubType.BETWEEN), + MORE_THAN_NET_RESULT(SubType.MORE), + LESS_THAN_NET_RESULT(SubType.LESS), + MORE_THAN_BUY_IN(SubType.MORE), + LESS_THAN_BUY_IN(SubType.LESS), + MORE_THAN_CASH_OUT(SubType.MORE), + LESS_THAN_CASH_OUT(SubType.LESS), + MORE_THAN_TIPS(SubType.MORE), + LESS_THAN_TIPS(SubType.LESS), + MORE_THAN_NUMBER_OF_PLAYER(SubType.MORE), + LESS_THAN_NUMBER_OF_PLAYER(SubType.LESS), + BETWEEN_NUMBER_OF_PLAYER(SubType.BETWEEN), + MORE_THAN_TOURNAMENT_FEE(SubType.MORE), + LESS_THAN_TOURNAMENT_FEE(SubType.LESS), + BETWEEN_TOURNAMENT_FEE(SubType.BETWEEN), // Dates STARTED_FROM_DATE, @@ -52,42 +77,21 @@ enum class FilterType(private var fieldName:String? = null, private var subType: WEEK_DAY, WEEK_END, + CURRENCY, + CURRENCY_CODE, + BIG_BLIND, + SMALL_BLIND, + COMMENT, + ; - enum class SubType { + private enum class SubType { BETWEEN, MORE, LESS; } - private enum class Field(var fieldName:String) { - LIVE("bankroll.live"), - CASH("type"), - CURRENCY("bankroll.currency"), - CURRENCY_CODE("bankroll.currency.code"), - BIG_BLIND("cgBigBlind"), - SMALL_BLIND("cgSmallBlind"), - COMMENT("comment"), - TOURNAMENT_FEATURES("tournamentFeatures.id"), - NET_RESULT("computableResults.ratedNet"), - BUY_IN("result.buyin"), - CASH_OUT("result.cashout"), - TIPS("result.tips"), - NUMBER_OF_TABLE("numberOfTable"), - NUMBER_OF_PLAYER("tournamentNumberOfPlayers"), - TOURNAMENT_FEE("tournamentEntryFee"), - START_DATE("startDate"), - END_DATE("endDate"), - DAY("dayOfWeek"), - MONTH("month"), - YEAR("year"), - - ; - } - - override var valueMap : Map? = null - - override val filterValuesExpectedKeys : Array? + private val filterValuesExpectedKeys : Array? get() { this.subType?.let { return when (it) { @@ -107,66 +111,17 @@ enum class FilterType(private var fieldName:String? = null, private var subType: } } - override fun filter(realmQuery: RealmQuery): RealmQuery { + fun filter(realmQuery: RealmQuery, filterEntityDataSource: FilterEntityDataSource): RealmQuery { + when { + this == BLINDS -> { + val smallBlindFieldName = filterEntityDataSource.fieldNameForQueryType(SMALL_BLIND) + val bigBlindFieldName = filterEntityDataSource.fieldNameForQueryType(BIG_BLIND) + val currencyCodeFieldName = filterEntityDataSource.fieldNameForQueryType(CURRENCY_CODE) + smallBlindFieldName ?: throw FilterValueMapException("fieldName is missing") + bigBlindFieldName ?: throw FilterValueMapException("fieldName is missing") + currencyCodeFieldName ?: throw FilterValueMapException("fieldName is missing") - this.subType?.let {subType -> - this.fieldName?.let { - return when (subType) { - SubType.LESS -> { - val value: Double by filterValues - println("filter test less") - realmQuery.lessThanOrEqualTo(it, value) - } - SubType.MORE -> { - println("filter test more") - val value: Double by filterValues - realmQuery.greaterThanOrEqualTo(it, value) - } - SubType.BETWEEN -> { - val leftValue: Double by filterValues - val rightValue: Double by filterValues - realmQuery.between(it, leftValue, rightValue) - } - } - } ?: run { - throw FilterValueMapException("fieldName is missing") - } - } - - 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()) - ALL_TOURNAMENT_FEATURES -> { - val ids : Array by filterValues - ids.forEach { - realmQuery.equalTo(Field.TOURNAMENT_FEATURES.fieldName, it) - } - realmQuery - } - ANY_TOURNAMENT_FEATURES -> { - val ids : Array by filterValues - realmQuery.`in`(Field.TOURNAMENT_FEATURES.fieldName, ids) - } - BANKROLL, GAME, LOCATION, TOURNAMENT_NAME -> { - val ids : Array by filterValues - this.fieldName?.let { - realmQuery.`in`(it, ids) - } ?: run { - throw FilterValueMapException("fieldName is missing") - } - } - LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> { - val values : Array? by filterValues - this.fieldName?.let { - realmQuery.`in`(it, values) - } ?: run { - throw FilterValueMapException("fieldName is missing") - } - } - BLINDS -> { - val blinds : Array> by filterValues + val blinds: Array> by valueMap val expectedSubKeys = arrayOf("sb", "bb", "code") blinds.forEachIndexed { index, subMap -> val missingKeys = subMap.keys.filter { !expectedSubKeys.contains(it) } @@ -174,27 +129,27 @@ enum class FilterType(private var fieldName:String? = null, private var subType: throw FilterValueMapException("subValueMap does not contain $missingKeys") } - val sb : Double? by subMap - val bb : Double? by subMap - val code : String? by subMap + 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) + .equalTo(smallBlindFieldName, sb) .and() } realmQuery - .equalTo(Field.BIG_BLIND.fieldName, bb) + .equalTo(bigBlindFieldName, bb) .and() code?.let { - realmQuery.equalTo(Field.CURRENCY_CODE.fieldName, code) + realmQuery.equalTo(currencyCodeFieldName, code) } ?: run { - realmQuery.isNull(Field.CURRENCY_CODE.fieldName) + realmQuery.isNull(currencyCodeFieldName) } realmQuery.endGroup() @@ -203,94 +158,155 @@ enum class FilterType(private var fieldName:String? = null, private var subType: realmQuery.or() } } - realmQuery - } - 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) + return realmQuery } - WEEK_END -> { - realmQuery.`in`(Field.DAY.fieldName, arrayOf(Calendar.SATURDAY,Calendar.SUNDAY)) - } - WEEK_DAY -> WEEK_END.filter(realmQuery.not()) + this == ONLINE -> return LIVE.filter(realmQuery.not(), filterEntityDataSource) + this == TOURNAMENT -> return CASH.filter(realmQuery.not(), filterEntityDataSource) + this == WEEK_DAY -> return WEEK_END.filter(realmQuery.not(), filterEntityDataSource) else -> { - throw FilterValueMapException("filter type not handled") + val fieldName = filterEntityDataSource.fieldNameForQueryType(this) + fieldName ?: throw FilterValueMapException("fieldName is missing") + + this.subType?.let { subType -> + return when (subType) { + SubType.LESS -> { + val value: Double by valueMap + realmQuery.lessThanOrEqualTo(fieldName, value) + } + SubType.MORE -> { + val value: Double by valueMap + realmQuery.greaterThanOrEqualTo(fieldName, value) + } + SubType.BETWEEN -> { + val leftValue: Double by valueMap + val rightValue: Double by valueMap + realmQuery.between(fieldName, leftValue, rightValue) + } + } + } + + return when (this) { + LIVE -> realmQuery.equalTo(fieldName, true) + CASH -> realmQuery.equalTo(fieldName, Session.Type.CASH_GAME.ordinal) + ALL_TOURNAMENT_FEATURES -> { + val ids: Array by valueMap + ids.forEach { + realmQuery.equalTo(fieldName, it) + } + realmQuery + } + ANY_TOURNAMENT_FEATURES -> { + val ids: Array by valueMap + realmQuery.`in`(fieldName, ids) + } + BANKROLL, GAME, LOCATION, TOURNAMENT_NAME -> { + val ids: Array by valueMap + realmQuery.`in`(fieldName, ids) + } + LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> { + val values: Array? by valueMap + realmQuery.`in`(fieldName, values) + } + STARTED_FROM_DATE -> { + val date: Date by valueMap + realmQuery.greaterThanOrEqualTo(fieldName, date) + } + STARTED_TO_DATE -> { + val date: Date by valueMap + realmQuery.lessThanOrEqualTo(fieldName, date) + } + ENDED_FROM_DATE -> { + val date: Date by valueMap + realmQuery.greaterThanOrEqualTo(fieldName, date) + } + ENDED_TO_DATE -> { + val date: Date by valueMap + realmQuery.lessThanOrEqualTo(fieldName, date) + } + DAY_OF_WEEK -> { + val dayOfWeek: Int by valueMap + realmQuery.equalTo(fieldName, dayOfWeek) + } + MONTH -> { + val month: Int by valueMap + realmQuery.equalTo(fieldName, month) + } + YEAR -> { + val year: Int by valueMap + realmQuery.equalTo(fieldName, year) + } + WEEK_END -> { + realmQuery.`in`(fieldName, arrayOf(Calendar.SATURDAY, Calendar.SUNDAY)) + } + else -> { + throw FilterValueMapException("filter type not handled") + } + } } } + } - override fun setValueFrom(filterComponent: FilterComponent) { + fun setValueFrom(filterComponent: FilterComponent) { if (filterValuesExpectedKeys == null) { return } this.subType?.let { subType -> - this.fieldName?.let { - return when (subType) { - SubType.LESS, SubType.MORE -> { - filterValues = mapOf("value" to filterComponent.value) - } - SubType.BETWEEN -> { - filterValues = mapOf( - "leftValue" to filterComponent.leftValue, - "rightValue" to filterComponent.rightValue - ) - } + valueMap = when (subType) { + SubType.LESS, SubType.MORE -> { + mapOf("value" to filterComponent.value) + } + SubType.BETWEEN -> { + mapOf( + "leftValue" to filterComponent.leftValue, + "rightValue" to filterComponent.rightValue + ) } - } ?: run { - throw FilterValueMapException("fieldName is missing") } } when (this) { ALL_TOURNAMENT_FEATURES, ANY_TOURNAMENT_FEATURES, BANKROLL, GAME, LOCATION, TOURNAMENT_NAME -> { - filterValues = mapOf("ids" to filterComponent.ids) + valueMap = mapOf("ids" to filterComponent.ids) } LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> { - filterValues = mapOf("values" to filterComponent.values) + valueMap = mapOf("values" to filterComponent.values) } BLINDS -> { - filterValues = mapOf("blinds" to filterComponent.blinds) + valueMap = mapOf("blinds" to filterComponent.blinds) } STARTED_FROM_DATE, STARTED_TO_DATE, ENDED_FROM_DATE, ENDED_TO_DATE -> { - filterValues = mapOf("date" to filterComponent.date) + valueMap = mapOf("date" to filterComponent.date) } DAY_OF_WEEK -> { - filterValues = mapOf("dayOfWeek" to filterComponent.dayOfWeek) + valueMap = mapOf("dayOfWeek" to filterComponent.dayOfWeek) } MONTH -> { - filterValues = mapOf("month" to filterComponent.month) + valueMap = mapOf("month" to filterComponent.month) } YEAR -> { - filterValues = mapOf("year" to filterComponent.year) + valueMap = mapOf("year" to filterComponent.year) } else -> { throw FilterValueMapException("filter type not handled") } } } + + var valueMap : Map? = 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 FilterValueMapException("valueMap does not contain $missingKeys") + } + } ?: run { + throw FilterValueMapException("valueMap null not expected") + } + } + return field + } + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/interfaces/Filterable.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/interfaces/Filterable.kt deleted file mode 100644 index 509ee118..00000000 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/interfaces/Filterable.kt +++ /dev/null @@ -1,8 +0,0 @@ -package net.pokeranalytics.android.model.filter.interfaces - -import io.realm.RealmObject -import io.realm.RealmQuery - -interface Filterable : ValueFilterable { - fun filter(realmQuery: RealmQuery): RealmQuery -} diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/interfaces/ValueFilterable.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/interfaces/ValueFilterable.kt deleted file mode 100644 index f49f6f2a..00000000 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/interfaces/ValueFilterable.kt +++ /dev/null @@ -1,31 +0,0 @@ -package net.pokeranalytics.android.model.filter.interfaces - -import net.pokeranalytics.android.exceptions.FilterValueMapException -import net.pokeranalytics.android.model.realm.FilterComponent - -interface ValueFilterable { - - var valueMap: Map? - - var filterValues : Map? - get() { - this.filterValuesExpectedKeys?.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 filterValuesExpectedKeys : Array? - - fun setValueFrom(filterComponent: FilterComponent) -} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt index e3a6522c..4567c982 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt @@ -2,17 +2,25 @@ package net.pokeranalytics.android.model.realm import io.realm.* import io.realm.annotations.PrimaryKey -import net.pokeranalytics.android.model.filter.interfaces.Filterable +import net.pokeranalytics.android.model.filter.FilterEntityDataSource +import net.pokeranalytics.android.model.filter.FilterType import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow import java.util.* -//import net.pokeranalytics.android.FilterComponent - - open class Filter : RealmObject() { + companion object { + fun queryOn(realm: Realm, entity: FilterEntityDataSource, queries:List): RealmResults<*> { + var realmQuery : RealmQuery = realm.where(entity.relatedEntity) + queries.forEach { + realmQuery = (it.filter(realmQuery, entity)) + } + return realmQuery.findAll() + } + } + @PrimaryKey var id = UUID.randomUUID().toString() @@ -67,12 +75,14 @@ open class Filter : RealmObject() { return filterElementRow.contains(filtered) } - fun filter(realm: Realm, relatedEntity: Class, queries:List): RealmResults<*> { - var realmQuery : RealmQuery = realm.where(relatedEntity) - queries.forEach { - realmQuery = (it.filter(realmQuery)) + fun queryOn(entity: FilterEntityDataSource) : RealmResults<*> { + var realmQuery : RealmQuery = realm.where(entity.relatedEntity) + this.components.map { + it.filterType + }.forEach { + realmQuery = (it.filter(realmQuery, entity)) } + return realmQuery.findAll() } - } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index 1690abaf..2d403971 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -20,6 +20,9 @@ import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.extensions.SessionState import net.pokeranalytics.android.model.extensions.getState +import net.pokeranalytics.android.model.filter.FilterEntityDataSource +import net.pokeranalytics.android.model.filter.FilterType +import net.pokeranalytics.android.model.filter.FilterType.* import net.pokeranalytics.android.model.filter.interfaces.TimeFilterable import net.pokeranalytics.android.model.interfaces.Manageable import net.pokeranalytics.android.model.interfaces.Timed @@ -47,11 +50,10 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource TOURNAMENT } - companion object { + companion object : FilterEntityDataSource { fun newInstance(realm: Realm, isTournament: Boolean, bankroll: Bankroll? = null): Session { val session = Session() session.result = Result() - if (bankroll != null) { session.bankroll = bankroll } else { @@ -60,6 +62,41 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource session.type = if (isTournament) Session.Type.TOURNAMENT.ordinal else Session.Type.CASH_GAME.ordinal return realm.copyToRealm(session) } + + override val relatedEntity: Class = Session::class.java + + override fun fieldNameForQueryType(filterType: FilterType): String? { + return when (filterType) { + LIVE -> "bankroll.live" + CASH -> "type" + BANKROLL -> "bankroll.id" + GAME -> "game.id" + TOURNAMENT_NAME -> "tournamentName.id" + ANY_TOURNAMENT_FEATURES, ALL_TOURNAMENT_FEATURES -> "tournamentFeatures.id" + LOCATION -> "location.id" + LIMIT -> "limit" + TABLE_SIZE -> "tableSize" + TOURNAMENT_TYPE -> "tournamentType" + CURRENCY -> "bankroll.currency" + CURRENCY_CODE -> "bankroll.currency.code" + BIG_BLIND -> "cgBigBlind" + SMALL_BLIND -> "cgSmallBlind" + COMMENT -> "comment" + BETWEEN_NUMBER_OF_TABLE, MORE_NUMBER_OF_TABLE, LESS_NUMBER_OF_TABLE -> "numberOfTable" + MORE_THAN_NET_RESULT, LESS_THAN_NET_RESULT -> "computableResults.ratedNet" + MORE_THAN_BUY_IN, LESS_THAN_BUY_IN -> "result.buyin" + MORE_THAN_CASH_OUT, LESS_THAN_CASH_OUT -> "result.cashout" + MORE_THAN_TIPS, LESS_THAN_TIPS -> "result.tips" + MORE_THAN_NUMBER_OF_PLAYER, LESS_THAN_NUMBER_OF_PLAYER, BETWEEN_NUMBER_OF_PLAYER -> "tournamentNumberOfPlayers" + MORE_THAN_TOURNAMENT_FEE, LESS_THAN_TOURNAMENT_FEE, BETWEEN_TOURNAMENT_FEE -> "tournamentEntryFee" + STARTED_FROM_DATE, STARTED_TO_DATE -> "startDate" + ENDED_FROM_DATE, ENDED_TO_DATE -> "endDate" + DAY_OF_WEEK, WEEK_END -> "dayOfWeek" + MONTH -> "month" + YEAR -> "year" + else -> null + } + } } @PrimaryKey diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt index 32910b55..35cecdf6 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt @@ -1,15 +1,12 @@ package net.pokeranalytics.android.ui.view.rowrepresentable -import io.realm.Realm import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.FilterValueMapException -import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.filter.FilterType import net.pokeranalytics.android.model.realm.FilterComponent import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow.* -import java.lang.Exception + import java.util.* sealed class FilterElementRow : RowRepresentable { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt index ff365799..1696bdac 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt @@ -5,7 +5,6 @@ import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow.* -import java.lang.Exception enum class FilterSectionRow(override val resId: Int?): RowRepresentable { CASH_TOURNAMENT(net.pokeranalytics.android.R.string.cash_or_tournament), @@ -119,7 +118,6 @@ enum class FilterSectionRow(override val resId: Int?): RowRepresentable { VALUE -> arrayListOf() - else -> throw Exception("unknown filtersection") //TODO create exception }.apply { this.forEach { it.filterSectionRow = this@FilterSectionRow From ea728a1cf277ffdb9e2a1e738a259d3f735420ca Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Sat, 23 Mar 2019 14:48:39 +0100 Subject: [PATCH 10/11] filter cleanup --- .../filter/BlindFilterInstrumentedTest.kt | 63 ++++---- .../filter/DateFilterInstrumentedUnitTest.kt | 59 ++++--- .../filter/ExceptionFilterInstrumentedTest.kt | 32 ++-- .../filter/RealmFilterInstrumentedUnitTest.kt | 8 +- .../SessionFilterInstrumentedUnitTest.kt | 134 +++++++++++----- .../android/calculus/Calculator.kt | 4 +- .../android/calculus/ComputableGroup.kt | 2 +- .../pokeranalytics/android/calculus/Stat.kt | 4 +- .../android/exceptions/Exceptions.kt | 4 +- ...ilterEntityDataSource.kt => Filterable.kt} | 16 +- .../filter/{FilterType.kt => QueryType.kt} | 106 ++++++------- .../{filter => }/interfaces/TimeFilterable.kt | 8 +- .../android/model/realm/Filter.kt | 35 +++-- .../android/model/realm/FilterComponent.kt | 81 ---------- .../android/model/realm/FilterElement.kt | 144 ++++++++++++++++++ .../android/model/realm/FilterElementBlind.kt | 8 + .../android/model/realm/Session.kt | 16 +- .../ui/adapter/RowRepresentableDataSource.kt | 2 +- .../ui/fragment/FilterDetailsFragment.kt | 2 +- .../android/ui/view/RowRepresentable.kt | 2 +- .../view/rowrepresentable/FilterElementRow.kt | 110 ++++++------- .../view/rowrepresentable/FilterSectionRow.kt | 7 +- 22 files changed, 499 insertions(+), 348 deletions(-) rename app/src/main/java/net/pokeranalytics/android/model/filter/{FilterEntityDataSource.kt => Filterable.kt} (73%) rename app/src/main/java/net/pokeranalytics/android/model/filter/{FilterType.kt => QueryType.kt} (73%) rename app/src/main/java/net/pokeranalytics/android/model/{filter => }/interfaces/TimeFilterable.kt (69%) delete mode 100644 app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/model/realm/FilterElement.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/model/realm/FilterElementBlind.kt diff --git a/app/src/androidTest/java/net/pokeranalytics/android/filter/BlindFilterInstrumentedTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/filter/BlindFilterInstrumentedTest.kt index cfd3ce64..91ec0cb2 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/filter/BlindFilterInstrumentedTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/BlindFilterInstrumentedTest.kt @@ -1,9 +1,9 @@ package net.pokeranalytics.android.filter -import net.pokeranalytics.android.model.filter.FilterType -import net.pokeranalytics.android.model.realm.Bankroll -import net.pokeranalytics.android.model.realm.Filter -import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.model.filter.QueryType +import net.pokeranalytics.android.model.realm.* +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow import org.junit.Assert import org.junit.Test import java.util.* @@ -37,12 +37,11 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = FilterType.BLINDS - filter.valueMap = mapOf("blinds" to arrayOf(mapOf( - "sb" to 0.5, - "bb" to 1.0, - "code" to null - ))) + val filter = QueryType.BLINDS + val blind = FilterElementRow.Blind(0.5, 1.0, null) + blind.filterSectionRow = FilterSectionRow.BLINDS + val filterElement = FilterElement(filterElementRows = arrayListOf(blind)) + filter.updateValueMap(filterElement) val sessions = Filter.queryOn( realm, @@ -84,12 +83,12 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = FilterType.BLINDS - filter.valueMap = mapOf("blinds" to arrayOf(mapOf( - "sb" to null, - "bb" to 1.0, - "code" to null - ))) + val filter = QueryType.BLINDS + val blind = FilterElementRow.Blind(null, 1.0, null) + blind.filterSectionRow = FilterSectionRow.BLINDS + + val filterElement = FilterElement(filterElementRows = arrayListOf(blind)) + filter.updateValueMap(filterElement) val sessions = Filter.queryOn( realm, @@ -131,12 +130,12 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = FilterType.BLINDS - filter.valueMap = mapOf("blinds" to arrayOf(mapOf( - "sb" to 1.0, - "bb" to 2.0, - "code" to "AUD" - ))) + val filter = QueryType.BLINDS + val blind = FilterElementRow.Blind(1.0, 2.0, "AUD") + blind.filterSectionRow = FilterSectionRow.BLINDS + + val filterElement = FilterElement(filterElementRows = arrayListOf(blind)) + filter.updateValueMap(filterElement) val sessions = Filter.queryOn( realm, @@ -178,18 +177,14 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = FilterType.BLINDS - filter.valueMap = mapOf("blinds" to arrayOf( - mapOf( - "sb" to 1.0, - "bb" to 2.0, - "code" to null - ), - mapOf( - "sb" to 0.5, - "bb" to 1.0, - "code" to null - ))) + val filter = QueryType.BLINDS + val blind1 = FilterElementRow.Blind(1.0, 2.0, null) + blind1.filterSectionRow = FilterSectionRow.BLINDS + + val blind2 = FilterElementRow.Blind(0.5, 1.0, null) + blind2.filterSectionRow = FilterSectionRow.BLINDS + val filterElement = FilterElement(filterElementRows = arrayListOf(blind1, blind2)) + filter.updateValueMap(filterElement) val sessions = Filter.queryOn( realm, diff --git a/app/src/androidTest/java/net/pokeranalytics/android/filter/DateFilterInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/filter/DateFilterInstrumentedUnitTest.kt index ca6f2f21..3f506258 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/filter/DateFilterInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/DateFilterInstrumentedUnitTest.kt @@ -1,9 +1,13 @@ package net.pokeranalytics.android.filter import androidx.test.ext.junit.runners.AndroidJUnit4 -import net.pokeranalytics.android.model.filter.FilterType +import io.realm.RealmList +import net.pokeranalytics.android.model.filter.QueryType import net.pokeranalytics.android.model.realm.Filter +import net.pokeranalytics.android.model.realm.FilterElement import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow import org.junit.Assert import org.junit.Test import org.junit.runner.RunWith @@ -25,9 +29,13 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(100.0, true, cal.time) realm.commitTransaction() - val filter = FilterType.DAY_OF_WEEK + val filter = QueryType.DAY_OF_WEEK cal.time = s1.startDate - filter.valueMap = mapOf("dayOfWeek" to cal.get(Calendar.DAY_OF_WEEK)) + + val filterElementRow = FilterElementRow.Day(cal.get(Calendar.DAY_OF_WEEK)) + filterElementRow.filterSectionRow = FilterSectionRow.DYNAMIC_DATE + val filterElement = FilterElement(filterElementRow) + filter.updateValueMap(filterElement) val sessions = Filter.queryOn( realm, @@ -54,9 +62,13 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(100.0, true, cal.time) realm.commitTransaction() - val filter = FilterType.MONTH + val filter = QueryType.MONTH cal.time = s1.startDate - filter.valueMap = mapOf("month" to cal.get(Calendar.MONTH)) + + val filterElementRow = FilterElementRow.Month(cal.get(Calendar.MONTH)) + filterElementRow.filterSectionRow = FilterSectionRow.DYNAMIC_DATE + val filterElement = FilterElement(filterElementRow) + filter.updateValueMap(filterElement) val sessions = Filter.queryOn( realm, @@ -83,9 +95,12 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(100.0, true, cal.time) realm.commitTransaction() - val filter = FilterType.YEAR + val filter = QueryType.YEAR cal.time = s1.startDate - filter.valueMap = mapOf("year" to cal.get(Calendar.YEAR)) + val filterElementRow = FilterElementRow.Year(cal.get(Calendar.YEAR)) + filterElementRow.filterSectionRow = FilterSectionRow.DYNAMIC_DATE + val filterElement = FilterElement(filterElementRow) + filter.updateValueMap(filterElement) val sessions = Filter.queryOn( realm, @@ -116,7 +131,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val sessions = Filter.queryOn( realm, Session, - arrayListOf(FilterType.WEEK_END) + arrayListOf(QueryType.WEEK_END) ) Assert.assertEquals(1, sessions.size) @@ -141,7 +156,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val sessions = Filter.queryOn( realm, Session, - arrayListOf(FilterType.WEEK_DAY) + arrayListOf(QueryType.WEEK_DAY) ) Assert.assertEquals(1, sessions.size) @@ -165,8 +180,11 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val s2 = Session.testInstance(100.0, true, cal.time, 1) realm.commitTransaction() - val filter = FilterType.STARTED_FROM_DATE - filter.valueMap = mapOf("date" to s2.startDate) + val filter = QueryType.STARTED_FROM_DATE + val filterElementRow = FilterElementRow.From(s2.startDate!!) + filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE + filter.updateValueMap(FilterElement(filterElementRow)) + val sessions = Filter.queryOn( realm, @@ -195,8 +213,10 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = FilterType.STARTED_TO_DATE - filter.valueMap = mapOf("date" to s1.startDate) + val filter = QueryType.STARTED_TO_DATE + val filterElementRow = FilterElementRow.From(s1.startDate!!) + filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE + filter.updateValueMap(FilterElement(filterElementRow)) val sessions = Filter.queryOn( realm, @@ -226,8 +246,10 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = FilterType.ENDED_FROM_DATE - filter.valueMap = mapOf("date" to s2.endDate) + val filter = QueryType.ENDED_FROM_DATE + val filterElementRow = FilterElementRow.From(s2.endDate()) + filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE + filter.updateValueMap(FilterElement(filterElementRow)) val sessions = Filter.queryOn( realm, @@ -257,8 +279,11 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = FilterType.ENDED_TO_DATE - filter.valueMap = mapOf("date" to s1.endDate) + val filter = QueryType.ENDED_TO_DATE + val filterElementRow = FilterElementRow.From(s1.endDate()) + filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE + filter.updateValueMap(FilterElement(filterElementRow)) + val sessions = Filter.queryOn( realm, diff --git a/app/src/androidTest/java/net/pokeranalytics/android/filter/ExceptionFilterInstrumentedTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/filter/ExceptionFilterInstrumentedTest.kt index 1e9aeeea..b484a920 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/filter/ExceptionFilterInstrumentedTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/ExceptionFilterInstrumentedTest.kt @@ -1,10 +1,14 @@ package net.pokeranalytics.android.filter import androidx.test.ext.junit.runners.AndroidJUnit4 +import io.realm.RealmList import net.pokeranalytics.android.exceptions.FilterValueMapException -import net.pokeranalytics.android.model.filter.FilterType +import net.pokeranalytics.android.model.filter.QueryType import net.pokeranalytics.android.model.realm.Filter +import net.pokeranalytics.android.model.realm.FilterElement import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow import org.junit.Test import org.junit.runner.RunWith import java.util.* @@ -14,8 +18,9 @@ class ExceptionFilterInstrumentedTest: BaseFilterInstrumentedUnitTest() { @Test(expected = FilterValueMapException::class) fun testValueKeyFilterException() { - val filter = FilterType.STARTED_FROM_DATE - filter.valueMap = mapOf("bob" to Date()) + val filter = QueryType.STARTED_FROM_DATE + val filterElement = FilterElement() + filter.updateValueMap(filterElement) val realm = this.mockRealm Filter.queryOn( @@ -26,29 +31,14 @@ class ExceptionFilterInstrumentedTest: BaseFilterInstrumentedUnitTest() { } @Test(expected = FilterValueMapException::class) - fun testSubValueKeyFilterException() { - val filter = FilterType.BLINDS - filter.valueMap = mapOf("map" to arrayOf(mapOf( - "bob" to 0.5, - "bb" to 1.0, - "code" to null - ))) - + fun testFilterException() { val realm = this.mockRealm + val filter = QueryType.BLINDS + filter.updateValueMap(FilterElement()) Filter.queryOn( realm, Session, arrayListOf(filter) ) } - - @Test(expected = FilterValueMapException::class) - fun testXFilterException() { - val realm = this.mockRealm - Filter.queryOn( - realm, - Session, - arrayListOf(FilterType.BLINDS) - ) - } } \ No newline at end of file diff --git a/app/src/androidTest/java/net/pokeranalytics/android/filter/RealmFilterInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/filter/RealmFilterInstrumentedUnitTest.kt index 712cc6ad..107433a3 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/filter/RealmFilterInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/RealmFilterInstrumentedUnitTest.kt @@ -1,7 +1,7 @@ package net.pokeranalytics.android.filter import androidx.test.ext.junit.runners.AndroidJUnit4 -import net.pokeranalytics.android.model.filter.FilterType +import net.pokeranalytics.android.model.filter.QueryType import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow @@ -25,7 +25,7 @@ class RealmFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filterElement = FilterElementRow.Cash filterElement.filterSectionRow = FilterSectionRow.CASH_TOURNAMENT - filter.componentsFrom(arrayListOf(filterElement)) + filter.createOrUpdateFilterElements(arrayListOf(filterElement)) val useCount = filter.countBy(FilterCategoryRow.GENERAL) Assert.assertEquals(1, useCount) @@ -33,10 +33,10 @@ class RealmFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val isCash = filter.contains(filterElement) Assert.assertEquals(true, isCash) - val filterComponent = filter.components.first() + val filterComponent = filter.filterElements.first() filterComponent?.let { - Assert.assertEquals(FilterType.CASH, FilterType.valueOf(it.filterName)) + Assert.assertEquals(QueryType.CASH, QueryType.valueOf(it.filterName)) } ?: run { Assert.fail() } diff --git a/app/src/androidTest/java/net/pokeranalytics/android/filter/SessionFilterInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/filter/SessionFilterInstrumentedUnitTest.kt index 86513d6f..0c125b6c 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/filter/SessionFilterInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/SessionFilterInstrumentedUnitTest.kt @@ -2,8 +2,11 @@ package net.pokeranalytics.android.filter import androidx.test.ext.junit.runners.AndroidJUnit4 import io.realm.RealmList -import net.pokeranalytics.android.model.filter.FilterType +import net.pokeranalytics.android.model.TableSize +import net.pokeranalytics.android.model.filter.QueryType import net.pokeranalytics.android.model.realm.* +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow import org.junit.Assert import org.junit.Test import org.junit.runner.RunWith @@ -25,7 +28,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val sessions = Filter.queryOn( realm, Session, - arrayListOf(FilterType.CASH) + arrayListOf(QueryType.CASH) ) Assert.assertEquals(1, sessions.size) @@ -47,7 +50,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val sessions = Filter.queryOn( realm, Session, - arrayListOf(FilterType.TOURNAMENT) + arrayListOf(QueryType.TOURNAMENT) ) Assert.assertEquals(1, sessions.size) @@ -74,7 +77,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val sessions = Filter.queryOn( realm, Session, - arrayListOf(FilterType.LIVE) + arrayListOf(QueryType.LIVE) ) Assert.assertEquals(1, sessions.size) @@ -100,7 +103,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val sessions = Filter.queryOn( realm, Session, - arrayListOf(FilterType.ONLINE) + arrayListOf(QueryType.ONLINE) ) Assert.assertEquals(1, sessions.size) @@ -121,8 +124,10 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(bankroll = b2) realm.commitTransaction() - val filter = FilterType.BANKROLL - filter.valueMap = mapOf("ids" to arrayOf(b1.id)) + val filter = QueryType.BANKROLL + val filterElementRow = FilterElementRow.Bankroll(b1) + filterElementRow.filterSectionRow = FilterSectionRow.BANKROLL + filter.updateValueMap(FilterElement(filterElementRows = arrayListOf(filterElementRow))) val sessions = Filter.queryOn( realm, @@ -154,8 +159,13 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(bankroll = b3) realm.commitTransaction() - val filter = FilterType.BANKROLL - filter.valueMap = mapOf("ids" to arrayOf(b1.id, b2.id)) + val filter = QueryType.BANKROLL + val filterElementRow = FilterElementRow.Bankroll(b1) + filterElementRow.filterSectionRow = FilterSectionRow.BANKROLL + + val filterElementRow2 = FilterElementRow.Bankroll(b2) + filterElementRow2.filterSectionRow = FilterSectionRow.BANKROLL + filter.updateValueMap(FilterElement(filterElementRows = arrayListOf(filterElementRow, filterElementRow2))) val sessions = Filter.queryOn( realm, @@ -182,8 +192,10 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(game = g2) realm.commitTransaction() - val filter = FilterType.GAME - filter.valueMap = mapOf("ids" to arrayOf(g2.id)) + val filter = QueryType.GAME + val filterElementRow = FilterElementRow.Game(g2) + filterElementRow.filterSectionRow = FilterSectionRow.GAME + filter.updateValueMap(FilterElement(filterElementRows = arrayListOf(filterElementRow))) val sessions = Filter.queryOn( realm, @@ -215,8 +227,13 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(game = g3) realm.commitTransaction() - val filter = FilterType.GAME - filter.valueMap = mapOf("ids" to arrayOf(g2.id, g3.id)) + val filter = QueryType.GAME + + val filterElementRow = FilterElementRow.Game(g2) + filterElementRow.filterSectionRow = FilterSectionRow.GAME + val filterElementRow2 = FilterElementRow.Game(g3) + filterElementRow2.filterSectionRow = FilterSectionRow.GAME + filter.updateValueMap(FilterElement(filterElementRows = arrayListOf(filterElementRow, filterElementRow2))) val sessions = Filter.queryOn( realm, @@ -243,8 +260,10 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(location = l2) realm.commitTransaction() - val filter = FilterType.LOCATION - filter.valueMap = mapOf("ids" to arrayOf(l1.id)) + val filter = QueryType.LOCATION + val filterElementRow = FilterElementRow.Location(l1) + filterElementRow.filterSectionRow = FilterSectionRow.LOCATION + filter.updateValueMap(FilterElement(filterElementRows = arrayListOf(filterElementRow))) val sessions = Filter.queryOn( realm, @@ -276,8 +295,14 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(location = l3) realm.commitTransaction() - val filter = FilterType.LOCATION - filter.valueMap = mapOf("ids" to arrayOf(l1.id, l3.id)) + val filter = QueryType.LOCATION + + val filterElementRow = FilterElementRow.Location(l1) + filterElementRow.filterSectionRow = FilterSectionRow.LOCATION + val filterElementRow2 = FilterElementRow.Location(l3) + filterElementRow2.filterSectionRow = FilterSectionRow.LOCATION + + filter.updateValueMap(FilterElement(filterElementRows = arrayListOf(filterElementRow, filterElementRow2))) val sessions = Filter.queryOn( realm, @@ -304,8 +329,11 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tournamentName = t2) realm.commitTransaction() - val filter = FilterType.TOURNAMENT_NAME - filter.valueMap = mapOf("ids" to arrayOf(t1.id)) + val filter = QueryType.TOURNAMENT_NAME + + val filterElementRow = FilterElementRow.TournamentName(t1) + filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_NAME + filter.updateValueMap(FilterElement(filterElementRows = arrayListOf(filterElementRow))) val sessions = Filter.queryOn( realm, @@ -337,8 +365,12 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tournamentName = t3) realm.commitTransaction() - val filter = FilterType.TOURNAMENT_NAME - filter.valueMap = mapOf("ids" to arrayOf(t1.id, t2.id)) + val filter = QueryType.TOURNAMENT_NAME + val filterElementRow = FilterElementRow.TournamentName(t1) + filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_NAME + val filterElementRow2 = FilterElementRow.TournamentName(t2) + filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_NAME + filter.updateValueMap(FilterElement(filterElementRows = arrayListOf(filterElementRow, filterElementRow2))) val sessions = Filter.queryOn( realm, @@ -373,8 +405,14 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tournamentFeatures = RealmList(t1)) realm.commitTransaction() - val filter = FilterType.ALL_TOURNAMENT_FEATURES - filter.valueMap = mapOf("ids" to arrayOf(t1.id, t2.id, t3.id, t4.id)) + val filter = QueryType.ALL_TOURNAMENT_FEATURES + val filterElementRow = FilterElementRow.AllTournamentFeature(t1) + filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE + val filterElementRow2 = FilterElementRow.AllTournamentFeature(t2) + filterElementRow2.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE + val filterElementRow3 = FilterElementRow.AllTournamentFeature(t4) + filterElementRow3.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE + filter.updateValueMap(FilterElement(filterElementRows = arrayListOf(filterElementRow, filterElementRow2, filterElementRow3))) val sessions = Filter.queryOn( realm, @@ -406,8 +444,16 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tournamentFeatures = RealmList(t1)) realm.commitTransaction() - val filter = FilterType.ANY_TOURNAMENT_FEATURES - filter.valueMap = mapOf("ids" to arrayOf(t1.id, t2.id, t3.id, t4.id)) + val filter = QueryType.ANY_TOURNAMENT_FEATURES + val filterElementRow = FilterElementRow.AnyTournamentFeature(t1) + filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE + val filterElementRow2 = FilterElementRow.AnyTournamentFeature(t2) + filterElementRow2.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE + val filterElementRow3 = FilterElementRow.AnyTournamentFeature(t3) + filterElementRow3.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE + val filterElementRow4 = FilterElementRow.AnyTournamentFeature(t4) + filterElementRow4.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE + filter.updateValueMap(FilterElement(filterElementRows = arrayListOf(filterElementRow, filterElementRow2, filterElementRow3, filterElementRow4))) val sessions = Filter.queryOn( realm, @@ -436,8 +482,10 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tournamentFeatures = RealmList(t1)) realm.commitTransaction() - val filter = FilterType.ANY_TOURNAMENT_FEATURES - filter.valueMap = mapOf("ids" to arrayOf(t2.id)) + val filter = QueryType.ANY_TOURNAMENT_FEATURES + val filterElementRow = FilterElementRow.AnyTournamentFeature(t2) + filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE + filter.updateValueMap(FilterElement(filterElementRows = arrayListOf(filterElementRow))) val sessions = Filter.queryOn( realm, @@ -463,8 +511,12 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tableSize = 10) realm.commitTransaction() - val filter = FilterType.TABLE_SIZE - filter.valueMap = mapOf("values" to arrayOf(2,4)) + val filter = QueryType.TABLE_SIZE + val filterElementRow = FilterElementRow.TableSize(TableSize(2)) + filterElementRow.filterSectionRow = FilterSectionRow.TABLE_SIZE + val filterElementRow2 = FilterElementRow.TableSize(TableSize(4)) + filterElementRow.filterSectionRow = FilterSectionRow.TABLE_SIZE + filter.updateValueMap(FilterElement(filterElementRows = arrayListOf(filterElementRow, filterElementRow2))) val sessions = Filter.queryOn( realm, @@ -490,8 +542,10 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val s2 = Session.testInstance(netResult = 570.0) realm.commitTransaction() - val filter = FilterType.MORE_THAN_NET_RESULT - filter.valueMap = mapOf("value" to 204.0) + val filter = QueryType.MORE_THAN_NET_RESULT + val filterElementRow = FilterElementRow.ResultMoreThan(204.0) + filterElementRow.filterSectionRow = FilterSectionRow.VALUE + filter.updateValueMap(FilterElement(filterElementRow)) val sessions = Filter.queryOn( realm, @@ -517,8 +571,10 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(netResult = 570.0) realm.commitTransaction() - val filter = FilterType.LESS_THAN_NET_RESULT - filter.valueMap = mapOf("value" to 540.0) + val filter = QueryType.LESS_THAN_NET_RESULT + val filterElementRow = FilterElementRow.ResultLessThan(540.0) + filterElementRow.filterSectionRow = FilterSectionRow.VALUE + filter.updateValueMap(FilterElement(filterElementRow)) val sessions = Filter.queryOn( realm, @@ -544,11 +600,15 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(netResult = 570.0) realm.commitTransaction() - val filterMore = FilterType.MORE_THAN_NET_RESULT - filterMore.valueMap = mapOf("value" to 200.0) + val filterMore = QueryType.MORE_THAN_NET_RESULT + val filterElementRow = FilterElementRow.ResultMoreThan(200.0) + filterElementRow.filterSectionRow = FilterSectionRow.VALUE + filterMore.updateValueMap(FilterElement(filterElementRow)) - val filterLess = FilterType.LESS_THAN_NET_RESULT - filterLess.valueMap = mapOf("value" to 400.0) + val filterLess = QueryType.LESS_THAN_NET_RESULT + val filterElementRow2 = FilterElementRow.ResultLessThan(400.0) + filterElementRow2.filterSectionRow = FilterSectionRow.VALUE + filterLess.updateValueMap(FilterElement(filterElementRow2)) val sessions = Filter.queryOn( realm, diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index b8173952..f657b5d3 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -28,7 +28,7 @@ class Calculator { } /** - * The type of evolution values + * The type of evolution numericValues */ enum class EvolutionValues { NONE, @@ -82,7 +82,7 @@ class Calculator { results.computeStatVariations(comparedResults) } - results.finalize(options) // later treatment, such as evolution values sorting + results.finalize(options) // later treatment, such as evolution numericValues sorting computedResults.add(results) val e = Date() diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/ComputableGroup.kt b/app/src/main/java/net/pokeranalytics/android/calculus/ComputableGroup.kt index 211af750..d0653c92 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/ComputableGroup.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/ComputableGroup.kt @@ -51,7 +51,7 @@ class ComputedResults(group: ComputableGroup) { // The computed stats of the sessionGroup private var _computedStats: MutableMap = mutableMapOf() - // The map containing all evolution values for all stats + // The map containing all evolution numericValues for all stats private var _evolutionValues: MutableMap> = mutableMapOf() fun allStats() : Collection { diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt index 41e15ef2..e3f557c9 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -35,7 +35,7 @@ enum class Stat : RowRepresentable { HANDS_PLAYED; /** - * Returns whether the stat evolution values requires a distribution sorting + * Returns whether the stat evolution numericValues requires a distribution sorting */ fun hasDistributionSorting() : Boolean { return when (this) { @@ -129,7 +129,7 @@ class ComputedStat(var stat: Stat, var value: Double, var currency: Currency? = val color = if (this.value >= this.stat.threshold) R.color.green else R.color.red return TextFormat(numberFormat.format(this.value), color) } - // Red/green values + // Red/green numericValues Stat.HOURLY_RATE_BB, Stat.AVERAGE_NET_BB, Stat.NET_BB_PER_100_HANDS -> { val color = if (this.value >= this.stat.threshold) R.color.green else R.color.red return TextFormat(this.value.formatted(), color) diff --git a/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt b/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt index deefbc3c..5a4ae6cf 100644 --- a/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt +++ b/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt @@ -13,5 +13,7 @@ class RowRepresentableEditDescriptorException(message: String) : Exception(messa } class FilterValueMapException(message: String) : Exception(message) { - + init { + println("FilterValueMapException(): $message") + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/FilterEntityDataSource.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt similarity index 73% rename from app/src/main/java/net/pokeranalytics/android/model/filter/FilterEntityDataSource.kt rename to app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt index ce8e0a2a..8d19eb7e 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/FilterEntityDataSource.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt @@ -21,21 +21,29 @@ import io.realm.RealmObject * - multiple field filters should be handled as 'AND' * - multiple '=' filters as 'OR' * - multiple 'Greater than', 'less than' as 'AND' - * - multiple values as 'OR' + * - multiple numericValues as 'OR' * * Also: * A filter should be able to be converted into a Realm query * */ -interface FilterEntityDataSource { + +/** + * Interface to set at companion object level of a realm object to provide the entity and the fieldName (eg: parameter's path) + */ +interface Filterable { + val relatedEntity: Class - fun fieldNameForQueryType(filterType: FilterType) : String? + /** + * return the path of the parameter used in the [QueryType] related to this entity + */ + fun fieldNameForQueryType(queryType: QueryType) : String? } // -//fun MutableList.filter(filter: FilterComponent) : List { +//fun MutableList.filter(filter: FilterElement) : List { // // return this.filter { f -> // return@filter true diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/FilterType.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryType.kt similarity index 73% rename from app/src/main/java/net/pokeranalytics/android/model/filter/FilterType.kt rename to app/src/main/java/net/pokeranalytics/android/model/filter/QueryType.kt index f7e8bdf4..34641b73 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/FilterType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryType.kt @@ -1,39 +1,22 @@ package net.pokeranalytics.android.model.filter +import io.realm.RealmList import io.realm.RealmObject import io.realm.RealmQuery import net.pokeranalytics.android.exceptions.FilterValueMapException -import net.pokeranalytics.android.model.realm.FilterComponent +import net.pokeranalytics.android.model.realm.FilterElementBlind +import net.pokeranalytics.android.model.realm.FilterElement import net.pokeranalytics.android.model.realm.Session import java.util.* + /** - * We want to be able to store filters in the database: - * - filters can be a combination of sub filters - * - filters can be applied to different type of objects: Sessions, Hands, Transactions... - * - filters can be applied to a list of different type of objects (feed) - * - * A filter is described by the following: - * - a data type: Session, Hands... - * - a field: table size of a Session - * - an operator: equal, >=, <... - * - a value: an id, a number, a date... - * - * We can decide to have a collection of [operator, value] for a field - * - * Combination: - * - multiple datatype filters should be handled as 'OR' - * - multiple field filters should be handled as 'AND' - * - multiple '=' filters as 'OR' - * - multiple 'Greater than', 'less than' as 'AND' - * - multiple values as 'OR' - * - * Also: - * A filter should be able to be converted into a Realm query - * + * Enum describing the way a query should be handled + * Some queries requires a value to be checked upon through equals, in, more, less, between + * To handle that, the enum has a public [valueMap] variable + * A new type should also set the expected numericValues required in the [filterValuesExpectedKeys] */ - -enum class FilterType(private var subType:SubType? = null) { +enum class QueryType(private var subType:SubType? = null) { LIVE, CASH, ONLINE, @@ -100,7 +83,7 @@ enum class FilterType(private var subType:SubType? = null) { } } return when (this) { - BANKROLL, GAME, LOCATION, ANY_TOURNAMENT_FEATURES, ALL_TOURNAMENT_FEATURES -> arrayOf("ids") + BANKROLL, GAME, LOCATION, ANY_TOURNAMENT_FEATURES, ALL_TOURNAMENT_FEATURES, TOURNAMENT_NAME -> arrayOf("ids") LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> arrayOf("values") BLINDS -> arrayOf("blinds") STARTED_FROM_DATE, STARTED_TO_DATE, ENDED_FROM_DATE, ENDED_TO_DATE -> arrayOf("date") @@ -111,43 +94,37 @@ enum class FilterType(private var subType:SubType? = null) { } } - fun filter(realmQuery: RealmQuery, filterEntityDataSource: FilterEntityDataSource): RealmQuery { + /** + * 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] + */ + fun filter(realmQuery: RealmQuery, filterable: Filterable): RealmQuery { when { this == BLINDS -> { - val smallBlindFieldName = filterEntityDataSource.fieldNameForQueryType(SMALL_BLIND) - val bigBlindFieldName = filterEntityDataSource.fieldNameForQueryType(BIG_BLIND) - val currencyCodeFieldName = filterEntityDataSource.fieldNameForQueryType(CURRENCY_CODE) + val smallBlindFieldName = filterable.fieldNameForQueryType(SMALL_BLIND) + val bigBlindFieldName = filterable.fieldNameForQueryType(BIG_BLIND) + val currencyCodeFieldName = filterable.fieldNameForQueryType(CURRENCY_CODE) smallBlindFieldName ?: throw FilterValueMapException("fieldName is missing") bigBlindFieldName ?: throw FilterValueMapException("fieldName is missing") currencyCodeFieldName ?: throw FilterValueMapException("fieldName is missing") - val blinds: Array> by valueMap - val expectedSubKeys = arrayOf("sb", "bb", "code") - blinds.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 - + val blinds: RealmList by valueMap + blinds.forEachIndexed {index, blind -> realmQuery .beginGroup() - sb?.let { + blind.sb?.let { realmQuery - .equalTo(smallBlindFieldName, sb) + .equalTo(smallBlindFieldName, it) .and() } realmQuery - .equalTo(bigBlindFieldName, bb) + .equalTo(bigBlindFieldName, blind.bb) .and() - code?.let { - realmQuery.equalTo(currencyCodeFieldName, code) + blind.code?.let { + realmQuery.equalTo(currencyCodeFieldName, it) } ?: run { realmQuery.isNull(currencyCodeFieldName) } @@ -160,11 +137,11 @@ enum class FilterType(private var subType:SubType? = null) { } return realmQuery } - this == ONLINE -> return LIVE.filter(realmQuery.not(), filterEntityDataSource) - this == TOURNAMENT -> return CASH.filter(realmQuery.not(), filterEntityDataSource) - this == WEEK_DAY -> return WEEK_END.filter(realmQuery.not(), filterEntityDataSource) + this == ONLINE -> return LIVE.filter(realmQuery.not(), filterable) + this == TOURNAMENT -> return CASH.filter(realmQuery.not(), filterable) + this == WEEK_DAY -> return WEEK_END.filter(realmQuery.not(), filterable) else -> { - val fieldName = filterEntityDataSource.fieldNameForQueryType(this) + val fieldName = filterable.fieldNameForQueryType(this) fieldName ?: throw FilterValueMapException("fieldName is missing") this.subType?.let { subType -> @@ -247,7 +224,7 @@ enum class FilterType(private var subType:SubType? = null) { } - fun setValueFrom(filterComponent: FilterComponent) { + fun updateValueMap(filterElement: FilterElement) { if (filterValuesExpectedKeys == null) { return } @@ -255,38 +232,39 @@ enum class FilterType(private var subType:SubType? = null) { this.subType?.let { subType -> valueMap = when (subType) { SubType.LESS, SubType.MORE -> { - mapOf("value" to filterComponent.value) + mapOf("value" to filterElement.value) } SubType.BETWEEN -> { mapOf( - "leftValue" to filterComponent.leftValue, - "rightValue" to filterComponent.rightValue + "leftValue" to filterElement.leftValue, + "rightValue" to filterElement.rightValue ) } } + return } when (this) { ALL_TOURNAMENT_FEATURES, ANY_TOURNAMENT_FEATURES, BANKROLL, GAME, LOCATION, TOURNAMENT_NAME -> { - valueMap = mapOf("ids" to filterComponent.ids) + valueMap = mapOf("ids" to filterElement.ids) } LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> { - valueMap = mapOf("values" to filterComponent.values) + valueMap = mapOf("values" to filterElement.values) } BLINDS -> { - valueMap = mapOf("blinds" to filterComponent.blinds) + valueMap = mapOf("blinds" to filterElement.blinds) } STARTED_FROM_DATE, STARTED_TO_DATE, ENDED_FROM_DATE, ENDED_TO_DATE -> { - valueMap = mapOf("date" to filterComponent.date) + valueMap = mapOf("date" to filterElement.date) } DAY_OF_WEEK -> { - valueMap = mapOf("dayOfWeek" to filterComponent.dayOfWeek) + valueMap = mapOf("dayOfWeek" to filterElement.dayOfWeek) } MONTH -> { - valueMap = mapOf("month" to filterComponent.month) + valueMap = mapOf("month" to filterElement.month) } YEAR -> { - valueMap = mapOf("year" to filterComponent.year) + valueMap = mapOf("year" to filterElement.year) } else -> { throw FilterValueMapException("filter type not handled") @@ -308,5 +286,7 @@ enum class FilterType(private var subType:SubType? = null) { } return field } + private set + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/interfaces/TimeFilterable.kt b/app/src/main/java/net/pokeranalytics/android/model/interfaces/TimeFilterable.kt similarity index 69% rename from app/src/main/java/net/pokeranalytics/android/model/filter/interfaces/TimeFilterable.kt rename to app/src/main/java/net/pokeranalytics/android/model/interfaces/TimeFilterable.kt index f4713e4b..a83cc2e1 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/interfaces/TimeFilterable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/interfaces/TimeFilterable.kt @@ -1,7 +1,10 @@ -package net.pokeranalytics.android.model.filter.interfaces +package net.pokeranalytics.android.model.interfaces import java.util.* +/** + * Interface to let an object be filtered through specific time parameters + */ interface TimeFilterable { var dayOfWeek : Int? @@ -9,6 +12,9 @@ interface TimeFilterable { var month : Int? var year : Int? + /** + * Call this method whenever the date of the object is modified + */ fun updateTimeParameter(startDate: Date?) { startDate?.let { val cal = Calendar.getInstance() diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt index 4567c982..37481aaf 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt @@ -2,17 +2,24 @@ package net.pokeranalytics.android.model.realm import io.realm.* import io.realm.annotations.PrimaryKey -import net.pokeranalytics.android.model.filter.FilterEntityDataSource -import net.pokeranalytics.android.model.filter.FilterType +import net.pokeranalytics.android.model.filter.Filterable +import net.pokeranalytics.android.model.filter.QueryType import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow +import org.jetbrains.annotations.TestOnly import java.util.* +/** + * A [Filter] is the top level representation of the filtering system + * It contains a list of [FilterElement] describing the complete query to launch + * The [Filter] is working closely with a [Filterable] interface providing the entity we want the query being launched on + */ open class Filter : RealmObject() { companion object { - fun queryOn(realm: Realm, entity: FilterEntityDataSource, queries:List): RealmResults<*> { + @TestOnly + fun queryOn(realm: Realm, entity: Filterable, queries:List): RealmResults<*> { var realmQuery : RealmQuery = realm.where(entity.relatedEntity) queries.forEach { realmQuery = (it.filter(realmQuery, entity)) @@ -31,11 +38,11 @@ open class Filter : RealmObject() { // for MutableRealmInteger, see https://realm.io/docs/java/latest/#counters val usageCount: MutableRealmInteger = MutableRealmInteger.valueOf(0) - var components: RealmList = RealmList() + var filterElements: RealmList = RealmList() private set - fun componentsFrom(filterElementRows: ArrayList) { - components.clear() + fun createOrUpdateFilterElements(filterElementRows: ArrayList) { + filterElements.clear() filterElementRows .map { it.filterSectionRow @@ -47,26 +54,28 @@ open class Filter : RealmObject() { it.filterSectionRow == section } .apply { + if (this.size == 1) { - components.add(FilterComponent(this.first())) + filterElements.add(FilterElement(this.first())) } else { val casted = arrayListOf() casted.addAll(this) - components.add(FilterComponent(casted)) + filterElements.add(FilterElement(casted)) } + } } } fun countBy(filterCategoryRow: FilterCategoryRow) : Int { val sections = filterCategoryRow.filterSectionRows - return components.count { + return filterElements.count { sections.contains(FilterSectionRow.valueOf(it.sectionName)) } } fun contains(filterElementRow:FilterElementRow) : Boolean { - val filtered = components.filter { + val filtered = filterElements.filter { it.filterName == filterElementRow.filterName } if (filtered.isEmpty()) { @@ -75,10 +84,10 @@ open class Filter : RealmObject() { return filterElementRow.contains(filtered) } - fun queryOn(entity: FilterEntityDataSource) : RealmResults<*> { + fun queryOn(entity: Filterable) : RealmResults<*> { var realmQuery : RealmQuery = realm.where(entity.relatedEntity) - this.components.map { - it.filterType + this.filterElements.map { + it.queryType }.forEach { realmQuery = (it.filter(realmQuery, entity)) } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt deleted file mode 100644 index 4330ba9e..00000000 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt +++ /dev/null @@ -1,81 +0,0 @@ -package net.pokeranalytics.android.model.realm - -import io.realm.RealmList -import io.realm.RealmObject -import io.realm.annotations.Ignore -import net.pokeranalytics.android.model.filter.FilterType -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow.* -import java.util.* -import kotlin.collections.ArrayList - -open class FilterComponent(var filterName : String = "", var sectionName: String = "") : RealmObject() { - - constructor(filterElementRows: ArrayList) : this(filterElementRows.first().filterName, filterElementRows.first().filterSectionRow.name) { - this.ids = when (FilterType.valueOf(this.filterName)) { - FilterType.GAME -> { - RealmList().apply { - this.addAll(filterElementRows.map { - (it as FilterElementRow.Game).game.id - }) - } - } - else -> null - } - - this.values = when (FilterType.valueOf(filterName)) { - FilterType.LIMIT -> { - RealmList().apply { - this.addAll(filterElementRows.map { - (it as FilterElementRow.Limit).limit.ordinal - }) - } - } - else -> null - } - } - - constructor(filterElementRow:FilterElementRow) : this(filterElementRow.filterName, filterElementRow.filterSectionRow.name) { - when (filterElementRow) { - is From -> date = filterElementRow.date - is To -> date = filterElementRow.date - } - } - - val filterType : FilterType - get() = FilterType.valueOf(filterName) - .apply { - this.setValueFrom(this@FilterComponent) - } - - var date : Date? = null - var values : RealmList? = null - var ids : RealmList? = null - - @Ignore - val value : Double? = null - - @Ignore - val leftValue : Double? = null - - @Ignore - val rightValue : Double? = null - - @Ignore - val blinds : Array>? = null - - @Ignore - val dayOfWeek : Int? = null - - @Ignore - val month : Int? = null - - @Ignore - val year : Int? = null -} - -open class BlindFilterComponent : RealmObject() { - var sb : Double? = null - var bb : Double? = null - var code : String? = null -} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterElement.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterElement.kt new file mode 100644 index 00000000..be590588 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterElement.kt @@ -0,0 +1,144 @@ +package net.pokeranalytics.android.model.realm + +import io.realm.RealmList +import io.realm.RealmObject +import net.pokeranalytics.android.exceptions.FilterValueMapException +import net.pokeranalytics.android.model.filter.QueryType +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow.* +import java.util.* +import kotlin.collections.ArrayList + +open class FilterElement(var filterName : String = "", var sectionName: String = "") : RealmObject() { + + constructor(filterElementRows: ArrayList) : this(filterElementRows.first().filterName, filterElementRows.first().filterSectionRow.name) { + this.stringValues = when (QueryType.valueOf(this.filterName)) { + QueryType.GAME, QueryType.BANKROLL, QueryType.TOURNAMENT_NAME, QueryType.ALL_TOURNAMENT_FEATURES, QueryType.ANY_TOURNAMENT_FEATURES, QueryType.LOCATION -> { + RealmList().apply { + this.addAll(filterElementRows.map { + (it as DataFilterElementRow).id + }) + } + } + else -> null + } + + this.numericValues = when (QueryType.valueOf(filterName)) { + QueryType.LIMIT -> { + RealmList().apply { + this.addAll(filterElementRows.map { + (it as FilterElementRow.Limit).limit.ordinal.toDouble() + }) + } + } + QueryType.TABLE_SIZE -> { + RealmList().apply { + this.addAll(filterElementRows.map { + (it as FilterElementRow.TableSize).tableSize.numberOfPlayer.toDouble() + }) + } + } + QueryType.YEAR, QueryType.MONTH, QueryType.DAY_OF_WEEK -> { + RealmList().apply { + this.addAll(filterElementRows.map { + (it as SingleValueFilterElementRow).value.toDouble() + }) + } + } + QueryType.LESS_THAN_NET_RESULT -> { + RealmList().apply { + this.addAll(filterElementRows.map { + (it as ResultLessThan).value + }) + } + } + QueryType.MORE_THAN_NET_RESULT -> { + RealmList().apply { + this.addAll(filterElementRows.map { + (it as ResultMoreThan).value + }) + } + } + else -> null + } + + this.blindValues = when (QueryType.valueOf(filterName)) { + QueryType.BLINDS -> { + RealmList().apply { + this.addAll(filterElementRows.map { + FilterElementBlind((it as FilterElementRow.Blind).sb, it.bb, it.code) + }) + } + } + else -> null + } + } + + constructor(filterElementRow:FilterElementRow) : this(arrayListOf(filterElementRow)) { + when (filterElementRow) { + is From -> dateValue = filterElementRow.date + is To -> dateValue= filterElementRow.date + } + } + + val queryType : QueryType + get() = QueryType.valueOf(filterName) + .apply { + this.updateValueMap(this@FilterElement) + } + + private var numericValues: RealmList? = null + private var dateValue : Date? = null + private var stringValues : RealmList? = null + private var blindValues : RealmList? = null + + val ids : Array + get() = stringValues?.toTypedArray()?: throw FilterValueMapException("filter type not handled") + + val blinds : RealmList + get() { + blindValues?.let { + if (it.isNotEmpty()) { + return it + } else { + throw FilterValueMapException("filter is empty or null") + } + } + throw FilterValueMapException("filter is empty or null") + } + + + val date : Date + get() = dateValue?: throw FilterValueMapException("filter type not handled") + + + val values : Array + get() = numericValues?.map { + it.toInt() + }?.toTypedArray()?: throw FilterValueMapException("filter type not handled") + + + val value : Double + get() = numericValues?.first()?: throw FilterValueMapException("filter type not handled") + + + val leftValue : Double + get() = numericValues?.first()?: throw FilterValueMapException("filter type not handled") + + + val rightValue : Double + get() = numericValues?.last()?: throw FilterValueMapException("filter type not handled") + + + val dayOfWeek : Int + get() = numericValues?.first()?.toInt()?: throw FilterValueMapException("filter type not handled") + + + val month : Int + get() = numericValues?.first()?.toInt()?: throw FilterValueMapException("filter type not handled") + + + val year : Int + get() = numericValues?.first()?.toInt()?: throw FilterValueMapException("filter type not handled") + +} diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterElementBlind.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterElementBlind.kt new file mode 100644 index 00000000..fb615cbb --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterElementBlind.kt @@ -0,0 +1,8 @@ +package net.pokeranalytics.android.model.realm + +import io.realm.RealmObject + +open class FilterElementBlind(var sb : Double? = null, + var bb : Double? = null, + var code : String? = null +) : RealmObject() \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index 2d403971..b70e7c67 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -20,10 +20,10 @@ import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.extensions.SessionState import net.pokeranalytics.android.model.extensions.getState -import net.pokeranalytics.android.model.filter.FilterEntityDataSource -import net.pokeranalytics.android.model.filter.FilterType -import net.pokeranalytics.android.model.filter.FilterType.* -import net.pokeranalytics.android.model.filter.interfaces.TimeFilterable +import net.pokeranalytics.android.model.filter.Filterable +import net.pokeranalytics.android.model.filter.QueryType +import net.pokeranalytics.android.model.filter.QueryType.* +import net.pokeranalytics.android.model.interfaces.TimeFilterable import net.pokeranalytics.android.model.interfaces.Manageable import net.pokeranalytics.android.model.interfaces.Timed import net.pokeranalytics.android.model.utils.SessionSetManager @@ -43,14 +43,14 @@ import java.util.Currency import kotlin.collections.ArrayList open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable, Timed, - TimeFilterable { + TimeFilterable { enum class Type { CASH_GAME, TOURNAMENT } - companion object : FilterEntityDataSource { + companion object : Filterable { fun newInstance(realm: Realm, isTournament: Boolean, bankroll: Bankroll? = null): Session { val session = Session() session.result = Result() @@ -65,8 +65,8 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource override val relatedEntity: Class = Session::class.java - override fun fieldNameForQueryType(filterType: FilterType): String? { - return when (filterType) { + override fun fieldNameForQueryType(queryType: QueryType): String? { + return when (queryType) { LIVE -> "bankroll.live" CASH -> "type" BANKROLL -> "bankroll.id" diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt index e313e0cd..ca6b308e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt @@ -102,7 +102,7 @@ class UnmanagedRowRepresentableException(message: String) : Exception(message) { * - string * - booleans * - actionIcon - * to display the appropriate values in graphical components, such as labels, textfields, switchs... + * to display the appropriate numericValues in graphical filterElements, such as labels, textfields, switchs... */ interface DisplayableDataSource { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt index c41b27d9..1542a281 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt @@ -199,7 +199,7 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta /* this.dataType = dataType - this.liveDataType = LiveData.values()[dataType] + this.liveDataType = LiveData.numericValues()[dataType] this.primaryKey = primaryKey */ } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt index ca2c818e..866bb937 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt @@ -29,7 +29,7 @@ interface DefaultEditable : Editable, Localizable { } /** - * An interface used so that enums values can be represented visually + * An interface used so that enums numericValues can be represented visually * as rows in RecyclerViews */ interface Displayable : Localizable { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt index 35cecdf6..7a899662 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt @@ -2,8 +2,9 @@ package net.pokeranalytics.android.ui.view.rowrepresentable import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.FilterValueMapException -import net.pokeranalytics.android.model.filter.FilterType -import net.pokeranalytics.android.model.realm.FilterComponent +import net.pokeranalytics.android.model.filter.QueryType +import net.pokeranalytics.android.model.interfaces.Manageable +import net.pokeranalytics.android.model.realm.FilterElement import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType @@ -24,76 +25,78 @@ sealed class FilterElementRow : RowRepresentable { object Weekday: FilterElementRow() object Weekend : FilterElementRow() + open class DataFilterElementRow(data:Manageable) : FilterElementRow() { + val id : String = data.id + val name : String = (data as RowRepresentable).getDisplayName() + } + + open class SingleValueFilterElementRow(val value:Int) : FilterElementRow() + + data class Blind(var sb: Double? = null, var bb: Double? = null, var code: String? = null) : FilterElementRow() data class From(var date: Date = Date()) : FilterElementRow() data class To(var date: Date = Date()) : FilterElementRow() - data class Year(val day: Int) : FilterElementRow() - data class Month(val day: Int) : FilterElementRow() - data class Day(val day: Int) : FilterElementRow() + data class Year(val year: Int) : SingleValueFilterElementRow(year) + data class Month(val month: Int) : SingleValueFilterElementRow(month) + data class Day(val day: Int) : SingleValueFilterElementRow(day) data class PastDays(var lastDays : Int = 0) : FilterElementRow() data class Limit(val limit : net.pokeranalytics.android.model.Limit) : FilterElementRow() data class TableSize(val tableSize : net.pokeranalytics.android.model.TableSize) : FilterElementRow() - data class Bankroll(val bankroll: net.pokeranalytics.android.model.realm.Bankroll) : FilterElementRow() - data class Game(val game: net.pokeranalytics.android.model.realm.Game) : FilterElementRow() - data class Location(val location: net.pokeranalytics.android.model.realm.Location) : FilterElementRow() - data class TournamentName(val tournamentName: net.pokeranalytics.android.model.realm.TournamentName) : FilterElementRow() - data class TournamentFeature(val tournamentFeature: net.pokeranalytics.android.model.realm.TournamentFeature) : FilterElementRow() + 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) + data class ResultMoreThan(var value:Double) : FilterElementRow() + data class ResultLessThan(var value:Double) : FilterElementRow() lateinit var filterSectionRow: FilterSectionRow - val filterName : String = this.filterType.name + val filterName : String = this.queryType.name - private val filterType : FilterType + private val queryType : QueryType get() { return when (this) { - is Cash -> FilterType.CASH - is Tournament -> FilterType.TOURNAMENT -/* is Today -> FilterType. + is Cash -> QueryType.CASH + is Tournament -> QueryType.TOURNAMENT + is Blind -> QueryType.BLINDS + is From -> QueryType.STARTED_FROM_DATE + is To -> QueryType.ENDED_TO_DATE + is Month -> QueryType.MONTH + is Day -> QueryType.DAY_OF_WEEK + is Year -> QueryType.YEAR + is Live -> QueryType.LIVE + is Online -> QueryType.ONLINE + is Weekday -> QueryType.WEEK_DAY + is Weekend-> QueryType.WEEK_END + +/* is Today -> QueryType. 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 -> R.string.from - is To -> 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 Year-> R.string.year - is Month-> R.string.month_of_the_year - is Day -> R.string.day_of_the_week is PastDays -> R.string.period_in_days is Limit -> R.string.limit - is TableSize -> R.string.table_size - is Bankroll -> R.string.bankroll - */ - is Game -> FilterType.GAME - /* - is Location -> R.string.location - is TournamentName -> R.string.tournament_name - is TournamentFeature -> R.string.tournament_feature */ - else -> throw FilterValueMapException("no filter type for filter element") //TODO create exception + is TableSize -> QueryType.TABLE_SIZE + is Game -> QueryType.GAME + is Bankroll -> QueryType.BANKROLL + is Location -> QueryType.LOCATION + is TournamentName -> QueryType.TOURNAMENT_NAME + is AnyTournamentFeature -> QueryType.ANY_TOURNAMENT_FEATURES + is AllTournamentFeature -> QueryType.ALL_TOURNAMENT_FEATURES + is ResultMoreThan -> QueryType.MORE_THAN_NET_RESULT + is ResultLessThan -> QueryType.LESS_THAN_NET_RESULT + else -> throw FilterValueMapException("no filter type for $this") //TODO create exception } } - fun contains(filterComponents: List) : Boolean { + fun contains(filterElements: List) : Boolean { return when (this) { - is Game -> filterComponents.any { - it.ids?.contains(this.game.id) ?: false + is DataFilterElementRow -> filterElements.any { + it.ids.contains(this.id) } - is From -> TODO() - is To -> TODO() - is Year -> TODO() - is Month -> TODO() - is Day -> TODO() - is PastDays -> TODO() - is Limit -> TODO() - is TableSize -> TODO() - is Bankroll -> TODO() - is Location -> TODO() - is TournamentName -> TODO() - is TournamentFeature -> TODO() else -> return true } } @@ -122,17 +125,16 @@ sealed class FilterElementRow : RowRepresentable { is PastDays -> R.string.period_in_days is Limit -> R.string.limit is TableSize -> R.string.table_size - is Bankroll -> R.string.bankroll - is Game -> R.string.game - is Location -> R.string.location - is TournamentName -> R.string.tournament_name - is TournamentFeature -> R.string.tournament_feature + is Blind -> TODO() + is ResultMoreThan -> TODO() + is ResultLessThan -> TODO() + else -> null } } override fun getDisplayName(): String { return when (this) { - is Game -> game.getDisplayName() + is DataFilterElementRow -> this.name else -> return super.getDisplayName() } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt index 1696bdac..084c5676 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt @@ -24,6 +24,8 @@ enum class FilterSectionRow(override val resId: Int?): RowRepresentable { BLINDS(net.pokeranalytics.android.R.string.blinds), CASH_RE_BUY_COUNT(net.pokeranalytics.android.R.string.cash_game), TOURNAMENT_TYPE(net.pokeranalytics.android.R.string.tournament_types), + TOURNAMENT_NAME(net.pokeranalytics.android.R.string.tournament_name), + TOURNAMENT_FEATURE(net.pokeranalytics.android.R.string.tournament_feature), COMPLETION_PERCENTAGE(net.pokeranalytics.android.R.string.tournament_completion_percentage_interval), PLACE(net.pokeranalytics.android.R.string.final_position), PLAYERS_COUNT(net.pokeranalytics.android.R.string.players_count), @@ -67,7 +69,8 @@ enum class FilterSectionRow(override val resId: Int?): RowRepresentable { } tableSizes } - + TOURNAMENT_NAME -> arrayListOf() + TOURNAMENT_FEATURE -> arrayListOf() DYNAMIC_DATE -> arrayListOf( Today, Yesterday, @@ -175,7 +178,7 @@ enum class FilterSectionRow(override val resId: Int?): RowRepresentable { val games = realm.copyFromRealm(LiveData.GAME.items(realm) as RealmResults) rows.addAll(games) } - LIMIT_TYPE -> rows.addAll(Limit.values()) + LIMIT_TYPE -> rows.addAll(Limit.numericValues()) TABLE_SIZE -> { val sessions = realm.where().sort("tableSize").distinct("tableSize").findAll() for (session in sessions) { From cc6a17ef5706123b18de154f2e1a98582b30bec7 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Mon, 25 Mar 2019 09:28:47 +0100 Subject: [PATCH 11/11] fix crash with key buyin in session edit descriptors --- .../android/ui/view/rowrepresentable/SessionRow.kt | 4 ++-- .../pokeranalytics/android/util/extensions/DateExtension.kt | 2 +- .../android/util/extensions/NumbersExtension.kt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt index c3aca78c..92c431a6 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt @@ -160,7 +160,7 @@ enum class SessionRow : RowRepresentable { BUY_IN -> { val bb: Double? by map val fee: Double? by map - val buyin: Double? by map + val ratedBuyin: Double? by map val data = arrayListOf() if (bb != null) { data.add(RowRepresentableEditDescriptor(100.0 * (bb?: 0.0))) @@ -173,7 +173,7 @@ enum class SessionRow : RowRepresentable { data.add(RowRepresentableEditDescriptor(0)) } - data.add(RowRepresentableEditDescriptor(buyin)) + data.add(RowRepresentableEditDescriptor(ratedBuyin)) data.add( RowRepresentableEditDescriptor( "", diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt b/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt index d24c1712..6ef27c60 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt @@ -91,7 +91,7 @@ fun Date.getFormattedDuration(toDate: Date) : String { val hours = (difference / (1000 * 60 * 60)) val minutes = (difference / (1000 * 60)) % 60 - val hoursStr = if (hours < 10) "0$hours" else "$hours" + val hoursStr = "$hours" val minutesStr = if (minutes < 10) "0$minutes" else "$minutes" return "$hoursStr:$minutesStr" diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/NumbersExtension.kt b/app/src/main/java/net/pokeranalytics/android/util/extensions/NumbersExtension.kt index d98df6b0..77287988 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/extensions/NumbersExtension.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/extensions/NumbersExtension.kt @@ -41,7 +41,7 @@ fun Long.toMinutes() : String { val hours = totalMinutes / 60 val minutesLeft = totalMinutes % 60 var duration = "" - duration += if (hours < 10) "0$hours" else hours.toString() + duration += hours.toString() duration += ":" duration += if (minutesLeft < 10) "0$minutesLeft" else minutesLeft.toString() return duration