From ef9b00e1496259220b25a3f77a005e924b84161a Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Mon, 8 Apr 2019 09:48:11 +0200 Subject: [PATCH] remove filterable relatedEntity and add a new filter variable to handle the entity --- .../filter/RealmFilterInstrumentedUnitTest.kt | 2 +- .../android/exceptions/Exceptions.kt | 2 + .../android/model/filter/Filterable.kt | 5 +- .../android/model/realm/Filter.kt | 46 +++++++++++++++++-- .../android/model/realm/Session.kt | 2 - 5 files changed, 47 insertions(+), 10 deletions(-) diff --git a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/RealmFilterInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/RealmFilterInstrumentedUnitTest.kt index ac9cc2fe..f46e7765 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/RealmFilterInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/RealmFilterInstrumentedUnitTest.kt @@ -21,7 +21,7 @@ class RealmFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val realm = this.mockRealm realm.beginTransaction() - val filter = Filter() + val filter = Filter(entity = Session) filter.name = "testSaveLoadCashFilter" val filterElement = FilterElementRow.Cash 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 a7242b27..4b572cb1 100644 --- a/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt +++ b/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt @@ -18,6 +18,8 @@ class FilterValueMapException(message: String) : Exception(message) { } } +class FilterMissingEntityException(message: String) : Exception(message) +class FilterUnhandledEntityException(message : String) : Exception(message) class ConfigurationException(message: String) : Exception(message) { } diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt index 8d19eb7e..3625acca 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt @@ -30,12 +30,9 @@ import io.realm.RealmObject /** - * Interface to set at companion object level of a realm object to provide the entity and the fieldName (eg: parameter's path) + * Companion-level Interface to indicate an RealmObject class can be filtered and to provide all the fieldNames (eg: parameter's path) needed to be query on. */ interface Filterable { - - val relatedEntity: Class - /** * return the path of the parameter used in the [QueryType] related to this entity */ 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 37481aaf..15ad066e 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,6 +2,8 @@ package net.pokeranalytics.android.model.realm import io.realm.* import io.realm.annotations.PrimaryKey +import net.pokeranalytics.android.exceptions.FilterMissingEntityException +import net.pokeranalytics.android.exceptions.FilterUnhandledEntityException import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.QueryType import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow @@ -15,12 +17,49 @@ import java.util.* * 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() { +open class Filter() : RealmObject() { + + constructor(entity:Filterable) : this() { + this.entityType = FilterableClass.filterableClass(entity = entity).ordinal + } + + private var entityType : Int? = null + private val filterableClass : FilterableClass? + get() { + entityType?.let { + return FilterableClass.values()[it] + } + return null + } + + private enum class FilterableClass { + SESSION, + ; + + companion object { + fun filterableClass(entity: Filterable): FilterableClass { + return when (entity) { + is Session.Companion -> SESSION + else -> throw FilterUnhandledEntityException("this entity is not filterable") + } + } + } + + val relatedEntity: Class < out RealmObject > + get() { + return when (this) { + SESSION -> Session::class.java + else -> throw FilterUnhandledEntityException("this entity is not filterable") + } + } + + + } companion object { @TestOnly fun queryOn(realm: Realm, entity: Filterable, queries:List): RealmResults<*> { - var realmQuery : RealmQuery = realm.where(entity.relatedEntity) + var realmQuery : RealmQuery = realm.where(FilterableClass.filterableClass(entity).relatedEntity) queries.forEach { realmQuery = (it.filter(realmQuery, entity)) } @@ -85,7 +124,8 @@ open class Filter : RealmObject() { } fun queryOn(entity: Filterable) : RealmResults<*> { - var realmQuery : RealmQuery = realm.where(entity.relatedEntity) + val realmEntity : Class < out RealmObject > = filterableClass?.relatedEntity ?: throw FilterMissingEntityException("this filter has no entity initialized") + var realmQuery : RealmQuery = realm.where(realmEntity) this.filterElements.map { it.queryType }.forEach { 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 bf104448..a878d185 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 @@ -61,8 +61,6 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat return realm.copyToRealm(session) } - override val relatedEntity: Class = Session::class.java - override fun fieldNameForQueryType(queryType: QueryType): String? { return when (queryType) { LIVE -> "bankroll.live"