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 35c6b3c7..d2ba8a39 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/filter/SessionFilterInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/filter/SessionFilterInstrumentedUnitTest.kt @@ -1,6 +1,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.realm.* @@ -354,4 +355,103 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Assert.assertTrue(result.contains((it as Session).tournamentName?.id)) } } + + @Test + fun testAllTournamentFeatureFilter() { + val realm = this.mockRealm + realm.beginTransaction() + val t1 = realm.createObject(TournamentFeature::class.java, "1") + val t2 = realm.createObject(TournamentFeature::class.java, "2") + val t3 = realm.createObject(TournamentFeature::class.java, "3") + val t4 = realm.createObject(TournamentFeature::class.java, "4") + Session.testInstance(tournamentFeatures = RealmList(t1,t2)) + Session.testInstance(tournamentFeatures = RealmList(t2,t3)) + Session.testInstance(tournamentFeatures = RealmList(t3,t4)) + val s = Session.testInstance(tournamentFeatures = RealmList(t1,t2,t3,t4)) + Session.testInstance(tournamentFeatures = RealmList(t1,t4)) + Session.testInstance(tournamentFeatures = RealmList(t1,t3)) + Session.testInstance(tournamentFeatures = RealmList(t2,t4, t3)) + Session.testInstance(tournamentFeatures = RealmList(t1)) + realm.commitTransaction() + + val filter = SessionFilterable.ALL_TOURNAMENT_FEATURES + filter.valueMap = mapOf("ids" to arrayOf(t1.id, t2.id, t3.id, t4.id)) + + val sessions = FilterManager().filter( + realm, + Session::class.java, + arrayListOf(filter) + ) + + Assert.assertEquals(1, sessions.size) + (sessions[0] as Session)?.run { + Assert.assertEquals(s.id, this.id) + } + } + + @Test + fun testAnyTournamentFeatureFilter() { + val realm = this.mockRealm + realm.beginTransaction() + val t1 = realm.createObject(TournamentFeature::class.java, "1") + val t2 = realm.createObject(TournamentFeature::class.java, "2") + val t3 = realm.createObject(TournamentFeature::class.java, "3") + val t4 = realm.createObject(TournamentFeature::class.java, "4") + Session.testInstance(tournamentFeatures = RealmList(t1,t2)) + Session.testInstance(tournamentFeatures = RealmList(t2,t3)) + Session.testInstance(tournamentFeatures = RealmList(t3,t4)) + Session.testInstance(tournamentFeatures = RealmList(t1,t2,t3,t4)) + Session.testInstance(tournamentFeatures = RealmList(t1,t4)) + Session.testInstance(tournamentFeatures = RealmList(t1,t3)) + Session.testInstance(tournamentFeatures = RealmList(t2,t4, t3)) + Session.testInstance(tournamentFeatures = RealmList(t1)) + realm.commitTransaction() + + val filter = SessionFilterable.ANY_TOURNAMENT_FEATURES + filter.valueMap = mapOf("ids" to arrayOf(t1.id, t2.id, t3.id, t4.id)) + + val sessions = FilterManager().filter( + realm, + Session::class.java, + arrayListOf(filter) + ) + + Assert.assertEquals(8, sessions.size) + } + + @Test + fun testSingleAnyTournamentFeatureFilter() { + val realm = this.mockRealm + realm.beginTransaction() + val t1 = realm.createObject(TournamentFeature::class.java, "1") + val t2 = realm.createObject(TournamentFeature::class.java, "2") + val t3 = realm.createObject(TournamentFeature::class.java, "3") + val t4 = realm.createObject(TournamentFeature::class.java, "4") + val s1 = Session.testInstance(tournamentFeatures = RealmList(t1,t2)) + val s2 = Session.testInstance(tournamentFeatures = RealmList(t2,t3)) + Session.testInstance(tournamentFeatures = RealmList(t3,t4)) + val s3 = Session.testInstance(tournamentFeatures = RealmList(t1,t2,t3,t4)) + Session.testInstance(tournamentFeatures = RealmList(t1,t4)) + Session.testInstance(tournamentFeatures = RealmList(t1,t3)) + val s4 = Session.testInstance(tournamentFeatures = RealmList(t2,t4, t3)) + Session.testInstance(tournamentFeatures = RealmList(t1)) + realm.commitTransaction() + + val filter = SessionFilterable.ANY_TOURNAMENT_FEATURES + filter.valueMap = mapOf("ids" to arrayOf(t2.id)) + + val sessions = FilterManager().filter( + realm, + Session::class.java, + arrayListOf(filter) + ) + + val result = arrayListOf(s1.id, s2.id, s3.id, s4.id) + + Assert.assertEquals(4, sessions.size) + sessions.forEach { + Assert.assertTrue(result.contains((it as Session).id)) + } + + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/SessionFilterable.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/SessionFilterable.kt index 96deb0a0..37886323 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/SessionFilterable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/SessionFilterable.kt @@ -14,8 +14,8 @@ enum class SessionFilterable(private var fieldName:String? = null): Filterable { BANKROLL("bankroll.id"), GAME("game.id"), TOURNAMENT_NAME("tournamentName.id"), - ANY_TOURNAMENT_FEATURES("tournamentFeature.id"), - ALL_TOURNAMENT_FEATURES("tournamentFeature.id"), + ANY_TOURNAMENT_FEATURES, + ALL_TOURNAMENT_FEATURES, LOCATION("location.id"), LIMIT("limit"), TABLE_SIZE("tableSize"), @@ -32,6 +32,7 @@ enum class SessionFilterable(private var fieldName:String? = null): Filterable { BIG_BLIND("cgBigBlind"), SMALL_BLIND("cgSmallBlind"), COMMENT("comment"), + TOURNAMENT_FEATURES("tournamentFeatures.id"), TOURNAMENT_NUMBER_OF_PLAYER("tournamentNumberOfPlayers"), TOURNAMENT_ENTRY_FEE("tournamentEntryFee"), RESULT_BUY_IN("result.buyin"), @@ -61,24 +62,16 @@ enum class SessionFilterable(private var fieldName:String? = null): Filterable { TOURNAMENT -> CASH.filter(realmQuery.not()) ALL_TOURNAMENT_FEATURES -> { val ids : Array by filterValues - this.fieldName?.let {fieldName -> - ids.forEachIndexed { index, id -> - if (index == 0) { - realmQuery.beginGroup() - } - realmQuery.`in`(fieldName, arrayOf(id)) - if (index == ids.size - 1) { - realmQuery.endGroup() - } else { - realmQuery.and() - } - } - realmQuery - } ?: run { - throw FilterValueMapException("fieldName is missing") + 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, ANY_TOURNAMENT_FEATURES, TOURNAMENT_NAME -> { + BANKROLL, GAME, LOCATION, TOURNAMENT_NAME -> { val ids : Array by filterValues this.fieldName?.let { realmQuery.`in`(it, ids)